diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5.c | 35 | ||||
-rw-r--r-- | src/H5A.c | 2 | ||||
-rw-r--r-- | src/H5D.c | 2 | ||||
-rw-r--r-- | src/H5F.c | 5 | ||||
-rw-r--r-- | src/H5G.c | 2 | ||||
-rw-r--r-- | src/H5I.c | 42 | ||||
-rw-r--r-- | src/H5Iprivate.h | 2 | ||||
-rw-r--r-- | src/H5P.c | 2 | ||||
-rw-r--r-- | src/H5R.c | 2 | ||||
-rw-r--r-- | src/H5RA.c | 2 | ||||
-rw-r--r-- | src/H5S.c | 2 | ||||
-rw-r--r-- | src/H5T.c | 133 | ||||
-rw-r--r-- | src/H5TB.c | 2 | ||||
-rw-r--r-- | src/H5config.h.in | 3 | ||||
-rw-r--r-- | src/H5private.h | 6 |
15 files changed, 152 insertions, 90 deletions
@@ -471,6 +471,41 @@ HDsnprintf(char *buf, size_t UNUSED size, const char *fmt, ...) } #endif /* HAVE_SNPRINTF */ +#ifndef HAVE_VSNPRINTF + + +/*------------------------------------------------------------------------- + * Function: HDvsnprintf + * + * Purpose: The same as HDsnprintf() except the variable arguments are + * passed as a va_list. + * + * Note: This function is for compatibility on systems that don't have + * vsnprintf(3). It doesn't actually check for overflow like the + * real vsnprintf() would. + * + * Return: Success: Number of characters stored, not including + * the terminating null. If this value equals + * SIZE then there was not enough space in BUF + * for all the output. + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Monday, April 26, 1999 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +HDvsnprintf(char *buf, size_t size, const char *fmt, va_list ap) +{ + return vsprintf(buf, fmt, ap); +} +#endif /* HAVE_VSNPRINTF */ + + /*------------------------------------------------------------------------- * Function: HDfprintf @@ -100,7 +100,7 @@ H5A_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_ATTR))) { - H5I_clear_group(H5I_ATTR); + H5I_clear_group(H5I_ATTR, FALSE); } else { H5I_destroy_group(H5I_ATTR); interface_initialize_g = 0; @@ -126,7 +126,7 @@ H5D_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_DATASET))) { - H5I_clear_group(H5I_DATASET); + H5I_clear_group(H5I_DATASET, FALSE); } else { H5I_destroy_group(H5I_DATASET); interface_initialize_g = 0; @@ -338,7 +338,10 @@ herr_t H5F_close_all(void) { FUNC_ENTER(H5F_close_all, FAIL); - H5I_clear_group(H5I_FILE); + if (H5I_clear_group(H5I_FILE, FALSE)<0) { + HRETURN_ERROR(H5E_FILE, H5E_CLOSEERROR, FAIL, + "unable to close one or more files"); + } FUNC_LEAVE(SUCCEED); } @@ -726,7 +726,7 @@ H5G_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_GROUP))) { - H5I_clear_group(H5I_GROUP); + H5I_clear_group(H5I_GROUP, FALSE); } else { /* Empty the object type table */ for (i=0; i<H5G_ntypes_g; i++) { @@ -364,14 +364,18 @@ H5I_nmembers(H5I_type_t grp) * Wednesday, March 24, 1999 * * Modifications: + * Robb Matzke, 1999-04-27 + * If FORCE is zero then any item for which the free callback + * failed is not removed. This function returns failure if + * items could not be removed. * *------------------------------------------------------------------------- */ herr_t -H5I_clear_group(H5I_type_t grp) +H5I_clear_group(H5I_type_t grp, hbool_t force) { H5I_id_group_t *grp_ptr = NULL; /* ptr to the atomic group */ - H5I_id_info_t *cur=NULL, *next=NULL; + H5I_id_info_t *cur=NULL, *next=NULL, *prev=NULL; intn ret_value = SUCCEED; uintn i; @@ -401,26 +405,35 @@ H5I_clear_group(H5I_type_t grp) /* * Call free method for all objects in group regardless of their reference * counts. Ignore the return value from from the free method and remove - * object from group regardless. + * object from group regardless if FORCE is non-zero. */ for (i=0; i<grp_ptr->hash_size; i++) { for (cur=grp_ptr->id_list[i]; cur; cur=next) { /* Free the object regardless of reference count */ if (grp_ptr->free_func && (grp_ptr->free_func)(cur->obj_ptr)<0) { + if (force) { #if H5I_DEBUG - if (H5DEBUG(I)) { - fprintf(H5DEBUG(I), "H5I: free grp=%d obj=0x%08lx " - "failure ignored\n", (int)grp, - (unsigned long)(cur->obj_ptr)); - } + if (H5DEBUG(I)) { + fprintf(H5DEBUG(I), "H5I: free grp=%d obj=0x%08lx " + "failure ignored\n", (int)grp, + (unsigned long)(cur->obj_ptr)); + } #endif /*H5I_DEBUG*/ + /* Add ID struct to free list */ + next = cur->next; + H5I_release_id_node(cur); + } else { + if (prev) prev->next = cur; + else grp_ptr->id_list[i] = cur; + prev = cur; + } + } else { + /* Add ID struct to free list */ + next = cur->next; + H5I_release_id_node(cur); } - - /* Add ID struct to free list */ - next = cur->next; - H5I_release_id_node(cur); } - grp_ptr->id_list[i]=NULL; + if (!prev) grp_ptr->id_list[i]=NULL; } done: @@ -472,7 +485,8 @@ H5I_destroy_group(H5I_type_t grp) * free function is invoked for each atom being freed. */ if (1==grp_ptr->count) { - H5I_clear_group(grp); + H5I_clear_group(grp, TRUE); + H5E_clear(); /*don't care about errors*/ H5MM_xfree(grp_ptr->id_list); HDmemset (grp_ptr, 0, sizeof(*grp_ptr)); } else { diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h index 99b6628..dbe5078 100644 --- a/src/H5Iprivate.h +++ b/src/H5Iprivate.h @@ -74,7 +74,7 @@ typedef struct { __DLL__ intn H5I_init_group(H5I_type_t grp, size_t hash_size, uintn reserved, H5I_free_t func); __DLL__ intn H5I_nmembers(H5I_type_t grp); -__DLL__ herr_t H5I_clear_group(H5I_type_t grp); +__DLL__ herr_t H5I_clear_group(H5I_type_t grp, hbool_t force); __DLL__ herr_t H5I_destroy_group(H5I_type_t grp); __DLL__ hid_t H5I_register(H5I_type_t grp, void *object); __DLL__ void *H5I_object(hid_t id); @@ -111,7 +111,7 @@ H5P_term_interface(void) } if (n) { for (i=0; i<H5P_NCLASSES; i++) { - H5I_clear_group((H5I_type_t)(H5I_TEMPLATE_0+i)); + H5I_clear_group((H5I_type_t)(H5I_TEMPLATE_0+i), FALSE); } } else { for (i=0; i<H5P_NCLASSES; i++) { @@ -94,7 +94,7 @@ H5R_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_REFERENCE))) { - H5I_clear_group(H5I_REFERENCE); + H5I_clear_group(H5I_REFERENCE, FALSE); } else { H5I_destroy_group(H5I_REFERENCE); interface_initialize_g = 0; @@ -125,7 +125,7 @@ H5RA_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_RAGGED))) { - H5I_clear_group(H5I_RAGGED); + H5I_clear_group(H5I_RAGGED, FALSE); } else { H5T_close(H5RA_meta_type_g); H5RA_meta_type_g = NULL; @@ -122,7 +122,7 @@ H5S_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_DATASPACE))) { - H5I_clear_group(H5I_DATASPACE); + H5I_clear_group(H5I_DATASPACE, FALSE); } else { #ifdef H5S_DEBUG /* @@ -1113,50 +1113,46 @@ H5T_term_interface(void) H5T_path_t *path = NULL; if (interface_initialize_g) { - if ((n=H5I_nmembers(H5I_DATATYPE))) { - H5I_clear_group(H5I_DATATYPE); - } else { - /* Unregister all conversion functions */ - for (i=0; i<H5T_g.npaths; i++) { - path = H5T_g.path[i]; - assert (path); - - if (path->func) { - H5T_print_stats(path, &nprint/*in,out*/); - path->cdata.command = H5T_CONV_FREE; - if ((path->func)(FAIL, FAIL, &(path->cdata), - 0, NULL, NULL)<0) { + /* Unregister all conversion functions */ + for (i=0; i<H5T_g.npaths; i++) { + path = H5T_g.path[i]; + assert (path); + + if (path->func) { + H5T_print_stats(path, &nprint/*in,out*/); + path->cdata.command = H5T_CONV_FREE; + if ((path->func)(FAIL, FAIL, &(path->cdata), + 0, NULL, NULL)<0) { #ifdef H5T_DEBUG - if (H5DEBUG(T)) { - fprintf (H5DEBUG(T), "H5T: conversion function " - "0x%08lx failed to free private data for " - "%s (ignored)\n", - (unsigned long)(path->func), path->name); - } -#endif - H5E_clear(); /*ignore the error*/ + if (H5DEBUG(T)) { + fprintf (H5DEBUG(T), "H5T: conversion function " + "0x%08lx failed to free private data for " + "%s (ignored)\n", + (unsigned long)(path->func), path->name); } +#endif + H5E_clear(); /*ignore the error*/ } - H5T_close (path->src); - H5T_close (path->dst); - H5MM_xfree (path); - H5T_g.path[i] = NULL; } + H5T_close (path->src); + H5T_close (path->dst); + H5MM_xfree (path); + H5T_g.path[i] = NULL; + } - /* Clear conversion tables */ - H5T_g.path = H5MM_xfree(H5T_g.path); - H5T_g.npaths = H5T_g.apaths = 0; - H5T_g.soft = H5MM_xfree(H5T_g.soft); - H5T_g.nsoft = H5T_g.asoft = 0; + /* Clear conversion tables */ + H5T_g.path = H5MM_xfree(H5T_g.path); + H5T_g.npaths = H5T_g.apaths = 0; + H5T_g.soft = H5MM_xfree(H5T_g.soft); + H5T_g.nsoft = H5T_g.asoft = 0; - /* Unlock all datatypes, then free them */ - H5I_search (H5I_DATATYPE, H5T_unlock_cb, NULL); - H5I_destroy_group(H5I_DATATYPE); + /* Unlock all datatypes, then free them */ + H5I_search (H5I_DATATYPE, H5T_unlock_cb, NULL); + H5I_destroy_group(H5I_DATATYPE); - /* Mark interface as closed */ - interface_initialize_g = 0; - n = 1; /*H5I*/ - } + /* Mark interface as closed */ + interface_initialize_g = 0; + n = 1; /*H5I*/ } return n; } @@ -4551,6 +4547,8 @@ H5T_lock (H5T_t *dt, hbool_t immutable) * Monday, December 8, 1997 * * Modifications: + * Robb Matzke, 1999-04-27 + * This function fails if the datatype state is IMMUTABLE. * *------------------------------------------------------------------------- */ @@ -4558,9 +4556,9 @@ herr_t H5T_close(H5T_t *dt) { intn i; + H5T_t *parent = dt->parent; FUNC_ENTER(H5T_close, FAIL); - assert(dt); /* @@ -4575,41 +4573,44 @@ H5T_close(H5T_t *dt) dt->state = H5T_STATE_NAMED; } - /* Close the parent */ - if (dt->parent && H5T_close(dt->parent)<0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to close parent data type"); - } - /* - * Don't free locked datatypes unless we are shutting down the - * interface. + * Don't free locked datatypes. */ - if (H5T_STATE_IMMUTABLE!=dt->state) { - switch (dt->type) { - case H5T_COMPOUND: - for (i=0; i<dt->u.compnd.nmembs; i++) { - H5MM_xfree(dt->u.compnd.memb[i].name); - H5T_close(dt->u.compnd.memb[i].type); - } - H5MM_xfree(dt->u.compnd.memb); - H5MM_xfree(dt); - break; + if (H5T_STATE_IMMUTABLE==dt->state) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, + "unable to close immutable datatype"); + } - case H5T_ENUM: - for (i=0; i<dt->u.enumer.nmembs; i++) { - H5MM_xfree(dt->u.enumer.name[i]); - } - H5MM_xfree(dt->u.enumer.name); - H5MM_xfree(dt->u.enumer.value); - H5MM_xfree(dt); - break; + /* Close the datatype */ + switch (dt->type) { + case H5T_COMPOUND: + for (i=0; i<dt->u.compnd.nmembs; i++) { + H5MM_xfree(dt->u.compnd.memb[i].name); + H5T_close(dt->u.compnd.memb[i].type); + } + H5MM_xfree(dt->u.compnd.memb); + H5MM_xfree(dt); + break; - default: - H5MM_xfree(dt); + case H5T_ENUM: + for (i=0; i<dt->u.enumer.nmembs; i++) { + H5MM_xfree(dt->u.enumer.name[i]); } + H5MM_xfree(dt->u.enumer.name); + H5MM_xfree(dt->u.enumer.value); + H5MM_xfree(dt); + break; + + default: + H5MM_xfree(dt); } + /* Close the parent */ + if (parent && H5T_close(parent)<0) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to close parent data type"); + } + FUNC_LEAVE(SUCCEED); } @@ -117,7 +117,7 @@ H5TB_term_interface(void) if (interface_initialize_g) { if ((n=H5I_nmembers(H5I_TEMPBUF))) { - H5I_clear_group(H5I_TEMPBUF); + H5I_clear_group(H5I_TEMPBUF, FALSE); } else { /* Free group and buffers */ H5I_destroy_group(H5I_TEMPBUF); diff --git a/src/H5config.h.in b/src/H5config.h.in index 0b8340e..cdb3fb2 100644 --- a/src/H5config.h.in +++ b/src/H5config.h.in @@ -194,6 +194,9 @@ /* Define if you have the system function. */ #undef HAVE_SYSTEM +/* Define if you have the vsnprintf function. */ +#undef HAVE_VSNPRINTF + /* Define if you have the waitpid function. */ #undef HAVE_WAITPID diff --git a/src/H5private.h b/src/H5private.h index 539e93c..6c80e2b 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -689,6 +689,9 @@ __DLL__ int64_t HDstrtoll (const char *s, const char **rest, int base); #define HDvfprintf(F,FMT,A) vfprintf(F,FMT,A) #define HDvprintf(FMT,A) vprintf(FMT,A) #define HDvsprintf(S,FMT,A) vsprintf(S,FMT,A) +#ifdef HAVE_VSNPRINTF +# define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A) +#endif #define HDwait(W) wait(W) #define HDwaitpid(P,W,O) waitpid(P,W,O) #define HDwcstombs(S,P,Z) wcstombs(S,P,Z) @@ -704,6 +707,9 @@ char *strdup(const char *s); #ifndef HAVE_SNPRINTF __DLL__ int HDsnprintf(char *buf, size_t size, const char *fmt, ...); #endif +#ifndef HAVE_VSNPRINTF +__DLL__ int HDvsnprintf(char *buf, size_t size, const char *fmt, va_list ap); +#endif /* * These macros check whether debugging has been requested for a certain |