diff options
author | Jonathan Kim <jkm@hdfgroup.org> | 2011-03-21 23:02:31 (GMT) |
---|---|---|
committer | Jonathan Kim <jkm@hdfgroup.org> | 2011-03-21 23:02:31 (GMT) |
commit | f92d2371ffce9ec664833187cadb0223fa1dc1c2 (patch) | |
tree | 0de52b34d30672f563ece49177cc117d91127005 /tools/lib/h5tools.c | |
parent | 0fcb094698374a1c5eb218030d14ca3071c049ca (diff) | |
download | hdf5-f92d2371ffce9ec664833187cadb0223fa1dc1c2.zip hdf5-f92d2371ffce9ec664833187cadb0223fa1dc1c2.tar.gz hdf5-f92d2371ffce9ec664833187cadb0223fa1dc1c2.tar.bz2 |
[svn-r20285] Purpose:
Improve the previous fix for Bug 2216 - GMQS: h5diff - memory leak when
compares vlen string in dataset or attributes
Description:
Related to the previous checkin r20270 and r20266.
Improve h5tools_detect_vlen() code for better performance. H5Tdetect_class
already recusive on given type so don't need to be part of recusive call
again. Also improve error handlings in h5tools_detect_vlen and
h5tools_detect_vlen_str functions.
Also updated h5ls and h5dump code accordingly.
Tested:
jam (linux32-LE), amani (linux64-LE), heiwa (linuxppc64-BE), tejeda (mac32-LE), linew (solaris-BE), Cmake - jam
Diffstat (limited to 'tools/lib/h5tools.c')
-rw-r--r-- | tools/lib/h5tools.c | 115 |
1 files changed, 66 insertions, 49 deletions
diff --git a/tools/lib/h5tools.c b/tools/lib/h5tools.c index 84a164b..7389351 100644 --- a/tools/lib/h5tools.c +++ b/tools/lib/h5tools.c @@ -622,51 +622,42 @@ h5tools_ncols(const char *s) } /*------------------------------------------------------------------------- - * Function: h5tools_detect_vlen_data + * Function: h5tools_detect_vlen * * Purpose: Recursive check for any variable length data in given type. * - * Return: TRUE if type conatains any variable length data, else FALSE + * Return: + * TRUE : type conatains any variable length data + * FALSE : type doesn't contain any variable length data + * Negative value: error occur * * Programmer: Jonathan Kim March 18, 2011 - * - * Note: Adopted from h5tools_detect_vlen_str() which only check - * vlen-string data in type. *------------------------------------------------------------------------- */ htri_t -h5tools_detect_vlen_data(hid_t tid) +h5tools_detect_vlen(hid_t tid) { - int i = 0; - int n = 0; - htri_t has_vlen_str = FALSE; - H5T_class_t tclass = -1; + htri_t status; + htri_t ret = FALSE; + /* recursive detect any vlen data values in type (compound, array ...) */ + status = H5Tdetect_class(tid, H5T_VLEN); + if ( (status == TRUE) || (status < 0) ) + { + ret = status; + goto done; + } - /* detect any vlen data in type */ - if (H5Tdetect_class(tid, H5T_VLEN) == TRUE || /* VLEN-data */ - H5Tis_variable_str(tid) == TRUE) /* VLEN-string*/ - return TRUE; + /* recursive detect any vlen string in type (compound, array ...) */ + status = h5tools_detect_vlen_str(tid); + if ( (status == TRUE) || (status < 0) ) - tclass = H5Tget_class(tid); - if (tclass == H5T_ARRAY) { - hid_t btid = H5Tget_super(tid); - has_vlen_str = h5tools_detect_vlen_data(btid); - H5Tclose(btid); - return has_vlen_str; - } - else if (tclass == H5T_COMPOUND) { - n = H5Tget_nmembers(tid); - for (i = 0; i < n; i++) { - hid_t mtid = H5Tget_member_type(tid, i); - has_vlen_str = h5tools_detect_vlen_data(mtid); - if (has_vlen_str == TRUE) { - H5Tclose(mtid); - return TRUE; - } - H5Tclose(mtid); - } + { + ret = status; + goto done; } - return FALSE; + +done: + return ret; } @@ -675,7 +666,10 @@ h5tools_detect_vlen_data(hid_t tid) * * Purpose: Recursive check for variable length string of a datatype. * - * Return: TRUE if type conatains a variable string type, else FALSE + * Return: + * TRUE : type conatains any variable length string + * FALSE : type doesn't contain any variable length string + * Negative value: error occur * *------------------------------------------------------------------------- */ @@ -684,32 +678,55 @@ h5tools_detect_vlen_str(hid_t tid) { int i = 0; int n = 0; - htri_t has_vlen_str = FALSE; + htri_t ret = FALSE; H5T_class_t tclass = -1; + hid_t btid; + hid_t mtid; - if (H5Tis_variable_str(tid) == TRUE) - return TRUE; + ret = H5Tis_variable_str(tid); + if ( (ret == TRUE) || (ret < 0) ) + goto done; tclass = H5Tget_class(tid); - if (tclass == H5T_ARRAY) { - hid_t btid = H5Tget_super(tid); - has_vlen_str = h5tools_detect_vlen_str(btid); - H5Tclose(btid); - return has_vlen_str; + if (tclass == H5T_ARRAY) + { + btid = H5Tget_super(tid); + if (btid < 0) + { + ret = (htri_t) btid; + goto done; + } + ret = h5tools_detect_vlen_str(btid); + if ( (ret == TRUE) || (ret < 0) ) + { + H5Tclose(btid); + goto done; + } } - else if (tclass == H5T_COMPOUND) { + else if (tclass == H5T_COMPOUND) + { n = H5Tget_nmembers(tid); - for (i = 0; i < n; i++) { - hid_t mtid = H5Tget_member_type(tid, i); - has_vlen_str = h5tools_detect_vlen_str(mtid); - if (has_vlen_str == TRUE) { + if (n < 0) + { + n = ret; + goto done; + } + + for (i = 0; i < n; i++) + { + mtid = H5Tget_member_type(tid, i); + ret = h5tools_detect_vlen_str(mtid); + if ( (ret == TRUE) || (ret < 0) ) + { H5Tclose(mtid); - return TRUE; + goto done; } H5Tclose(mtid); } } - return FALSE; + +done: + return ret; } /*------------------------------------------------------------------------- |