summaryrefslogtreecommitdiffstats
path: root/src/H5.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1999-03-30 11:38:34 (GMT)
committerRobb Matzke <matzke@llnl.gov>1999-03-30 11:38:34 (GMT)
commitf003dead4d1701aedd7833354ede73c6eb93a971 (patch)
treee64999eb9d666aedd808f1c91f4a2be8676d6881 /src/H5.c
parent804fae33ced79c63a2c7fa2adc8537c80597fb33 (diff)
downloadhdf5-f003dead4d1701aedd7833354ede73c6eb93a971.zip
hdf5-f003dead4d1701aedd7833354ede73c6eb93a971.tar.gz
hdf5-f003dead4d1701aedd7833354ede73c6eb93a971.tar.bz2
[svn-r1169] ./configure.in
./configure [REGENERATED] ./src/H5D.c ./src/H5O.c Removed H5AC, H5B, and H5T from the default list of packages to debug (because they're pretty expensive debugging), and added H5O. Also fixed a bug for undefined variable in H5D when H5S debugging is turned on but H5T debugging is turned off. ./config/conclude.in Fixed installation of header files for building in a directory other than the source directory. This fixes a bug where H5config.h wasn't being installed. ./src/H5.c ./src/H5A.c ./src/H5D.c ./src/H5F.c ./src/H5G.c ./src/H5I.c ./src/H5Iprivate.h ./src/H5P.c ./src/H5R.c ./src/H5RA.c ./src/H5S.c ./src/H5T.c ./src/H5TB.c ./src/H5Tprivate.h ./src/H5Z.c ./src/H5detect.c ./src/H5private.h Changed the way the library shuts down again. Now it handles cycles between packages and isn't so sensitive to dependencies between packages. A package might shut down only to be restarted to process a request from some other package being shut down. Loops are detected after 100 iteractions and the shutdown is aborted with a message on standard error. This also makes it a lot easier to debug. ./src/H5A.c Fixed H5A_write() and H5A_read() so they pass a non-null background buffer to the conversion functions. This is necessary when an attribute has a compound data type. ./src/H5Flow.c ./src/H5Fprivate.h ./src/H5Fsec2.c Reindented new Win32 stuff. ./src/H5Odtype.c Fixed a bug when enumeration types are used in a compound data type. The byte pointer wasn't incremented after the type information was written. ./tools/h5ls.c Compound data types display their total size because it's not always obvious from looking at the members. Scalar attributes show their space as `scalar' instead of `{}'. The index value is not printed for attributes that have only a few values. Instead the word `Data:' is printed on the first line of attribute data. Named types display their data type only if verbose output was requested.
Diffstat (limited to 'src/H5.c')
-rw-r--r--src/H5.c87
1 files changed, 34 insertions, 53 deletions
diff --git a/src/H5.c b/src/H5.c
index 5df4d4a..ea6b476 100644
--- a/src/H5.c
+++ b/src/H5.c
@@ -130,65 +130,46 @@ H5_init_library(void)
void
H5_term_library(void)
{
+ intn pending, ntries=0, n;
+ uintn at=0;
+ char loop[1024];
+
/* Don't do anything if the library is already closed */
if (!H5_libinit_g) return;
/*
- * Close interfaces in a well-defined order based on dependencies. The
- * goal is that closing one interface doesn't reopen another that was
- * just closed. In order to help us track down dependencies that we
- * didn't know about, we close the interfaces in a two step process. The
- * first step does the real work and makes the interface unusable. The
- * second step doesn't do any work but makes it possible to reopen the
- * interface later.
- */
-
- /*
- * Cycles: The H5F layer participates in quite a few dependency cycles
- * because it's cache depends on almost all other meta object
- * packages and those packages depend on H5O which depends on H5F
- * (because H5F_close() can delay until all object headers are
- * closed). We handle this cycle by calling H5F_close() for all
- * files, which flushes the meta data caches and updates the file
- * boot block.
- */
- H5F_close_all();
-
- /* Function What depends on it? */
- /*------------------------- ------------------------------- */
- H5D_term_interface(-1); /* */
- H5TB_term_interface(-1); /* */
- H5Z_term_interface(-1); /* */
- H5A_term_interface(-1); /* */
- H5RA_term_interface(-1); /* */
- H5G_term_interface(-1); /* */
- H5R_term_interface(-1); /* */
- H5S_term_interface(-1); /* */
- H5T_native_close(-1); /* D RA */
- H5T_term_interface(-1); /* D RA */
- H5P_term_interface(-1); /* D F */
- H5F_term_interface(-1); /* A D G S T */
- H5I_term_interface(-1); /* A D F G P RA S T TB Z */
- /*------------------------- --------------------------------- */
-
- /*
- * Finalize the closing by calling all the functions again but with an
- * argument of zero. This allows the interface to be reopened later.
+ * Terminate each interface. The termination functions return a positive
+ * value if they do something that might affect some other interface in a
+ * way that would necessitate some cleanup work in the other interface.
*/
- H5A_term_interface(0);
- H5D_term_interface(0);
- H5F_term_interface(0);
- H5G_term_interface(0);
- H5I_term_interface(0);
- H5P_term_interface(0);
- H5RA_term_interface(0);
- H5R_term_interface(0);
- H5S_term_interface(0);
- H5TB_term_interface(0);
- H5T_native_close(0);
- H5T_term_interface(0);
- H5Z_term_interface(0);
+#define DOWN(F) \
+ (((n=H5##F##_term_interface()) && at+5<sizeof loop)? \
+ (sprintf(loop+at, "%s%s", at?",":"", #F), \
+ at += strlen(loop+at), \
+ n):0)
+
+ do {
+ pending = 0;
+ pending += DOWN(F);
+ pending += DOWN(D);
+ pending += DOWN(TB);
+ pending += DOWN(Z);
+ pending += DOWN(RA);
+ pending += DOWN(G);
+ pending += DOWN(R);
+ pending += DOWN(S);
+ pending += DOWN(TN);
+ pending += DOWN(T);
+ pending += DOWN(A);
+ pending += DOWN(P);
+ pending += DOWN(I);
+ } while (pending && ntries++<100);
+ if (pending) {
+ fprintf(stderr, "HDF5: infinite loop closing library\n");
+ fprintf(stderr, " %s\n", loop);
+ }
+
/* Mark library as closed */
H5_libinit_g = FALSE;
}