diff options
author | Robb Matzke <matzke@llnl.gov> | 1998-04-03 03:29:38 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1998-04-03 03:29:38 (GMT) |
commit | a780cdd178f849afbc8cbb24e416eef733cbc9f2 (patch) | |
tree | c9e0162ab42567a4872a5c37444be0e08d4c1914 /test/gheap.c | |
parent | 2a77c19b2216f04a6f8c50995ca0bf09f69e63d0 (diff) | |
download | hdf5-a780cdd178f849afbc8cbb24e416eef733cbc9f2.zip hdf5-a780cdd178f849afbc8cbb24e416eef733cbc9f2.tar.gz hdf5-a780cdd178f849afbc8cbb24e416eef733cbc9f2.tar.bz2 |
[svn-r335] Changes since 19980330
----------------------
./MANIFEST
./src/Makefile.in
./test/Makefile.in
Added new files.
./config/linux
./src/H5HL.c
./src/H5HLprivate.h
./src/H5MF.c
./src/H5MFprivate.h
Added `-DH5HL_DEBUG -DH5MF_DEBUG' to the debug list.
./html/H5.format.html
Updated shared object message information.
./src/H5D.c
Datasets can now share data types.
./src/H5F.c
Updated a comment that referred to H5ACC_WRITE.
./src/H5HG.c
./src/H5HGprivate.h
Moved a few things around. Made debugging better so you can
now give a collection address to ./src/debug and it shows some
useful stuff.
./src/H5O.c
./src/H5Ocont.c
./src/H5Odtype.c
./src/H5Oefl.c
./src/H5Olayout.c
./src/H5Oname.c
./src/H5Onull.c
./src/H5Oprivate.h
./src/H5Osdspace.c
./src/H5Oshared.c [NEW]
./src/H5Ostab.c
Supports shared messages.
./src/H5T.c
./src/H5Tpkg.h
./src/H5Tprivate.h
./src/H5Tpublic.h
The H5Tshare() function allows the user to give the library
hints about how a data type will be used.
./test/shtype.c
Tests the H5Tshare() function.
./test/gheap.c
Tests the global heap.
./configure.in
./config/BlankForm [NEW]
./config/alpha-dec
./config/freebsd2.2.1
./config/hpux10.20
./config/irix6.2
./config/irix64
./config/linux
./config/powerpc-ibm-aix4.2.1.0
./config/rs6000-ibm-aix4.1.4.0
./config/solaris2.5
Cleaned up lots of configuration stuff and made the site
configuration files lots easier and more uniform. To make a
new file grab the BlankForm and modify it.
By default, debugging is turned on for most packages. Within
a package one can use `#ifdef H5AC_DEBUG' to wrap debugging
code. Other options are:
--enable-debug
--enable-debug=yes
The default, most but not all packages.
--disable-debug
--enable-debug=no
--enable-debug=none
The symbol NDEBUG is defined and none of the package
debug symbols.
--enable-debug=all
Debugging is turned on for all packages. This might
produce lots of output.
--enable-debug=g,d
Debugging is turned on for H5G and H5D.
A compile mode is also now supported
--enable-production
--enable-production=yes
The library is compiled with optimizations turned on.
The compiler flags are augmented by adding PROD_CFLAGS
and PROD_CPPFLAGS which are defined in the site config
file.
--disable-production
--enable-production=no
The default. The library is compiled for development
by including DEBUG_CFLAGS and DEBUG_CPPFLAGS defined in
the site config file. This is usually just `-g'.
--enable-production=profile
--enable-production=pg
Builds a library for profiling by including the flags
from PROFILE_CFLAGS and PROFILE_CPPFLAGS defined in the
site config file. This is usullay just `-pg' but it
could include optimization flags as well depending on
the type of profile one wants.
In summary, configure by saying `./configure' and you'll get a
development version of the library. Configure by saying
`./configure --enable-production --disable-debug' and you'll
get a production version with no debugging code.
Diffstat (limited to 'test/gheap.c')
-rw-r--r-- | test/gheap.c | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/test/gheap.c b/test/gheap.c new file mode 100644 index 0000000..4183a84 --- /dev/null +++ b/test/gheap.c @@ -0,0 +1,398 @@ +/* + * Copyright (C) 1998 NCSA + * All rights reserved. + * + * Programmer: Robb Matzke <matzke@llnl.gov> + * Tuesday, March 31, 1998 + * + * Purpose: Tests the global heap. The global heap is the set of all + * collections but the collections are not related to one + * another by anything that appears in the file format. + */ +#include <H5private.h> +#include <H5Eprivate.h> +#include <H5Fprivate.h> +#include <H5Gprivate.h> +#include <H5HGprivate.h> +#include <H5Pprivate.h> + +#ifndef HAVE_FUNCTION +# undef __FUNCTION__ +# define __FUNCTION__ "" +#endif + +#define FAILED(S) { \ + puts ("*FAILED*"); \ + printf (" Failed at %s:%d in %s()%s%s\n", \ + __FILE__, __LINE__, __FUNCTION__, \ + (S)&&*(S)?": ":"", (S)?(S):""); \ + H5Eprint (stdout); \ +} + + +/*------------------------------------------------------------------------- + * Function: emit_diagnostics + * + * Purpose: If debugging is turned on then this function will cause the + * library to emit it's diagnostic messages now instead of when + * we're trying to make the output look nice. + * + * Return: void + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void +emit_diagnostics (void) +{ + H5F_t *f = H5F_open ("gheap0.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC, + NULL, NULL); + H5G_t *g = H5G_create (f->shared->root_grp, "emit", 0); + H5G_close (g); + H5F_close (f); +} + + +/*------------------------------------------------------------------------- + * Function: test_1 + * + * Purpose: Writes a sequence of objects to the global heap where each + * object is larger than the one before. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_1 (void) +{ + H5F_t *f; + H5HG_t obj[1024]; + uint8 out[1024]; + uint8 in[1024]; + int i; + size_t size; + herr_t status; + int retval = 0; + + printf ("%-70s", "...monotonically increasing lengths"); + fflush (stdout); + + /* Open a clean file */ + H5Eclear (); + f = H5F_open ("gheap1.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC, + NULL, NULL); + if (!f) { + FAILED ("unable to create file"); + return -1; + } + + /* + * Write the objects, monotonically increasing in length. Since this is + * a clean file, the addresses allocated for the collections should also + * be monotonically increasing. + */ + for (i=0; i<1024; i++) { + size = i+1; + memset (out, 'A'+i%26, size); + H5Eclear (); + status = H5HG_insert (f, size, out, obj+i); + if (status<0) { + FAILED ("unable to insert object into global heap"); + --retval; + } else if (i && H5F_addr_gt (&(obj[i-1].addr), &(obj[i].addr))) { + FAILED ("collection addresses are not monotonically increasing"); + --retval; + } + } + + /* + * Now try to read each object back. + */ + for (i=0; i<1024; i++) { + size = i+1; + memset (out, 'A'+i%26, size); + H5Eclear (); + if (NULL==H5HG_read (f, obj+i, in)) { + FAILED ("unable to read object"); + --retval; + } else if (memcmp (in, out, size)) { + FAILED ("value read doesn't match value written"); + --retval; + } + } + + H5F_close (f); + puts (" PASSED"); + return retval; +} + + +/*------------------------------------------------------------------------- + * Function: test_2 + * + * Purpose: Writes a sequence of objects to the global heap where each + * object is smaller than the one before. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_2 (void) +{ + H5F_t *f; + H5HG_t obj[1024]; + uint8 out[1024]; + uint8 in[1024]; + int i; + size_t size; + herr_t status; + int retval = 0; + + printf ("%-70s", "...monotonically decreasing lengths"); + fflush (stdout); + + /* Open a clean file */ + H5Eclear (); + f = H5F_open ("gheap2.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC, + NULL, NULL); + if (!f) { + FAILED ("unable to create file"); + return -1; + } + + /* + * Write the objects, monotonically decreasing in length. + */ + for (i=0; i<1024; i++) { + size = 1024-i; + memset (out, 'A'+i%26, size); + H5Eclear (); + status = H5HG_insert (f, size, out, obj+i); + if (status<0) { + FAILED ("unable to insert object into global heap"); + --retval; + } + } + + /* + * Now try to read each object back. + */ + for (i=0; i<1024; i++) { + size = 1024-i; + memset (out, 'A'+i%26, size); + H5Eclear (); + if (NULL==H5HG_read (f, obj+i, in)) { + FAILED ("unable to read object"); + --retval; + } else if (memcmp (in, out, size)) { + FAILED ("value read doesn't match value written"); + --retval; + } + } + + H5F_close (f); + puts (" PASSED"); + return retval; +} + + +/*------------------------------------------------------------------------- + * Function: test_3 + * + * Purpose: Creates a few global heap objects and then removes them all. + * The collection should also be removed. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_3 (void) +{ + H5F_t *f; + H5HG_t obj[1024]; + uint8 out[1024]; + int i; + size_t size; + herr_t status; + int retval = 0; + + printf ("%-70s", "...complete object removal"); + fflush (stdout); + + /* Open a clean file */ + H5Eclear (); + f = H5F_open ("gheap3.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC, + NULL, NULL); + if (!f) { + FAILED ("unable to create file"); + return -1; + } + + /* Create some stuff */ + for (i=0; i<1024; i++) { + size = i%30+100; + memset (out, 'A'+i%26, size); + H5Eclear (); + status = H5HG_insert (f, size, out, obj+i); + if (status<0) { + FAILED ("unable to insert object into global heap"); + --retval; + } + } + + /* Remove everything */ + for (i=0; i<1024; i++) { + status = H5HG_remove (f, obj+i); + if (status<0) { + FAILED ("unable to remove object"); + --retval; + } + } + + H5F_close (f); + puts (" PASSED"); + return retval; +} + + +/*------------------------------------------------------------------------- + * Function: test_4 + * + * Purpose: Tests the H5HG_remove() feature by writing lots of objects + * and occassionally removing some. When we're done they're all + * removed. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_4 (void) +{ + H5F_t *f; + H5HG_t obj[1024]; + uint8 out[1024]; + int i; + size_t size; + herr_t status; + int retval = 0; + + printf ("%-70s", "...partial object removal"); + fflush (stdout); + + /* Open a clean file */ + H5Eclear (); + f = H5F_open ("gheap4.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC, + NULL, NULL); + if (!f) { + FAILED ("unable to create file"); + return -1; + } + + + for (i=0; i<1024; i++) { + /* Insert */ + size = i%30+100; + memset (out, 'A'+i%26, size); + H5Eclear (); + status = H5HG_insert (f, size, out, obj+i); + if (status<0) { + FAILED ("unable to insert object into global heap"); + --retval; + } + + /* + * Remove every third one beginning with the second, but after the + * next one has already been inserted. That is, insert A, B, C; + * remove B, insert D, E, F; remove E; etc. + */ + if (1==i%3) { + H5Eclear (); + status = H5HG_remove (f, obj+i-1); + if (status<0) { + FAILED ("unable to remove object"); + --retval; + } + memset (obj+i-1, 0, sizeof *obj); + } + } + + H5F_close (f); + puts (" PASSED"); + return retval; +} + + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Tests global heap. + * + * Return: Success: zero + * + * Failure: non-zero + * + * Programmer: Robb Matzke + * Tuesday, March 31, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +main (void) +{ + int nfailed=0; + + emit_diagnostics (); + + + nfailed += test_1()<0 ? 1 : 0; + nfailed += test_2()<0 ? 1 : 0; + nfailed += test_3()<0 ? 1 : 0; + nfailed += test_4()<0 ? 1 : 0; + + if (nfailed) { + printf ("*** %d global heap test%s failed ***\n", + nfailed, 1==nfailed?"":"s"); + } else { + printf ("All global heap tests passed.\n"); + } + return nfailed?-1:0; +} |