diff options
author | Robb Matzke <matzke@llnl.gov> | 1998-11-21 03:36:51 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1998-11-21 03:36:51 (GMT) |
commit | 7488c6366e878651f6bb8dc94f05eb69cd0df83b (patch) | |
tree | c2ba0295a0bec1b350fa3d4fa291b46ac75e271f /src/H5T.c | |
parent | 6345a417a3930b32ec9e5fc087e0aeb20a94aed7 (diff) | |
download | hdf5-7488c6366e878651f6bb8dc94f05eb69cd0df83b.zip hdf5-7488c6366e878651f6bb8dc94f05eb69cd0df83b.tar.gz hdf5-7488c6366e878651f6bb8dc94f05eb69cd0df83b.tar.bz2 |
[svn-r936] Changes since 19981119
----------------------
./src/H5.c
./src/H5A.c
./src/H5AC.c
./src/H5B.c
./src/H5D.c
./src/H5E.c
./src/H5F.c
./src/H5Farray.c
./src/H5Fcore.c
./src/H5Ffamily.c
./src/H5Fistore.c
./src/H5Flow.c
./src/H5Fmpio.c
./src/H5Fsec2.c
./src/H5Fsplit.c
./src/H5Fstdio.c
./src/H5G.c
./src/H5Gent.c
./src/H5Gnode.c
./src/H5Gstab.c
./src/H5HG.c
./src/H5HL.c
./src/H5I.c
./src/H5Iprivate.h
./src/H5MF.c
./src/H5MM.c
./src/H5O.c
./src/H5Oattr.c
./src/H5Ocomp.c
./src/H5Ocont.c
./src/H5Odtype.c
./src/H5Oefl.c
./src/H5Ofill.c
./src/H5Olayout.c
./src/H5Omtime.c
./src/H5Oname.c
./src/H5Osdspace.c
./src/H5Oshared.c
./src/H5Ostab.c
./src/H5P.c
./src/H5R.c
./src/H5RA.c
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Smpio.c
./src/H5Snone.c
./src/H5Spoint.c
./src/H5Sselect.c
./src/H5T.c
./src/H5TB.c
./src/H5Tbit.c
./src/H5Tconv.c
./src/H5V.c
./src/H5Z.c
./src/H5detect.c
./src/H5private.h
Most of these changes are because the `interface_initialize_g'
variable change from hbool_t to int. It's a one line change.
Changed the way the library is closed so we have more control
over the order the interfaces are shut down. Instead of
registering an atexit() function for every interface in some
haphazard order we just register one: H5_term_library() which
then calls the H5*_term_interface() functions in a
well-defined order.
If the library is closed and then reopened repeatedly by
calling H5close() and H5open() in a loop we only add one copy
of the library termination functions with atexit().
Termination is a two-step process in order to help detect
programming errors that would cause an infinite loop caused by
the termination of one interface waking up some other
previously terminated interface. The first step terminates
the interface and *marks it as unusable*. After all
interfaces are terminated then we mark them all as usable
again. The FUNC_ENTER() macro has been modified to return
failure or to dump core (depending on whether NDEBUG is
defined) if we try to call an interface while it's shutting
down.
./src/H5.c
The H5dont_atexit() function returns failure if it's called
more than once or if it's called too late. However, the error
stack is not automatically printed on failure because the
library might not be initialized yet
./test/chunk.c
./test/flush1.c
./test/flush2.c
./test/iopipe.c
./test/overhead.c
./test/ragged.c
Changed the extra cast for Win32 so we do floating point
division again -- it was just confusion about precedence and
associativity of casting and the C coercion rules. Removed
extra carriage returns inserted by broken operating system.
./src/H5Ffamily.c
Fixed an bug where H5F_fam_write() lowered the EOF marker for
one of the family members causing H5F_fam_read() to read
zeros.
./test/h5test.h [NEW]
./test/h5test.c [NEW]
./test/Makefile.in
./test/bittests.c
./test/cmpd_dset.c
./test/dsets.c
./test/dtypes.c
./test/extend.c
./test/external.c
Support library for test files. This isn't done yet but
Katie's contractions are ~10 minutes apart so I figured I
better back this stuff up just in case I'm not here next
week...
Eventually all test files will understand HDF5_DRIVER to name
the low level file driver and parameters so we can easily test
various drivers. They will also understand HDF5_PREFIX to
prepend to the beginning of file names which is necessary for
testing ROMIO with various drivers. Also, the cleanup function
will know how to use the file name prefix and will understand
different file driver naming schemes like file families. I'm
not sure they'll understand the `gsf:' type prefixes yet.
Note, the external test is completely commented out because
I'm in the middle of modifying it. It will still compile and
run but it doesn't test anything at the moment.
Diffstat (limited to 'src/H5T.c')
-rw-r--r-- | src/H5T.c | 228 |
1 files changed, 115 insertions, 113 deletions
@@ -26,9 +26,8 @@ static char RcsId[] = "@(#)$Revision$"; #define H5T_COMPND_INC 64 /*typical max numb of members per struct */ /* Interface initialization */ -static intn interface_initialize_g = FALSE; +static intn interface_initialize_g = 0; #define INTERFACE_INIT H5T_init_interface -static void H5T_term_interface(void); hid_t H5T_IEEE_F32BE_g = FAIL; hid_t H5T_IEEE_F32LE_g = FAIL; @@ -123,23 +122,25 @@ herr_t H5T_init_interface(void) { H5T_t *dt = NULL; - herr_t ret_value = SUCCEED; interface_initialize_g = TRUE; FUNC_ENTER(H5T_init_interface, FAIL); /* Initialize the atom group for the file IDs */ - if ((ret_value = H5I_init_group(H5I_DATATYPE, H5I_DATATYPEID_HASHSIZE, - H5T_RESERVED_ATOMS, - (herr_t (*)(void *)) H5T_close)) >= 0) { - ret_value = H5_add_exit(&H5T_term_interface); + if (H5I_init_group(H5I_DATATYPE, H5I_DATATYPEID_HASHSIZE, + H5T_RESERVED_ATOMS, (herr_t (*)(void *))H5T_close)<0) { + HRETURN_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to initialize interface"); } /* * Initialize pre-defined native data types from code generated during * the library configuration by H5detect. */ - ret_value = H5T_native_open(); + if (H5T_native_open()<0) { + HRETURN_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to initialize interface"); + } /*------------------------------------------------------------ * Native types @@ -1163,7 +1164,7 @@ H5T_init_interface(void) "unable to register conversion function"); } - FUNC_LEAVE(ret_value); + FUNC_LEAVE(SUCCEED); } @@ -1196,29 +1197,25 @@ H5T_unlock_cb (void *_dt, const void __unused__ *key) FUNC_LEAVE (0); } -/*-------------------------------------------------------------------------- - NAME - H5T_term_interface - PURPOSE - Terminate various H5T objects - USAGE - void H5T_term_interface() - RETURNS - Non-negative on success/Negative on failure - DESCRIPTION - Release the atom group and any other resources allocated. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - Can't report errors... - EXAMPLES - REVISION LOG + +/*------------------------------------------------------------------------- + * Function: H5T_term_interface + * + * Purpose: Close this interface. + * + * Return: void + * + * Programmer: Robb Matzke + * Friday, November 20, 1998 + * + * Modifications: * Robb Matzke, 1998-06-11 * Statistics are only printed for conversion functions that were * called. - * ---------------------------------------------------------------------------*/ -static void -H5T_term_interface(void) + *------------------------------------------------------------------------- + */ +void +H5T_term_interface(intn status) { intn i; H5T_path_t *path = NULL; @@ -1230,110 +1227,115 @@ H5T_term_interface(void) H5T_cdata_t *cdata; char bandwidth[32]; #endif - - /* Unregister all conversion functions */ - for (i=0; i<H5T_npath_g; i++) { - path = H5T_path_g[i]; - assert (path); - if (path->func) { - path->cdata.command = H5T_CONV_FREE; - if ((path->func)(FAIL, FAIL, &(path->cdata), 0, NULL, NULL)<0) { + if (interface_initialize_g>0) { + /* Unregister all conversion functions */ + for (i=0; i<H5T_npath_g; i++) { + path = H5T_path_g[i]; + assert (path); + + if (path->func) { + 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 failed " - "to free private data for %s\n", path->name); + if (H5DEBUG(T)) { + fprintf (H5DEBUG(T), "H5T: conversion function failed " + "to free private data for %s\n", path->name); + } +#endif + H5E_clear(); /*ignore the error*/ + } +#ifdef H5T_DEBUG + if (H5DEBUG(T) && path->cdata.stats->ncalls>0) { + if (0==nprint++) { + HDfprintf (H5DEBUG(T), + "H5T: type conversion statistics:\n"); + HDfprintf (H5DEBUG(T), + " %-16s %10s %10s %8s %8s %8s %10s\n", + "Conversion", "Elmts", "Calls", "User", + "System", "Elapsed", "Bandwidth"); + HDfprintf (H5DEBUG(T), + " %-16s %10s %10s %8s %8s %8s %10s\n", + "----------", "-----", "-----", "----", + "------", "-------", "---------"); + } + nbytes = MAX (H5T_get_size (path->src), + H5T_get_size (path->dst)); + nbytes *= path->cdata.stats->nelmts; + H5_bandwidth(bandwidth, (double)nbytes, + path->cdata.stats->timer.etime); + HDfprintf (H5DEBUG(T), + " %-16s %10Hd %10d %8.2f %8.2f %8.2f %10s\n", + path->name, + path->cdata.stats->nelmts, + path->cdata.stats->ncalls, + path->cdata.stats->timer.utime, + path->cdata.stats->timer.stime, + path->cdata.stats->timer.etime, + bandwidth); } #endif - H5E_clear(); /*ignore the error*/ + H5T_close (path->src); + H5T_close (path->dst); + H5MM_xfree (path->cdata.stats); } + H5MM_xfree (path); + H5T_path_g[i] = NULL; + } + #ifdef H5T_DEBUG - if (H5DEBUG(T) && path->cdata.stats->ncalls>0) { + /* Print debugging infor for the `noop' conversion */ + if (H5DEBUG(T) && + H5T_conv_noop==H5T_find(NULL, NULL, H5T_BKG_NO, &cdata)) { + if (cdata->stats->ncalls>0) { if (0==nprint++) { - HDfprintf (H5DEBUG(T), "H5T: type conversion statistics " - "accumulated over life of function:\n"); HDfprintf (H5DEBUG(T), - " %-16s %10s %10s %8s %8s %8s %10s\n", - "Conversion", "Elmts", "Calls", "User", - "System", "Elapsed", "Bandwidth"); - HDfprintf (H5DEBUG(T), - " %-16s %10s %10s %8s %8s %8s %10s\n", - "----------", "-----", "-----", "----", - "------", "-------", "---------"); + "H5T: type conversion statistics\n"); + HDfprintf (H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s " + "%10s\n", "Conversion", "Elmts", "Calls", + "User", "System", "Elapsed", "Bandwidth"); + HDfprintf (H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s " + "%10s\n", "----------", "-----", "-----", + "----", "------", "-------", "---------"); } - nbytes = MAX (H5T_get_size (path->src), - H5T_get_size (path->dst)); - nbytes *= path->cdata.stats->nelmts; + nbytes = cdata->stats->nelmts; H5_bandwidth(bandwidth, (double)nbytes, - path->cdata.stats->timer.etime); + cdata->stats->timer.etime); HDfprintf (H5DEBUG(T), " %-16s %10Hd %10d %8.2f %8.2f %8.2f %10s\n", - path->name, - path->cdata.stats->nelmts, - path->cdata.stats->ncalls, - path->cdata.stats->timer.utime, - path->cdata.stats->timer.stime, - path->cdata.stats->timer.etime, + "no-op", + cdata->stats->nelmts, + cdata->stats->ncalls, + cdata->stats->timer.utime, + cdata->stats->timer.stime, + cdata->stats->timer.etime, bandwidth); } -#endif - H5T_close (path->src); - H5T_close (path->dst); - H5MM_xfree (path->cdata.stats); } - H5MM_xfree (path); - H5T_path_g[i] = NULL; - } - -#ifdef H5T_DEBUG - /* Print debugging infor for the `noop' conversion */ - if (H5DEBUG(T) && - H5T_conv_noop==H5T_find(NULL, NULL, H5T_BKG_NO, &cdata)) { - if (cdata->stats->ncalls>0) { - if (0==nprint++) { - HDfprintf (H5DEBUG(T), "H5T: type conversion statistics " - "accumulated over life of library:\n"); - HDfprintf (H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s %10s\n", - "Conversion", "Elmts", "Calls", "User", - "System", "Elapsed", "Bandwidth"); - HDfprintf (H5DEBUG(T), " %-16s %10s %10s %8s %8s %8s %10s\n", - "----------", "-----", "-----", "----", - "------", "-------", "---------"); - } - nbytes = cdata->stats->nelmts; - H5_bandwidth(bandwidth, (double)nbytes, cdata->stats->timer.etime); - HDfprintf (H5DEBUG(T), - " %-16s %10Hd %10d %8.2f %8.2f %8.2f %10s\n", - "no-op", - cdata->stats->nelmts, - cdata->stats->ncalls, - cdata->stats->timer.utime, - cdata->stats->timer.stime, - cdata->stats->timer.etime, - bandwidth); - } - } #endif - /* Clear conversion tables */ - H5T_apath_g = 0; - H5T_npath_g = 0; - H5T_path_g = H5MM_xfree (H5T_path_g); + /* Clear conversion tables */ + H5T_apath_g = 0; + H5T_npath_g = 0; + H5T_path_g = H5MM_xfree (H5T_path_g); - H5T_asoft_g = 0; - H5T_nsoft_g = 0; - H5T_soft_g = H5MM_xfree (H5T_soft_g); + H5T_asoft_g = 0; + H5T_nsoft_g = 0; + H5T_soft_g = H5MM_xfree (H5T_soft_g); - /* Clear noop function */ - if ((cfunc=H5T_find (NULL, NULL, H5T_BKG_NO, &pcdata))) { - pcdata->command = H5T_CONV_FREE; - (cfunc)(FAIL, FAIL, pcdata, 0, NULL, NULL); - } + /* Clear noop function */ + if ((cfunc=H5T_find (NULL, NULL, H5T_BKG_NO, &pcdata))) { + pcdata->command = H5T_CONV_FREE; + (cfunc)(FAIL, FAIL, pcdata, 0, NULL, NULL); + } - /* Unlock all datatypes, then free them */ - H5I_search (H5I_DATATYPE, H5T_unlock_cb, NULL); - H5I_destroy_group(H5I_DATATYPE); - interface_initialize_g = FALSE; + /* Unlock all datatypes, then free them */ + H5I_search (H5I_DATATYPE, H5T_unlock_cb, NULL); + H5I_destroy_group(H5I_DATATYPE); + } + + interface_initialize_g = status; } |