summaryrefslogtreecommitdiffstats
path: root/src/H5FL.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>2000-05-18 16:40:20 (GMT)
committerRobb Matzke <matzke@llnl.gov>2000-05-18 16:40:20 (GMT)
commitbc520e88b4ad3b175c0aeca2c90e021956676533 (patch)
tree814fa010e05cff2b586c3b947616f4af8b363cf4 /src/H5FL.c
parent356495d12608a896fdc67bef0ab446cb1a74f8f8 (diff)
downloadhdf5-bc520e88b4ad3b175c0aeca2c90e021956676533.zip
hdf5-bc520e88b4ad3b175c0aeca2c90e021956676533.tar.gz
hdf5-bc520e88b4ad3b175c0aeca2c90e021956676533.tar.bz2
[svn-r2262] * 2000-05-18
** src/H5Tconv.c ** src/H5Tpkg.h ** src/H5Tpublic.h The H5T_conv_struct_opt() function had a design flaw -- it didn't keep information about the stride to use to step through the temporary/background-value buffer and thus nested invocations would clobber each other's temp buffers. This was fixed by splitting the `stride' argument into `buf_stride' and `bkg_stride' arguments for all the conversion functions. THIS IS AN API CHANGE, but users will get a compiler warning when they pass their conversion function pointer to H5Tregister(). ** src/H5T.c ** src/H5Tprivate.h Added a bkg_stride argument to the H5T_convert() definition in order to fix a bug related to the optimized compound datatype conversion function. ** src/H5T.c ** src/H5A.c ** src/H5D.c ** src/H5Ofill.c ** src/H5P.c Added bkg_stride=0 argument to the H5T_convert() calls. ** test/dtypes.c Added a test for the H5T_conv_struct_opt() bug fixed above. ** src/H5FL.c The H5FL_term() function should return non-zero even when it couldn't free all the free lists do to their being used by some other package. When that other package terminates it will return non-zero, causing H5FL_term() to be called again. This fixes some of the `infinite loop closing library' messages. ** tools/pdb2hdf Uses print_version() instead of doing that itself. ** src/H5Ppublic.h Renamed H5Pget_gc_reference() declaration to make it match the definition. ** src/H5FDlog.c Added API tracing macros. Removed `const' qualifier from a `char*' member of a struct which was allocated on the heap. ** src/H5TB.c Added curly braces to a couple deeply-nested `if' statements to make them clearer and to shut up the increadibly stupid and just plain incorrect gcc warning about ambiguous `else'. ** test/titerate.c Removed incomplete initialization in favor of memset() for one auto variable to stop compiler warnings. ** tools/Depencencies Regenerated to remove references to h5dumputil.c
Diffstat (limited to 'src/H5FL.c')
-rw-r--r--src/H5FL.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/src/H5FL.c b/src/H5FL.c
index 9da7605..7fab4d0 100644
--- a/src/H5FL.c
+++ b/src/H5FL.c
@@ -322,43 +322,54 @@ H5FL_gc(void)
Can't report errors...
EXAMPLES
REVISION LOG
+ Robb Matzke, 2000-04-25
+ If a list cannot be freed because something is using it then return
+ zero (failure to free a list doesn't affect any other part of the
+ library). If some other layer frees something during its termination
+ it will return non-zero, which will cause this function to get called
+ again to reclaim this layer's memory.
--------------------------------------------------------------------------*/
static intn
H5FL_term(void)
{
H5FL_gc_list_t *left; /* pointer to garbage collection lists with work left */
H5FL_gc_list_t *tmp; /* Temporary pointer to a garbage collection node */
-
- /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
- left=NULL;
- while(H5FL_gc_head!=NULL) {
- tmp=H5FL_gc_head->next;
+
+ if (interface_initialize_g) {
+ /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
+ left=NULL;
+ while(H5FL_gc_head!=NULL) {
+ tmp=H5FL_gc_head->next;
#ifdef H5FL_DEBUG
-printf("H5FL_term: head->name=%s, head->allocated=%d\n", H5FL_gc_head->list->name,(int)H5FL_gc_head->list->allocated);
+ printf("H5FL_term: head->name=%s, head->allocated=%d\n", H5FL_gc_head->list->name,(int)H5FL_gc_head->list->allocated);
#endif /* H5FL_DEBUG */
- /* Check if the list has allocations outstanding */
- if(H5FL_gc_head->list->allocated>0) {
- /* Add free list to the list of nodes with allocations open still */
- H5FL_gc_head->next=left;
- left=H5FL_gc_head;
- } /* end if */
- /* No allocations left open for list, get rid of it */
- else {
- /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
- H5FL_gc_head->list->init=0;
+ /* Check if the list has allocations outstanding */
+ if(H5FL_gc_head->list->allocated>0) {
+ /* Add free list to the list of nodes with allocations open still */
+ H5FL_gc_head->next=left;
+ left=H5FL_gc_head;
+ } /* end if */
+ /* No allocations left open for list, get rid of it */
+ else {
+ /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+ H5FL_gc_head->list->init=0;
- /* Free the node from the garbage collection list */
- H5MM_xfree(H5FL_gc_head);
- } /* end else */
+ /* Free the node from the garbage collection list */
+ H5MM_xfree(H5FL_gc_head);
+ } /* end else */
- H5FL_gc_head=tmp;
- } /* end while */
+ H5FL_gc_head=tmp;
+ } /* end while */
- /* Point to the list of nodes left with allocations open, if any */
- H5FL_gc_head=left;
-
- return (H5FL_gc_head!=NULL ? 1 : 0);
+ /* Point to the list of nodes left with allocations open, if any */
+ H5FL_gc_head=left;
+ if (!left) interface_initialize_g = 0; /*this layer has reached its initial state*/
+ }
+
+ /* Terminating this layer never affects other layers; rather, other layers affect
+ * the termination of this layer. */
+ return 0;
}