diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2010-01-28 13:11:38 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2010-01-28 13:11:38 (GMT) |
commit | 3360c3af0c100ac4d3a2fe2865f34661da862ec5 (patch) | |
tree | 9caf7dba62679504aa39ec02ebb72d8b8b5a848d /src/H5E.c | |
parent | 5b4d3279099e7e4fad6e0092c77aa93dfd35d616 (diff) | |
download | hdf5-3360c3af0c100ac4d3a2fe2865f34661da862ec5.zip hdf5-3360c3af0c100ac4d3a2fe2865f34661da862ec5.tar.gz hdf5-3360c3af0c100ac4d3a2fe2865f34661da862ec5.tar.bz2 |
[svn-r18175] Description:
Bring r17986:18172 from trunk to revise_chunks branch.
Tested on:
FreeBSD/32 6.3 (duty) in debug mode
FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (jam) w/PGI compilers, w/default API=1.8.x,
w/C++ & FORTRAN, w/threadsafe, in debug mode
Linux/64-amd64 2.6 (amani) w/Intel compilers, w/default API=1.6.x,
w/C++ & FORTRAN, in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in debug mode
Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode
Diffstat (limited to 'src/H5E.c')
-rw-r--r-- | src/H5E.c | 67 |
1 files changed, 51 insertions, 16 deletions
@@ -361,6 +361,36 @@ H5E_get_stack(void) /*------------------------------------------------------------------------- + * Function: H5E_free_class + * + * Purpose: Private function to free an error class. + * + * Return: Non-negative value on success/Negative on failure + * + * Programmer: Quincey Koziol + * Friday, January 22, 2009 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5E_free_class(H5E_cls_t *cls) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5E_free_class) + + /* Check arguments */ + HDassert(cls); + + /* Free error class structure */ + cls->cls_name = (char *)H5MM_xfree((void*)cls->cls_name); + cls->lib_name = (char *)H5MM_xfree((void*)cls->lib_name); + cls->lib_vers = (char *)H5MM_xfree((void*)cls->lib_vers); + cls = H5FL_FREE(H5E_cls_t, cls); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5E_free_class() */ + + +/*------------------------------------------------------------------------- * Function: H5Eregister_class * * Purpose: Registers an error class. @@ -413,7 +443,7 @@ done: static H5E_cls_t * H5E_register_class(const char *cls_name, const char *lib_name, const char *version) { - H5E_cls_t *cls; /* Pointer to error class */ + H5E_cls_t *cls = NULL; /* Pointer to error class */ H5E_cls_t *ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5E_register_class) @@ -424,7 +454,7 @@ H5E_register_class(const char *cls_name, const char *lib_name, const char *versi HDassert(version); /* Allocate space for new error class */ - if(NULL == (cls = H5FL_MALLOC(H5E_cls_t))) + if(NULL == (cls = H5FL_CALLOC(H5E_cls_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") /* Duplicate string information */ @@ -439,6 +469,10 @@ H5E_register_class(const char *cls_name, const char *lib_name, const char *versi ret_value = cls; done: + if(!ret_value) + if(cls && H5E_free_class(cls) < 0) + HDONE_ERROR(H5E_ERROR, H5E_CANTRELEASE, NULL, "unable to free error class") + FUNC_LEAVE_NOAPI(ret_value) } /* end H5E_register_class() */ @@ -494,7 +528,9 @@ done: static herr_t H5E_unregister_class(H5E_cls_t *cls) { - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5E_unregister_class) + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5E_unregister_class) /* Check arguments */ HDassert(cls); @@ -504,15 +540,11 @@ H5E_unregister_class(H5E_cls_t *cls) (void)H5I_search(H5I_ERROR_MSG, H5E_close_msg_cb, cls, FALSE); /* Free error class structure */ - if(cls->cls_name) - H5MM_xfree((void*)cls->cls_name); - if(cls->lib_name) - H5MM_xfree((void*)cls->lib_name); - if(cls->lib_vers) - H5MM_xfree((void*)cls->lib_vers); - (void)H5FL_FREE(H5E_cls_t, cls); + if(H5E_free_class(cls) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTRELEASE, FAIL, "unable to free error class") - FUNC_LEAVE_NOAPI(SUCCEED) +done: + FUNC_LEAVE_NOAPI(ret_value) } /* end H5E_unregister_class() */ @@ -680,11 +712,10 @@ H5E_close_msg(H5E_msg_t *err) /* Check arguments */ HDassert(err); - if(err->msg) - H5MM_xfree((void*)err->msg); + /* Release message */ + err->msg = (char *)H5MM_xfree((void *)err->msg); /* Don't free err->cls here */ - - (void)H5FL_FREE(H5E_msg_t, err); + err = H5FL_FREE(H5E_msg_t, err); FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5E_close_msg() */ @@ -749,7 +780,7 @@ done: static H5E_msg_t * H5E_create_msg(H5E_cls_t *cls, H5E_type_t msg_type, const char *msg_str) { - H5E_msg_t *msg; /* Pointer to new error message */ + H5E_msg_t *msg = NULL; /* Pointer to new error message */ H5E_msg_t *ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5E_create_msg) @@ -773,6 +804,10 @@ H5E_create_msg(H5E_cls_t *cls, H5E_type_t msg_type, const char *msg_str) ret_value = msg; done: + if(!ret_value) + if(msg && H5E_close_msg(msg) < 0) + HDONE_ERROR(H5E_ERROR, H5E_CANTCLOSEOBJ, NULL, "unable to close error message") + FUNC_LEAVE_NOAPI(ret_value) } /* end H5E_create_msg() */ |