summaryrefslogtreecommitdiffstats
path: root/test/gheap.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1998-04-03 03:29:38 (GMT)
committerRobb Matzke <matzke@llnl.gov>1998-04-03 03:29:38 (GMT)
commita780cdd178f849afbc8cbb24e416eef733cbc9f2 (patch)
treec9e0162ab42567a4872a5c37444be0e08d4c1914 /test/gheap.c
parent2a77c19b2216f04a6f8c50995ca0bf09f69e63d0 (diff)
downloadhdf5-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.c398
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;
+}