Bug 11998 fixed: listvar_in_hdf5 did not close the hdf5 file. 60/9460/1
Calixte DENIZET [Wed, 17 Oct 2012 15:10:30 +0000 (17:10 +0200)]
Change-Id: I4c4e5e18de6f2ab5952702a075dac61344e77d65

scilab/CHANGES_5.4.X
scilab/modules/hdf5/includes/h5_readDataFromFile.h
scilab/modules/hdf5/includes/h5_readDataFromFile_v1.h
scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_listvar_in_hdf5.cpp
scilab/modules/hdf5/src/c/h5_fileManagement.c
scilab/modules/hdf5/src/c/h5_readDataFromFile.c
scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
scilab/modules/hdf5/src/cpp/listvar_in_hdf5_v1.cpp

index d14378a..6fdad1c 100644 (file)
@@ -22,7 +22,9 @@ Xcos
 
 * Bug #11919 fixed - DLSS block with empty matrix as parameters made Scilab crash.
 
-* Bug #11963 fixed - input port in superblock was corrupted
+* Bug #11963 fixed - input port in superblock was corrupted.
+
+* Bug #11998 fixed - listvar_in_hdf5 did not close the hdf5 file.
 
 
 Bug fixes
index 73acaf8..dd6b943 100644 (file)
@@ -31,6 +31,7 @@ HDF5_SCILAB_IMPEXP int getVariableNames(int _iFile, char **pstNameList);
 HDF5_SCILAB_IMPEXP int getDataSetId(int  _iFile);
 
 HDF5_SCILAB_IMPEXP int getDataSetIdFromName(int _iFile, char *_pstName);
+HDF5_SCILAB_IMPEXP void closeDataSet(int _id);
 
 HDF5_SCILAB_IMPEXP int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims);
 HDF5_SCILAB_IMPEXP int getDatasetDims(int _iDatasetId, int *_piRows, int *_piCols);
index 02b88b6..2d6069f 100644 (file)
@@ -28,6 +28,7 @@ HDF5_SCILAB_IMPEXP int getVariableNames_v1(int _iFile, char **pstNameList);
 HDF5_SCILAB_IMPEXP int getDataSetId_v1(int  _iFile);
 
 HDF5_SCILAB_IMPEXP int getDataSetIdFromName_v1(int _iFile, char *_pstName);
+HDF5_SCILAB_IMPEXP void closeDataSet_v1(int _id);
 
 HDF5_SCILAB_IMPEXP int getDatasetDims_v1(int _iDatasetId, int *_piRows, int *_piCols);
 HDF5_SCILAB_IMPEXP int getListDims_v1(int _iDatasetId, int *_piItem);
index 748a26f..29a7272 100644 (file)
@@ -140,7 +140,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
     {
         int iVersion = getSODFormatAttribute(iH5File);
         if (iVersion != -1 && iVersion != SOD_FILE_VERSION)
-        {//to update version must be the same
+        {
+            //to update version must be the same
+            closeHDF5File(iH5File);
             Scierror(999, _("%s: Wrong SOD file format version. Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
             return 1;
         }
@@ -165,7 +167,7 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
 
                     if (strcmp(pstVarNameList[i], pstNameList[j]) == 0)
                     {
-
+                        closeHDF5File(iH5File);
                         Scierror(999, _("%s: Variable \'%s\' already exists in file \'%s\'."), fname, pstVarNameList[i], pstNameList[0]);
                         return 1;
                     }
@@ -196,12 +198,14 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         //add or update scilab version and file version in hdf5 file
         if (updateScilabVersion(iH5File) < 0)
         {
+            closeHDF5File(iH5File);
             Scierror(999, _("%s: Unable to update Scilab version in \"%s\"."), fname, pstNameList[0]);
             return 1;
         }
 
         if (updateFileVersion(iH5File) < 0)
         {
+            closeHDF5File(iH5File);
             Scierror(999, _("%s: Unable to update HDF5 format version in \"%s\"."), fname, pstNameList[0]);
             return 1;
         }
@@ -264,88 +268,88 @@ static bool export_data(int _iH5File, int* _piVar, char* _pstName)
     switch (iType)
     {
         case sci_matrix :
-            {
-                bReturn = export_double(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_double(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_poly :
-            {
-                bReturn = export_poly(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_poly(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_boolean :
-            {
-                bReturn = export_boolean(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_boolean(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_sparse :
-            {
-                bReturn = export_sparse(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_sparse(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_boolean_sparse :
-            {
-                bReturn = export_boolean_sparse(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_boolean_sparse(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_matlab_sparse :
-            {
-                bReturn = export_matlab_sparse(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_matlab_sparse(_piVar, _pstName);
+            break;
+        }
         case sci_ints :
-            {
-                bReturn = export_ints(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_ints(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_handles :
-            {
-                bReturn = export_handles(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_handles(_piVar, _pstName);
+            break;
+        }
         case sci_strings :
-            {
-                bReturn = export_strings(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_strings(_iH5File, _piVar, _pstName);
+            break;
+        }
         case sci_u_function :
-            {
-                bReturn = export_u_function(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_u_function(_piVar, _pstName);
+            break;
+        }
         case sci_c_function :
-            {
-                bReturn = export_c_function(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_c_function(_piVar, _pstName);
+            break;
+        }
         case sci_lib :
-            {
-                bReturn = export_lib(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_lib(_piVar, _pstName);
+            break;
+        }
         case sci_list :
         case sci_tlist :
         case sci_mlist :
-            {
-                bReturn = export_list(_iH5File, _piVar, _pstName, iType);
-                break;
-            }
+        {
+            bReturn = export_list(_iH5File, _piVar, _pstName, iType);
+            break;
+        }
         case sci_lufact_pointer :
-            {
-                bReturn = export_lufact_pointer(_piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_lufact_pointer(_piVar, _pstName);
+            break;
+        }
         case 0 : //void case to "null" items in list
-            {
-                bReturn = export_void(_iH5File, _piVar, _pstName);
-                break;
-            }
+        {
+            bReturn = export_void(_iH5File, _piVar, _pstName);
+            break;
+        }
 
         default :
-            {
-                bReturn = false;
-                break;
-            }
+        {
+            bReturn = false;
+            break;
+        }
     }
     return bReturn;
 }
@@ -418,7 +422,9 @@ static bool export_list(int _iH5File, int *_piVar, char* _pstName, int _iVarType
         iRet = addItemInList(_iH5File, pvList, i, pstPathName);
         FREE(pstPathName);
         if (bReturn == false || iRet)
+        {
             return false;
+        }
     }
     iLevel--;
     closeList(_iH5File, pvList, _pstName, iItemNumber, _iVarType);
index 3759b4d..365f90d 100644 (file)
@@ -96,16 +96,19 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
 
     //manage version information
     int iVersion = getSODFormatAttribute(iFile);
-    if(iVersion != SOD_FILE_VERSION)
+    if (iVersion != SOD_FILE_VERSION)
     {
         if (iVersion > SOD_FILE_VERSION)
-        {//can't read file with version newer that me !
+        {
+            //can't read file with version newer that me !
+            closeHDF5File(iFile);
             Scierror(999, _("%s: Wrong SOD file format version. Max Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
             return 1;
         }
         else
-        {//call older import functions and exit or ... EXIT !
-            if(iVersion == 1 || iVersion == -1)
+        {
+            //call older import functions and exit or ... EXIT !
+            if (iVersion == 1 || iVersion == -1)
             {
                 //sciprint("old sci_listvar_in_hdf5_v1\n");
                 return sci_listvar_in_hdf5_v1(fname, fname_len);
@@ -118,6 +121,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
     {
         char** pstVarNameList = (char**)MALLOC(sizeof(char*) * iNbItem);
         pInfo = (VarInfo*)MALLOC(iNbItem * sizeof(VarInfo));
+        int b;
 
         if (Lhs == 1)
         {
@@ -136,7 +140,9 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
 
             strcpy(pInfo[i].varName, pstVarNameList[i]);
             FREE(pstVarNameList[i]);
-            if (read_data(iDataSetId, 0, NULL, &pInfo[i]) == false)
+            b = read_data(iDataSetId, 0, NULL, &pInfo[i]) == false;
+            closeDataSet(iDataSetId);
+            if (b)
             {
                 break;
             }
@@ -160,6 +166,8 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
         return 0;
     }
 
+    closeHDF5File(iFile);
+
     //1st Lhs
     char** pstVarName = (char**)MALLOC(sizeof(char*) * iNbItem);
     for (int i = 0 ; i < iNbItem ; i++)
index cd7e942..e53d917 100644 (file)
@@ -2,7 +2,7 @@
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 *  Copyright (C) 2010 - DIGITEO - Allan CORNET
 *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
-*  
+*
 *  This file must be used under the terms of the CeCILL.
 *  This source file is licensed as described in the file COPYING, which
 *  you should have received as part of this distribution.  The terms
@@ -110,14 +110,17 @@ int openHDF5File(char *name, int _iAppendMode)
     /* Turn off error handling */
     H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
 
-    if(_iAppendMode == 0)
-    {//read only
+    if (_iAppendMode == 0)
+    {
+        //read only
         file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
     }
     else
-    {//read write to append
+    {
+        //read write to append
         file = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
     }
+
     /* The following test will display the backtrace in case of error */
     /* Deactivated because displayed each time we call 'load' to open a non-HDF5 file */
     /*if (file < 0)
@@ -185,6 +188,12 @@ void closeHDF5File(int file)
 {
     herr_t status                                      = 0;
 
+    /* printf("Open groups: %d\n", H5Fget_obj_count(file, H5F_OBJ_GROUP));
+    printf("Open datasets: %d\n", H5Fget_obj_count(file, H5F_OBJ_DATASET));
+    printf("Open datatypes: %d\n", H5Fget_obj_count(file, H5F_OBJ_DATATYPE));
+    printf("Open attributes: %d\n", H5Fget_obj_count(file, H5F_OBJ_ATTR));
+    printf("Open all (except the file itself): %d\n", H5Fget_obj_count(file, H5F_OBJ_ALL)  - 1);*/
+
     // H5Fflush(file, H5F_SCOPE_GLOBAL);
     status = H5Fclose(file);
     if (status < 0)
index 8dd4cbe..b17cfd1 100644 (file)
@@ -240,18 +240,18 @@ int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims)
     hid_t data_type;
     H5T_class_t data_class;
     hid_t space = H5Dget_space(_iDatasetId);
-    if(space < 0)
+    if (space < 0)
     {
         return -1;
     }
 
     data_type = H5Dget_type(_iDatasetId);
     data_class = H5Tget_class(data_type);
-    if(data_class == H5T_COMPOUND) 
+    if (data_class == H5T_COMPOUND)
     {
         *_iComplex = 1;
     }
-    else if(data_class == H5T_REFERENCE)
+    else if (data_class == H5T_REFERENCE)
     {
         *_iComplex = isComplexData(_iDatasetId);
     }
@@ -261,24 +261,25 @@ int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims)
     }
 
     *_iDims = H5Sget_simple_extent_ndims(space);
-    if(*_iDims < 0)
+    if (*_iDims < 0)
     {
         H5Sclose(space);
         return -1;
     }
 
-    if(_piDims != 0)
+    if (_piDims != 0)
     {
         int i = 0;
         hsize_t* dims = (hsize_t*)MALLOC(sizeof(hsize_t) * *_iDims);
-        if(H5Sget_simple_extent_dims(space, dims, NULL) < 0)
+        if (H5Sget_simple_extent_dims(space, dims, NULL) < 0)
         {
             return -1;
         }
 
         //reverse dimensions
-        for(i = 0 ; i < *_iDims ; i++)
-        {//reverse dimensions to improve rendering in external tools
+        for (i = 0 ; i < *_iDims ; i++)
+        {
+            //reverse dimensions to improve rendering in external tools
             _piDims[i] = (int)dims[*_iDims - 1 - i];
             iSize *= _piDims[i];
         }
@@ -397,6 +398,14 @@ int getDataSetIdFromName(int _iFile, char *_pstName)
     return H5Dopen(_iFile, _pstName);
 }
 
+void closeDataSet(int _id)
+{
+    if (_id > 0)
+    {
+        H5Dclose(_id);
+    }
+}
+
 int getDataSetId(int _iFile)
 {
     herr_t status = 0;
@@ -501,7 +510,7 @@ int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg
         return -1;
     }
 
-    
+
     vGetPointerFromDoubleComplex(pData, iSize, _pdblReal, _pdblImg);
     FREE(pData);
     status = H5Dclose(_iDatasetId);
@@ -624,7 +633,7 @@ int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int
     herr_t status;
     int iSize = 1;
 
-    for(i = 0 ; i < _iDims ; i++)
+    for (i = 0 ; i < _iDims ; i++)
     {
         iSize *= _piDims[i];
     }
@@ -948,7 +957,7 @@ int readBooleanSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbIte
         return -1;
     }
 
-    if(_iNbItem != 0)
+    if (_iNbItem != 0)
     {
         //read cols data
         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
index 804c1d8..1284370 100644 (file)
@@ -58,15 +58,15 @@ static herr_t op_func_v1(hid_t loc_id, const char *name, void *operator_data)
 
     switch (statbuf.type)
     {
-    case H5G_GROUP:
-        break;
-    case H5G_DATASET:
-        *pDataSetId = H5Dopen(loc_id, name);
-        break;
-    case H5G_TYPE:
-        break;
-    default:
-        break;
+        case H5G_GROUP:
+            break;
+        case H5G_DATASET:
+            *pDataSetId = H5Dopen(loc_id, name);
+            break;
+        case H5G_TYPE:
+            break;
+        default:
+            break;
     }
 
     return 0;
@@ -352,6 +352,14 @@ int getDataSetIdFromName_v1(int _iFile, char *_pstName)
     return H5Dopen(_iFile, _pstName);
 }
 
+void closeDataSet_v1(int _id)
+{
+    if (_id > 0)
+    {
+        H5Dclose(_id);
+    }
+}
+
 int getDataSetId_v1(int _iFile)
 {
     herr_t status = 0;
@@ -781,7 +789,7 @@ static int readPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblData)
 }
 
 int readCommonPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
-    double **_pdblImg)
+                            double **_pdblImg)
 {
     int i = 0;
     hid_t obj = 0;
@@ -1023,7 +1031,7 @@ int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsi
 }
 
 int readCommonSparseComplexMatrix_v1(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
-    double *_pdblReal, double *_pdblImg)
+                                     double *_pdblReal, double *_pdblImg)
 {
     hid_t obj = 0;
     hobj_ref_t pRef[3] = {0};
@@ -1080,7 +1088,7 @@ int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, i
 }
 
 int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
-    double *_pdblImg)
+                               double *_pdblImg)
 {
     return readCommonSparseComplexMatrix_v1(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
 }
index c12dfea..41aab27 100644 (file)
@@ -95,6 +95,7 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
     if (iNbItem != 0)
     {
         char** pstVarNameList = (char**)MALLOC(sizeof(char*) * iNbItem);
+        bool b;
         pInfo = (VarInfo_v1*)MALLOC(iNbItem * sizeof(VarInfo_v1));
 
         if (Lhs == 1)
@@ -114,7 +115,10 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
 
             strcpy(pInfo[i].varName, pstVarNameList[i]);
             FREE(pstVarNameList[i]);
-            if (read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false)
+            b = read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false;
+            closeDataSet_v1(iDataSetId);
+
+            if (b)
             {
                 break;
             }
@@ -138,6 +142,8 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
         return 0;
     }
 
+    closeHDF5File(iFile);
+
     //1st Lhs
     char** pstVarName = (char**)MALLOC(sizeof(char*) * iNbItem);
     for (int i = 0 ; i < iNbItem ; i++)