diff options
author | Robb Matzke <matzke@llnl.gov> | 2000-05-18 16:40:20 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 2000-05-18 16:40:20 (GMT) |
commit | bc520e88b4ad3b175c0aeca2c90e021956676533 (patch) | |
tree | 814fa010e05cff2b586c3b947616f4af8b363cf4 /src/H5FL.c | |
parent | 356495d12608a896fdc67bef0ab446cb1a74f8f8 (diff) | |
download | hdf5-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.c | 61 |
1 files changed, 36 insertions, 25 deletions
@@ -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; } |