diff options
author | Robb Matzke <matzke@llnl.gov> | 1999-03-30 11:38:34 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1999-03-30 11:38:34 (GMT) |
commit | f003dead4d1701aedd7833354ede73c6eb93a971 (patch) | |
tree | e64999eb9d666aedd808f1c91f4a2be8676d6881 /src/H5.c | |
parent | 804fae33ced79c63a2c7fa2adc8537c80597fb33 (diff) | |
download | hdf5-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.c | 87 |
1 files changed, 34 insertions, 53 deletions
@@ -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; } |