diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2009-11-16 20:45:05 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2009-11-16 20:45:05 (GMT) |
commit | d2b87ec47ebdb096c331c7b62a195b9cea2f33ae (patch) | |
tree | a066f01361afaf5df457cef612bb0bb9fd80fe18 /test/gheap.c | |
parent | ee5a1e07350f0dcf3ef07d9443aa2f4c073392f4 (diff) | |
download | hdf5-d2b87ec47ebdb096c331c7b62a195b9cea2f33ae.zip hdf5-d2b87ec47ebdb096c331c7b62a195b9cea2f33ae.tar.gz hdf5-d2b87ec47ebdb096c331c7b62a195b9cea2f33ae.tar.bz2 |
[svn-r17896] Description:
Bring r17546:17895 from trunk to revise_chunks branch. Changes to
fixed and extensible array dataset chunk indexing code to accommodate changes
to private APIs in those interfaces. Also, other adjustments to source code
and expected output in response to changes on the trunk.
Tested on:
FreeBSD/32 6.3 (duty) in debug mode
FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (jam) w/PGI compilers, w/default API=1.8.x,
w/C++ & FORTRAN, w/threadsafe, in debug mode
Linux/64-amd64 2.6 (smirom) w/Intel compilers, w/default API=1.6.x,
w/C++ & FORTRAN, in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in debug mode
Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode
Mac OS X/32 10.6.2 (amazon) in debug mode
Mac OS X/32 10.6.2 (amazon) w/C++ & FORTRAN, w/threadsafe,
in production mode
Diffstat (limited to 'test/gheap.c')
-rw-r--r-- | test/gheap.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/test/gheap.c b/test/gheap.c index 6dbd8a3..b2c9090 100644 --- a/test/gheap.c +++ b/test/gheap.c @@ -30,11 +30,27 @@ #include "H5Iprivate.h" #include "H5Pprivate.h" +/* Macros for printing error messages in loops. These print up to + * GHEAP_REPEATED_ERR_LIM errors, and suppress the rest */ +#define GHEAP_REPEATED_ERR_LIM 20 + +#define GHEAP_REPEATED_ERR(MSG) \ +{ \ + nerrors++; \ + if(nerrors <= GHEAP_REPEATED_ERR_LIM) { \ + H5_FAILED(); \ + puts(MSG); \ + if(nerrors == GHEAP_REPEATED_ERR_LIM) \ + puts(" Suppressing further errors..."); \ + } /* end if */ \ +} /* end GHEAP_REPEATED_ERR */ + const char *FILENAME[] = { "gheap1", "gheap2", "gheap3", "gheap4", + "gheapooo", NULL }; @@ -385,6 +401,120 @@ test_4 (hid_t fapl) /*------------------------------------------------------------------------- + * Function: test_ooo_indices + * + * Purpose: Tests that indices can be stored out of order. This can + * happen when the indices "wrap around" due to many + * insertions and deletions (for example, from rewriting a + * VL dataset). + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Neil Fortner + * Monday, October 26, 2009 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_ooo_indices(hid_t fapl) +{ + hid_t file = -1; + H5F_t *f = NULL; + unsigned i, j; + H5HG_t *obj = NULL; + herr_t status; + int nerrors=0; + char filename[1024]; + + TESTING("out of order indices"); + + if(NULL == (obj = (H5HG_t *)HDmalloc(2000 * sizeof(*obj)))) + goto error; + + /* Open a clean file */ + h5_fixname(FILENAME[4], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to create file"); + goto error; + } /* end if */ + + /* Alternately insert 1000 entries and remove the previous group of 1000 + * entries, until the indices wrap around */ + for(i=0; i<66; i++) { + /* Insert 1000 entries. The index into the obj array will alternate up + * and down by 1000 so the previous set of insertions is preserved and + * can be deleted. */ + for(j=1000*((~i&1)); j<1000*((~i&1)+1); j++) { + H5Eclear2(H5E_DEFAULT); + status = H5HG_insert(f, H5P_DATASET_XFER_DEFAULT, sizeof(j), &j, &obj[j]); + if (status<0) + GHEAP_REPEATED_ERR(" Unable to insert object into global heap") + + /* Check that the index is as expected */ + if(obj[j].idx != ((1000 * i) + j - (1000 * ((~i & 1)))) % ((1u << 16) - 1) + 1) + GHEAP_REPEATED_ERR(" Unexpected global heap index"); + } /* end for */ + + /* Remove the previous 1000 entries */ + if(i>0) + for(j=1000*(i&1); j<1000*((i&1)+1); j++) { + H5Eclear2(H5E_DEFAULT); + status = H5HG_remove(f, H5P_DATASET_XFER_DEFAULT, &obj[j]); + if (status<0) + GHEAP_REPEATED_ERR(" Unable to remove object from global heap"); + } /* end for */ + } /* end for */ + + /* The indices should have "wrapped around" on the last iteration */ + HDassert(obj[534].idx == 65535); + HDassert(obj[535].idx == 1); + + /* Reopen the file */ + if (H5Fclose(file)<0) goto error; + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to open file"); + goto error; + } /* end if */ + + /* Read the objects to make sure the heap is still readable */ + for(i=0; i<1000; i++) { + if(NULL == H5HG_read(f, H5P_DATASET_XFER_DEFAULT, &obj[i], &j, NULL)) + goto error; + if(i != j) { + H5_FAILED(); + puts(" Incorrect read value"); + goto error; + } /* end if */ + } /* end for */ + + if (H5Fclose(file)<0) goto error; + if (nerrors) goto error; + HDfree(obj); + obj = NULL; + PASSED(); + return 0; + + error: + H5E_BEGIN_TRY { + H5Fclose(file); + } H5E_END_TRY; + if(obj) + HDfree(obj); + return MAX(1, nerrors); +} /* end test_ooo_indices */ + + +/*------------------------------------------------------------------------- * Function: main * * Purpose: Tests global heap. @@ -413,6 +543,7 @@ main (void) nerrors += test_2(fapl); nerrors += test_3(fapl); nerrors += test_4(fapl); + nerrors += test_ooo_indices(fapl); if (nerrors) goto error; puts("All global heap tests passed."); |