diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-07-31 09:54:09 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-07-31 09:54:09 (GMT) |
commit | 87449d081d1c99312034d917502f2b6aca2ee60c (patch) | |
tree | d21839e74c6602b9a60ce383207001675b4b5ebd /test/fheap.c | |
parent | ce859f41bb12e07ecb8dff6a783ca21e782ad6fe (diff) | |
download | hdf5-87449d081d1c99312034d917502f2b6aca2ee60c.zip hdf5-87449d081d1c99312034d917502f2b6aca2ee60c.tar.gz hdf5-87449d081d1c99312034d917502f2b6aca2ee60c.tar.bz2 |
[svn-r12517] Description:
Fix the last scattered bunch of problems with the object deletion code,
which appears to be completely working now (for objects that are stored
within heap blocks - standalone objects aren't implemented yet).
Also, re-work the regression test to speed up some of the existing tests
and add in 100-200 more combinations of tests - overall, its probably even
slower than it was... :-/
Tested:
FreeBSD 4.11 (sleipnir)
Linux 2.4 (chicago)
Mac OS X (amazon)
Diffstat (limited to 'test/fheap.c')
-rw-r--r-- | test/fheap.c | 9560 |
1 files changed, 6337 insertions, 3223 deletions
diff --git a/test/fheap.c b/test/fheap.c index be72650..c7ae68e 100644 --- a/test/fheap.c +++ b/test/fheap.c @@ -33,15 +33,17 @@ /* Object size macros */ #define SMALL_OBJ_SIZE1 10 #define SMALL_OBJ_SIZE2 20 +#define NUM_FILL_OBJS 11 /* "Small" heap creation parameters */ -#define SMALL_ADDRMAP H5HF_ABSOLUTE /* Heap address mapping */ -#define SMALL_STAND_SIZE (48 * 1024) /* Standalone obj. min. size */ -#define SMALL_MAN_WIDTH 4 /* Managed obj. table width */ -#define SMALL_MAN_START_BLOCK_SIZE 512 /* Managed obj. starting block size */ -#define SMALL_MAN_MAX_DIRECT_SIZE (64 * 1024) /* Managed obj. max. direct block size */ -#define SMALL_MAN_MAX_INDEX 32 /* Managed obj. # of bits for total heap size */ -#define SMALL_MAN_START_ROOT_ROWS 1 /* Managed obj. starting # of root indirect block rows */ +#define SMALL_ADDRMAP H5HF_ABSOLUTE /* Heap address mapping */ +#define SMALL_DBLOCK_OVERHEAD 22 /* Overhead for direct blocks */ +#define SMALL_MAN_WIDTH 4 /* Managed obj. table width */ +#define SMALL_MAN_START_BLOCK_SIZE 512 /* Managed obj. starting block size */ +#define SMALL_MAN_MAX_DIRECT_SIZE (64 * 1024) /* Managed obj. max. direct block size */ +#define SMALL_MAN_MAX_INDEX 32 /* Managed obj. # of bits for total heap size */ +#define SMALL_MAN_START_ROOT_ROWS 1 /* Managed obj. starting # of root indirect block rows */ +#define SMALL_STAND_SIZE (SMALL_MAN_MAX_DIRECT_SIZE - SMALL_DBLOCK_OVERHEAD) /* Standalone obj. min. size */ /* Define this macro to enable all insertion tests */ /* #define ALL_INSERT_TESTS */ @@ -69,23 +71,31 @@ typedef enum { /* Order to delete objects */ typedef enum { - HEAP_DEL_FORWARD, /* Delete objects from 0 -> nobjs */ - HEAP_DEL_REVERSE, /* Delete objects from nobjs -> 0 */ - HEAP_DEL_NDIRS /* The number of different deletion orders, must be last */ + FHEAP_DEL_FORWARD, /* Delete objects from 0 -> nobjs */ + FHEAP_DEL_REVERSE, /* Delete objects from nobjs -> 0 */ + FHEAP_DEL_NDIRS /* The number of different deletion orders, must be last */ } fheap_test_del_dir_t; /* Order to delete objects */ typedef enum { - HEAP_DEL_DRAIN_ALL, /* Don't drain half of objects first */ - HEAP_DEL_DRAIN_HALF, /* Don't drain half of objects first */ - HEAP_DEL_DRAIN_N /* The number of different ways to drain, must be last */ + FHEAP_DEL_DRAIN_ALL, /* Don't drain half of objects first */ + FHEAP_DEL_DRAIN_HALF, /* Don't drain half of objects first */ + FHEAP_DEL_DRAIN_N /* The number of different ways to drain, must be last */ } fheap_test_del_drain_t; +/* Size of objects for "bulk" filling heap blocks */ +typedef enum { + FHEAP_TEST_FILL_LARGE, /* Fill heap blocks with "large" objects */ + FHEAP_TEST_FILL_SINGLE, /* Fill heap blocks with single object */ + FHEAP_TEST_FILL_N /* The number of different ways to test filling heap blocks, must be last */ +} fheap_test_fill_t; + /* Testing parameters */ typedef struct fheap_test_param_t { fheap_test_type_t reopen_heap; /* Whether to re-open the heap during the test */ fheap_test_del_dir_t del_dir; /* Whether to delete objects forward or reverse */ fheap_test_del_drain_t drain_half; /* Whether to drain half of the objects & refill, when deleting objects */ + fheap_test_fill_t fill; /* How to "bulk" fill heap blocks */ } fheap_test_param_t; /* Heap state information */ @@ -233,15 +243,14 @@ error: *------------------------------------------------------------------------- */ static int -add_obj(H5HF_t *fh, hid_t dxpl, unsigned obj_off, size_t obj_size, - fheap_heap_state_t *state, fheap_heap_ids_t *keep_ids) +add_obj(H5HF_t *fh, hid_t dxpl, unsigned obj_off, + size_t obj_size, fheap_heap_state_t *state, fheap_heap_ids_t *keep_ids) { unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object inserted */ unsigned char *obj; /* Buffer for object to insert */ /* Sanity check */ HDassert(fh); - HDassert(state); /* Initialize object buffer */ obj = &shared_wobj_g[obj_off]; @@ -251,13 +260,16 @@ add_obj(H5HF_t *fh, hid_t dxpl, unsigned obj_off, size_t obj_size, if(H5HF_insert(fh, dxpl, obj_size, obj, heap_id) < 0) FAIL_STACK_ERROR - /* Adjust state of heap */ - state->nobjs++; - state->man_free_space -= obj_size; + /* Check for tracking the heap's state */ + if(state) { + /* Adjust state of heap */ + state->nobjs++; + state->man_free_space -= obj_size; - /* Check free space left in heap */ - if(check_stats(fh, state)) - FAIL_STACK_ERROR + /* Check free space left in heap */ + if(check_stats(fh, state)) + FAIL_STACK_ERROR + } /* end if */ /* Read in object */ if(H5HF_read(fh, dxpl, heap_id, shared_robj_g) < 0) @@ -279,7 +291,7 @@ add_obj(H5HF_t *fh, hid_t dxpl, unsigned obj_off, size_t obj_size, } /* end if */ /* Append the object info onto the array */ - HDmemcpy(&keep_ids->ids[keep_ids->num_ids * HEAP_ID_LEN], obj, HEAP_ID_LEN); + HDmemcpy(&keep_ids->ids[keep_ids->num_ids * HEAP_ID_LEN], heap_id, HEAP_ID_LEN); keep_ids->lens[keep_ids->num_ids] = obj_size; keep_ids->offs[keep_ids->num_ids] = obj_off; @@ -310,18 +322,18 @@ error: *------------------------------------------------------------------------- */ static char * -get_del_string(fheap_test_param_t *tparam) +get_del_string(const fheap_test_param_t *tparam) { char *str; /* Remove half of total objects from heap */ - if(tparam->del_dir == HEAP_DEL_FORWARD) - if(tparam->drain_half == HEAP_DEL_DRAIN_ALL) + if(tparam->del_dir == FHEAP_DEL_FORWARD) + if(tparam->drain_half == FHEAP_DEL_DRAIN_ALL) str = HDstrdup("(all - forward)"); else str = HDstrdup("(half, refill, all - forward)"); else - if(tparam->drain_half == HEAP_DEL_DRAIN_ALL) + if(tparam->drain_half == FHEAP_DEL_DRAIN_ALL) str = HDstrdup("(all - reverse)"); else str = HDstrdup("(half, refill, all - reverse)"); @@ -331,6 +343,37 @@ get_del_string(fheap_test_param_t *tparam) /*------------------------------------------------------------------------- + * Function: get_fill_size + * + * Purpose: Retrieve the size of objects to "bulk" fill blocks with + * + * Return: Size of object to pass down to "fill_heap" routine on + * success/can't fail + * + * Programmer: Quincey Koziol + * Thursday, July 27, 2006 + * + *------------------------------------------------------------------------- + */ +static size_t +get_fill_size(const fheap_test_param_t *tparam) +{ + switch(tparam->fill) { + case FHEAP_TEST_FILL_LARGE: + return((size_t)(-1)); + + case FHEAP_TEST_FILL_SINGLE: + return((size_t)0); + + default: + HDassert(0 && "Unknown bulk fill type?!?"); + } /* end switch */ + + return(0); +} /* get_fill_size() */ + + +/*------------------------------------------------------------------------- * Function: del_objs_half_refill * * Purpose: Remove half of objects from heap and refill @@ -346,7 +389,7 @@ get_del_string(fheap_test_param_t *tparam) */ static int del_objs_half_refill(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tparam, - fheap_heap_state_t *state, fheap_heap_ids_t *keep_ids) + fheap_heap_ids_t *keep_ids) { unsigned char *wobj; /* Buffer for object to insert */ haddr_t fh_addr; /* Address of fractal heap */ @@ -357,7 +400,6 @@ del_objs_half_refill(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tpar /* Sanity check */ HDassert(fh); HDassert(*fh); - HDassert(state); HDassert(keep_ids); /* Check for closing & re-opening the heap */ @@ -369,11 +411,11 @@ del_objs_half_refill(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tpar } /* end if */ /* Remove half of total objects from heap */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx = 0; else - obj_idx = state->nobjs - 1; - half_nobjs = state->nobjs / 2; + obj_idx = keep_ids->num_ids - 1; + half_nobjs = keep_ids->num_ids / 2; for(u = 0; u < half_nobjs; u++) { /* Remove object from heap */ if(H5HF_remove(*fh, dxpl, &keep_ids->ids[HEAP_ID_LEN * obj_idx]) < 0) @@ -391,17 +433,17 @@ del_objs_half_refill(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tpar } /* end if */ /* Adjust index of object to delete next */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx++; else obj_idx--; } /* end for */ /* Re-insert half of total objects back into heap */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx = 0; else - obj_idx = state->nobjs - 1; + obj_idx = keep_ids->num_ids - 1; for(u = 0; u < half_nobjs; u++) { /* Re-insert object */ wobj = &shared_wobj_g[keep_ids->offs[obj_idx]]; @@ -420,7 +462,7 @@ del_objs_half_refill(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tpar } /* end if */ /* Adjust index of object to delete next */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx++; else obj_idx--; @@ -463,8 +505,8 @@ del_objs(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tparam, HDassert(keep_ids); /* Check for first deleting half of objects & then re-inserting them */ - if(tparam->drain_half == HEAP_DEL_DRAIN_HALF) - if(del_objs_half_refill(f, dxpl, fh, tparam, state, keep_ids)) + if(tparam->drain_half == FHEAP_DEL_DRAIN_HALF) + if(del_objs_half_refill(f, dxpl, fh, tparam, keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -476,11 +518,11 @@ del_objs(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tparam, } /* end if */ /* Remove all objects from heap */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx = 0; else - obj_idx = state->nobjs - 1; - for(u = 0; u < state->nobjs; u++) { + obj_idx = keep_ids->num_ids - 1; + for(u = 0; u < keep_ids->num_ids; u++) { /* Remove object from heap */ if(H5HF_remove(*fh, dxpl, &keep_ids->ids[HEAP_ID_LEN * obj_idx]) < 0) FAIL_STACK_ERROR @@ -497,18 +539,16 @@ del_objs(H5F_t *f, hid_t dxpl, H5HF_t **fh, fheap_test_param_t *tparam, } /* end if */ /* Adjust index of object to delete next */ - if(tparam->del_dir == HEAP_DEL_FORWARD) + if(tparam->del_dir == FHEAP_DEL_FORWARD) obj_idx++; else obj_idx--; } /* end for */ + /* Heap should be completely empty now, reset our state */ + HDmemset(state, 0, sizeof(fheap_heap_state_t)); + /* Check up on heap... */ - state->heap_size = 0; - state->man_size = 0; - state->man_alloc_size = 0; - state->man_free_space = 0; - state->nobjs = 0; if(check_stats(*fh, state)) FAIL_STACK_ERROR @@ -572,6 +612,12 @@ fill_heap(H5HF_t *fh, hid_t dxpl, unsigned block_row, size_t obj_size, curr_off_ptr = shared_offs_g; obj_off = 0; + /* Check for some "magic" object sizes */ + if(obj_size == 0) + obj_size = data_size; + else if(obj_size == (size_t)(-1)) + obj_size = (data_size / NUM_FILL_OBJS) + 1; + /* Loop over inserting objects into the root direct block, until there's no more space */ while(data_size >= obj_size) { /* Increment object count */ @@ -1732,6 +1778,7 @@ test_abs_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -1763,12 +1810,15 @@ test_abs_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t */ TESTING("inserting objects to fill absolute heap's root direct block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill the heap up */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -1831,6 +1881,7 @@ test_abs_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_par H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -1862,12 +1913,15 @@ test_abs_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_par */ TESTING("inserting objects to create root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill the heap up */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -1938,6 +1992,7 @@ test_abs_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -1969,12 +2024,15 @@ test_abs_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_ */ TESTING("inserting objects to fill second direct block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill the first direct block heap up */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -1993,7 +2051,7 @@ test_abs_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_ state.man_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); state.man_alloc_size += DBLOCK_SIZE(fh, 0); state.man_free_space = (cparam->managed.width - 1) * DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -2046,6 +2104,7 @@ test_abs_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2077,12 +2136,15 @@ test_abs_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param */ TESTING("inserting objects to create third direct block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill the first direct block up */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill the second direct block heap up (also creates initial root indirect block) */ @@ -2090,7 +2152,7 @@ test_abs_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param state.man_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); state.man_alloc_size += DBLOCK_SIZE(fh, 0); state.man_free_space = (cparam->managed.width - 1) * DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2158,6 +2220,7 @@ test_abs_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2189,8 +2252,11 @@ test_abs_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t */ TESTING("inserting objects to fill first row of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill first row of [root] indirect block */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2253,6 +2319,7 @@ test_abs_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2284,8 +2351,11 @@ test_abs_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t */ TESTING("inserting objects to start second row of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill first root indirect row */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2356,6 +2426,7 @@ test_abs_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2387,8 +2458,11 @@ test_abs_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * */ TESTING("inserting objects to fill second row of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill first root indirect row */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2403,7 +2477,7 @@ test_abs_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * } /* end if */ /* Fill second root indirect row */ - if(fill_root_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -2456,6 +2530,7 @@ test_abs_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2487,12 +2562,15 @@ test_abs_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * */ TESTING("inserting objects to start third row of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill first root indirect row */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill second root indirect row */ - if(fill_root_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2567,6 +2645,7 @@ test_abs_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ unsigned u; /* Local index variables */ @@ -2599,9 +2678,12 @@ test_abs_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * */ TESTING("inserting objects to fill four rows of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Loop over rows */ for(u = 0; u < 4; u++) - if(fill_root_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, u, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2664,6 +2746,7 @@ test_abs_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2695,8 +2778,11 @@ test_abs_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para */ TESTING("inserting objects to fill all direct rows of root indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill all direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2759,6 +2845,7 @@ test_abs_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2790,8 +2877,11 @@ test_abs_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_ */ TESTING("inserting objects to create first recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2860,6 +2950,7 @@ test_abs_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhe H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -2892,13 +2983,16 @@ test_abs_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhe */ TESTING("inserting objects to create second direct block in first recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill the first direct block in the recursive indirect block up */ state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -2969,6 +3063,7 @@ test_abs_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3001,8 +3096,11 @@ test_abs_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_ */ TESTING("inserting objects to fill all direct blocks in first recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3017,7 +3115,7 @@ test_abs_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_ } /* end if */ /* Fill first recursive indirect block */ - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3071,6 +3169,7 @@ test_abs_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3103,12 +3202,15 @@ test_abs_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test */ TESTING("inserting objects to start second recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill first recursive indirect block */ - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3181,6 +3283,7 @@ test_abs_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3213,12 +3316,15 @@ test_abs_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap */ TESTING("inserting objects to fill all direct blocks in second recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill first recursive indirect block */ - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3233,7 +3339,7 @@ test_abs_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap } /* end if */ /* Fill 2nd recursive indirect block */ - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3288,6 +3394,7 @@ test_abs_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3320,8 +3427,11 @@ test_abs_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te */ TESTING("inserting objects to fill all direct blocks in first row of recursive indirect block"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks in root indirect block up */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3336,7 +3446,7 @@ test_abs_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te } /* end if */ /* Fill row of recursive indirect blocks */ - if(fill_2nd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3389,6 +3499,7 @@ test_abs_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3421,12 +3532,15 @@ test_abs_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t */ TESTING("inserting objects to start second row of recursive indirect blocks"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks in root indirect block up */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill row of recursive indirect blocks */ - if(fill_2nd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3497,6 +3611,7 @@ test_abs_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3529,8 +3644,11 @@ test_abs_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te */ TESTING("inserting objects to fill recursive indirect blocks two levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3545,7 +3663,7 @@ test_abs_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3599,6 +3717,7 @@ test_abs_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3631,12 +3750,15 @@ test_abs_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t */ TESTING("inserting objects to start recursive indirect blocks three levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3708,6 +3830,7 @@ test_abs_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3740,16 +3863,19 @@ test_abs_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh */ TESTING("inserting objects to fill first indirect block of recursive indirect blocks three levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all direct block rows in third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3764,7 +3890,7 @@ test_abs_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh } /* end if */ /* Fill row of recursive indirect blocks in third level indirect block */ - if(fill_2nd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3818,6 +3944,7 @@ test_abs_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3850,12 +3977,15 @@ test_abs_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea */ TESTING("inserting objects to fill row of indirect blocks in recursive indirect blocks three levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3870,7 +4000,7 @@ test_abs_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea } /* end if */ /* Fill 1st row of 3rd level indirect blocks */ - if(fill_3rd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -3924,6 +4054,7 @@ test_abs_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -3956,12 +4087,15 @@ test_abs_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea */ TESTING("inserting objects to fill row of indirect blocks in recursive indirect blocks three levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -3976,7 +4110,7 @@ test_abs_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -4031,6 +4165,7 @@ test_abs_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -4063,16 +4198,19 @@ test_abs_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t */ TESTING("inserting objects to start first direct block in recursive indirect blocks four levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4145,6 +4283,7 @@ test_abs_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -4177,24 +4316,27 @@ test_abs_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh */ TESTING("inserting objects to fill first (3rd level) indirect block in recursive indirect block four levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill direct block rows in fourth level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level deep indirect blocks in fourth level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4209,7 +4351,7 @@ test_abs_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh } /* end if */ /* Fill first row of 3rd level deep indirect blocks in fourth level indirect block */ - if(fill_3rd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -4264,6 +4406,7 @@ test_abs_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -4296,16 +4439,19 @@ test_abs_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea */ TESTING("inserting objects to fill first row of recursive indirect blocks four levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4320,7 +4466,7 @@ test_abs_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea } /* end if */ /* Fill 1st row of 4th level indirect blocks */ - if(fill_4th_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_4th_indirect_row(fh, dxpl, 1, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -4375,6 +4521,7 @@ test_abs_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -4407,16 +4554,19 @@ test_abs_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea */ TESTING("inserting objects to fill all rows of recursive indirect blocks four levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4431,7 +4581,7 @@ test_abs_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea } /* end if */ /* Fill all rows of 4th level indirect blocks */ - if(fill_all_4th_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_4th_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Close the fractal heap */ @@ -4489,6 +4639,7 @@ test_abs_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ size_t id_len; /* Size of fractal heap IDs */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ /* Set the filename to use for this test (dependent on fapl) */ @@ -4522,8 +4673,11 @@ test_abs_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t */ TESTING("inserting objects to create first direct block in recursive indirect blocks five levels deep"); + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + /* Fill direct blocks up in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4538,7 +4692,7 @@ test_abs_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4553,7 +4707,7 @@ test_abs_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4568,7 +4722,7 @@ test_abs_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t } /* end if */ /* Fill all rows of 4th level indirect blocks */ - if(fill_all_4th_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_4th_indirect_rows(fh, dxpl, fill_size, &state, NULL)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4615,12 +4769,2791 @@ error: #ifndef QAK /*------------------------------------------------------------------------- + * Function: test_abs_remove_bogus + * + * Purpose: Test removing bogus heap IDs + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, May 15, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ + size_t id_len; /* Size of fractal heap IDs */ + hsize_t obj_off; /* Offset of object in heap */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + herr_t ret; /* Generic return value */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* + * Test removing bogus IDs from heap + */ + TESTING("removing bad heap IDs from absolute heap"); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Set heap ID to random (non-null) value */ + for(u = 0; u < HEAP_ID_LEN; u++) + heap_id[u] = HDrandom() + 1; + + /* Try removing bogus heap ID from empty heap */ + H5E_BEGIN_TRY { + ret = H5HF_remove(fh, dxpl, heap_id); + } H5E_END_TRY; + if(ret >= 0) + FAIL_STACK_ERROR + + /* Fill root direct blocks */ + if(fill_root_direct(fh, dxpl, fill_size, &state, NULL)) + FAIL_STACK_ERROR + + /* Get offset of random heap ID */ + if(H5HF_get_id_off_test(fh, heap_id, &obj_off) < 0) + FAIL_STACK_ERROR + + /* Make certain we can't accidentally use a valid heap ID */ + while(obj_off < state.heap_size) { + /* Set heap ID to random (non-null) value */ + for(u = 0; u < HEAP_ID_LEN; u++) + heap_id[u] = HDrandom() + 1; + + /* Get offset of random heap ID */ + if(H5HF_get_id_off_test(fh, heap_id, &obj_off) < 0) + FAIL_STACK_ERROR + } /* end while */ + + /* Try removing bogus heap ID from heap w/objects */ + H5E_BEGIN_TRY { + ret = H5HF_remove(fh, dxpl, heap_id); + } H5E_END_TRY; + if(ret >= 0) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_bogus() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_one + * + * Purpose: Test removing single object from heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, May 15, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ + unsigned char obj[SMALL_OBJ_SIZE1]; /* Buffer for object to insert */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test removing first (small) object from absolute heap + */ + TESTING("removing single object from absolute heap"); + + /* Initialize the buffer for objects to insert */ + for(u = 0; u < sizeof(obj); u++) + obj[u] = u; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = DBLOCK_SIZE(fh, 0); + state.man_size = DBLOCK_SIZE(fh, 0); + state.man_alloc_size = DBLOCK_SIZE(fh, 0); + state.man_free_space = DBLOCK_FREE(fh, 0) - sizeof(obj); + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove object from heap */ + if(H5HF_remove(fh, dxpl, heap_id) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = 0; + state.man_size = 0; + state.man_alloc_size = 0; + state.man_free_space = 0; + state.nobjs = 0; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_one() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_two + * + * Purpose: Test removing two objects from heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, May 22, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ + unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ + unsigned char obj[SMALL_OBJ_SIZE1]; /* Buffer for object to insert */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test removing two (small) objects from absolute heap + */ + TESTING("removing two objects from absolute heap"); + + /* Initialize the buffer for objects to insert */ + for(u = 0; u < sizeof(obj); u++) + obj[u] = u; + + /* Insert first object into heap */ + if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = DBLOCK_SIZE(fh, 0); + state.man_size = DBLOCK_SIZE(fh, 0); + state.man_alloc_size = DBLOCK_SIZE(fh, 0); + state.man_free_space = DBLOCK_FREE(fh, 0) - sizeof(obj); + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Insert second object into heap */ + if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.man_free_space -= sizeof(obj); + state.nobjs++; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove first object from heap */ + if(H5HF_remove(fh, dxpl, heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.man_free_space += sizeof(obj); + state.nobjs--; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove second object from heap */ + if(H5HF_remove(fh, dxpl, heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = 0; + state.man_size = 0; + state.man_alloc_size = 0; + state.man_free_space = 0; + state.nobjs = 0; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_two() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_one_larger + * + * Purpose: Test removing single larger (but < standalone size) object + * from heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Tuesday, June 6, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ + unsigned char *obj; /* Buffer for object to insert */ + size_t obj_len; /* Length of object to insert */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test removing one larger object from absolute heap + */ + TESTING("removing single larger object from absolute heap"); + + /* Set up object to insert */ + obj_len = DBLOCK_SIZE(fh, 2) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + for(u = 0; u < 4; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size = DBLOCK_SIZE(fh, 3); + state.man_free_space -= obj_len; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove object from heap */ + if(H5HF_remove(fh, dxpl, heap_id) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = 0; + state.man_size = 0; + state.man_alloc_size = 0; + state.man_free_space = 0; + state.nobjs = 0; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + FAIL_STACK_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_one_larger() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_two_larger + * + * Purpose: Test removing two larger (but < standalone size) objects + * from heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Saturday, June 10, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ + unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ + unsigned char *obj; /* Buffer for object to insert */ + size_t obj_len; /* Length of object to insert */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test removing two larger objects from absolute heap + */ + if(tparam->del_dir == FHEAP_DEL_FORWARD) + TESTING("removing two larger objects from absolute heap (forward)") + else + TESTING("removing two larger objects from absolute heap (reverse)") + + /* Set up first object to insert */ + obj_len = DBLOCK_SIZE(fh, 2) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + for(u = 0; u < 4; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size = DBLOCK_SIZE(fh, 3); + state.man_free_space -= obj_len; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Set up second object to insert */ + obj_len = DBLOCK_SIZE(fh, 4) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 8 rows because of doubling) */ + for(u = 4; u < 8; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size += DBLOCK_SIZE(fh, 5); + state.man_free_space -= obj_len; + state.nobjs = 2; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove objects in different orders */ + if(tparam->del_dir == FHEAP_DEL_FORWARD) { + /* Remove first object from heap */ + if(H5HF_remove(fh, dxpl, heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 3); + state.man_free_space += DBLOCK_SIZE(fh, 2) + 1; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove second object from heap */ + if(H5HF_remove(fh, dxpl, heap_id2) < 0) + FAIL_STACK_ERROR + } /* end if */ + else { + /* Remove second object from heap */ + if(H5HF_remove(fh, dxpl, heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 4 rows because of halving) */ + for(u = 4; u < 8; u++) { + state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 5); + state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove first object from heap */ + if(H5HF_remove(fh, dxpl, heap_id1) < 0) + FAIL_STACK_ERROR + } /* end else */ + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = 0; + state.man_size = 0; + state.man_alloc_size = 0; + state.man_free_space = 0; + state.nobjs = 0; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + if(file_size != empty_size) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_two_larger() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_three_larger + * + * Purpose: Test removing three larger (but < standalone size) objects + * from heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, June 12, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ + unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ + unsigned char heap_id3[HEAP_ID_LEN]; /* Heap ID for third object */ + unsigned char *obj; /* Buffer for object to insert */ + size_t obj_len; /* Length of object to insert */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + fheap_heap_state_t state; /* State of fractal heap */ + unsigned u; /* Local index variable */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test removing three larger objects from absolute heap + */ + if(tparam->del_dir == FHEAP_DEL_FORWARD) + TESTING("removing three larger objects from absolute heap (forward)") + else + TESTING("removing three larger objects from absolute heap (reverse)") + + /* Set up first object to insert */ + obj_len = DBLOCK_SIZE(fh, 2) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + for(u = 0; u < 4; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size = DBLOCK_SIZE(fh, 3); + state.man_free_space -= obj_len; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Set up second object to insert */ + obj_len = DBLOCK_SIZE(fh, 4) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 8 rows because of doubling) */ + for(u = 4; u < 8; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size += DBLOCK_SIZE(fh, 5); + state.man_free_space -= obj_len; + state.nobjs = 2; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Set up third object to insert */ + obj_len = DBLOCK_SIZE(fh, 7) + 1; + obj = shared_wobj_g; + + /* Insert object into heap */ + if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id3) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 16 rows because of doubling) */ + for(u = 8; u < 16; u++) { + state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size += DBLOCK_SIZE(fh, 8); + state.man_free_space -= obj_len; + state.nobjs = 3; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove objects in different orders */ + if(tparam->del_dir == FHEAP_DEL_FORWARD) { + /* Remove first object from heap */ + if(H5HF_remove(fh, dxpl, heap_id1) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 3); + state.man_free_space += DBLOCK_SIZE(fh, 2) + 1; + state.nobjs = 2; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove second object from heap */ + if(H5HF_remove(fh, dxpl, heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 5); + state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove third object from heap */ + if(H5HF_remove(fh, dxpl, heap_id3) < 0) + FAIL_STACK_ERROR + } /* end if */ + else { + /* Remove third object from heap */ + if(H5HF_remove(fh, dxpl, heap_id3) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 8 rows because of halving) */ + for(u = 8; u < 16; u++) { + state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 8); + state.man_free_space += DBLOCK_SIZE(fh, 7) + 1; + state.nobjs = 2; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove second object from heap */ + if(H5HF_remove(fh, dxpl, heap_id2) < 0) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + /* (Goes to 4 rows because of halving) */ + for(u = 4; u < 8; u++) { + state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; + state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; + } /* end for */ + state.man_alloc_size -= DBLOCK_SIZE(fh, 5); + state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; + state.nobjs = 1; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Remove first object from heap */ + if(H5HF_remove(fh, dxpl, heap_id1) < 0) + FAIL_STACK_ERROR + } /* end else */ + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + state.heap_size = 0; + state.man_size = 0; + state.man_alloc_size = 0; + state.man_free_space = 0; + state.nobjs = 0; + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + if(file_size != empty_size) + TEST_ERROR + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_three_larger() */ +#endif /* QAK */ + +#ifndef QAK + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_root_direct + * + * Purpose: Test filling and removing all objects from root direct block in + * heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, May 22, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from root direct block of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from root direct block of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill the heap up */ + state.heap_size = DBLOCK_SIZE(fh, 0); + state.man_size = DBLOCK_SIZE(fh, 0); + state.man_alloc_size = DBLOCK_SIZE(fh, 0); + state.man_free_space = DBLOCK_FREE(fh, 0); + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_root_direct() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_two_direct + * + * Purpose: Test filling and removing all objects from (first) two direct + * blocks in heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, May 22, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from two direct blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from two direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill the first block in heap */ + state.heap_size = DBLOCK_SIZE(fh, 0); + state.man_size = DBLOCK_SIZE(fh, 0); + state.man_alloc_size = DBLOCK_SIZE(fh, 0); + state.man_free_space = DBLOCK_FREE(fh, 0); + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Fill the second block in heap */ + state.heap_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); + state.man_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); + state.man_alloc_size += DBLOCK_SIZE(fh, 0); + state.man_free_space = (cparam->managed.width - 1) * DBLOCK_FREE(fh, 0); + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_two_direct() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_first_row + * + * Purpose: Test filling and removing all objects from first row of direct + * blocks in heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, June 5, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from first row of direct blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill first row of direct blocks */ + if(fill_root_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_first_row() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_first_two_rows + * + * Purpose: Test filling and removing all objects from first two rows of + * direct blocks in heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, June 12, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from first two rows of direct blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill first two rows of direct blocks */ + if(fill_root_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + if(fill_root_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_first_two_rows() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_first_four_rows + * + * Purpose: Test filling and removing all objects from first four rows of + * direct blocks in heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Tuesday, June 13, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_first_four_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from first four rows of direct blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill first two rows of direct blocks */ + if(fill_root_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + if(fill_root_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + if(fill_root_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + if(fill_root_row(fh, dxpl, 3, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_first_four_rows() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_all_root_direct + * + * Purpose: Test filling and removing all objects from all direct blocks + * in root indirect block of heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Tuesday, June 13, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from all direct blocks of root group in absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill direct blocks in root indirect block */ + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_all_root_direct() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_2nd_indirect + * + * Purpose: Test filling and removing all objects up to 2nd level indirect + * blocks of heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Tuesday, June 13, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_2nd_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from 2nd level indirect blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill direct blocks in root indirect block */ + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Fill all rows of 2nd level indirect blocks */ + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + TEST_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_remove_2nd_indirect() */ + + +/*------------------------------------------------------------------------- + * Function: test_abs_remove_3rd_indirect + * + * Purpose: Test filling and removing all objects up to 3rd level indirect + * blocks of heap + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Monday, July 24, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_remove_3rd_indirect(hid_t +#ifdef LATER + UNUSED +#endif /* LATER */ + fapl, H5HF_create_t +#ifdef LATER + UNUSED +#endif /* LATER */ + *cparam, fheap_test_param_t *tparam) +{ +#ifndef LATER + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "removing all objects from 3rd level indirect blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) TEST_ERROR; + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR +#else /* LATER */ + const char *base_desc = "removing all objects from 3rd level indirect blocks of absolute heap %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ +#endif /* LATER */ + + /* + * Display testing message + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + +#ifndef LATER + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Fill direct blocks in root indirect block */ + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Fill all rows of 2nd level indirect blocks */ + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Fill all rows of 3rd level indirect blocks */ + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + FAIL_STACK_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() +#else /* LATER */ + SKIPPED(); + puts(" Takes too long right now"); +#endif /* LATER */ + + return(0); + +#ifndef LATER +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +#endif /* LATER */ +} /* test_abs_remove_3rd_indirect() */ +#endif /* QAK */ + +#ifndef QAK + +/*------------------------------------------------------------------------- * Function: test_abs_skip_start_block * * Purpose: Test inserting object into absolute heap which is too large * for starting block size, which forces root indirect block * creation * + * Then, remove all the objects, in various ways + * * Return: Success: 0 * * Failure: 1 @@ -4639,9 +7572,15 @@ test_abs_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "inserting object that is too large for starting block, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -4669,11 +7608,48 @@ test_abs_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t if(check_stats(fh, &state)) FAIL_STACK_ERROR + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test inserting object into absolute heap which doesn't fit into starting - * block size + * Display testing message */ - TESTING("inserting object that is too large for starting block"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); obj_size = DBLOCK_SIZE(fh, 0) + 1; state.heap_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); @@ -4686,7 +7662,7 @@ test_abs_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t state.man_free_space = cparam->managed.width * DBLOCK_FREE(fh, 0); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4700,14 +7676,39 @@ test_abs_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t FAIL_STACK_ERROR } /* end if */ + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -4715,6 +7716,11 @@ test_abs_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -4748,9 +7754,15 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "skipping starting block, then adding object back to first block, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -4778,11 +7790,48 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test if(check_stats(fh, &state)) FAIL_STACK_ERROR + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test inserting object into absolute heap which doesn't fit into starting - * block size + * Display testing message */ - TESTING("skipping starting block, then adding object back to first block"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); /* Insert object too large for starting block size */ obj_size = DBLOCK_SIZE(fh, 0) + 1; @@ -4796,7 +7845,7 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test state.man_free_space = cparam->managed.width * DBLOCK_FREE(fh, 0); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4812,7 +7861,7 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test /* Insert an object to fill up the heap block just created */ obj_size = DBLOCK_FREE(fh, 2) - obj_size; - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4828,17 +7877,53 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test /* Insert second "real" object, which should go in earlier direct block */ state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(add_obj(fh, dxpl, 20, SMALL_OBJ_SIZE2, &state, NULL)) + if(add_obj(fh, dxpl, 20, SMALL_OBJ_SIZE2, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -4846,6 +7931,11 @@ test_abs_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -4880,9 +7970,16 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "skipping starting block, then adding objects to backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -4910,11 +8007,51 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t if(check_stats(fh, &state)) FAIL_STACK_ERROR + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test inserting object into absolute heap which doesn't fit into starting - * block size + * Display testing message */ - TESTING("skipping starting block, then adding objects to backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Insert object too large for starting block size */ obj_size = DBLOCK_SIZE(fh, 0) + 1; @@ -4928,7 +8065,7 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t state.man_free_space = cparam->managed.width * DBLOCK_FREE(fh, 0); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4944,7 +8081,7 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t /* Insert an object to fill up the heap block just created */ obj_size = DBLOCK_FREE(fh, 2) - obj_size; - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4959,9 +8096,9 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t } /* end if */ /* Add rows of blocks to "backfill" direct blocks that were skipped */ - if(fill_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -4977,17 +8114,53 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t /* Insert another object, which should extend direct blocks, instead of backfill */ state.man_alloc_size += DBLOCK_SIZE(fh, 2); - if(add_obj(fh, dxpl, 20, SMALL_OBJ_SIZE2, &state, NULL)) + if(add_obj(fh, dxpl, 20, SMALL_OBJ_SIZE2, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -4995,6 +8168,11 @@ test_abs_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5029,9 +8207,15 @@ test_abs_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "insert object to initial block, then add object too large for starting direct blocks, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -5056,18 +8240,58 @@ test_abs_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test inserting first (small) object into absolute heap + * Display testing message */ - TESTING("insert object to initial block, then add object too large for starting direct blocks"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); /* Insert small object, to create root direct block */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, NULL)) + if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5095,7 +8319,7 @@ test_abs_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t state.man_free_space += (cparam->managed.width - 1 )* DBLOCK_FREE(fh, 0); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5109,14 +8333,39 @@ test_abs_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t FAIL_STACK_ERROR } /* end if */ + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -5124,6 +8373,11 @@ test_abs_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5161,9 +8415,16 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "insert object to initial block, then add object too large for starting direct blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -5189,18 +8450,61 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test inserting first (small) object into absolute heap + * Display testing message */ - TESTING("insert object to initial block, then add object too large for starting direct blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Insert small object, to create root direct block */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, NULL)) + if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5228,7 +8532,7 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes state.man_free_space += (cparam->managed.width - 1 )* DBLOCK_FREE(fh, 0); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5244,7 +8548,7 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes /* Insert an object to fill up the (smaller) heap block just created */ obj_size = DBLOCK_FREE(fh, 0) - SMALL_OBJ_SIZE1; - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5260,7 +8564,7 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes /* Fill remainder of 2 * start size block */ obj_size = DBLOCK_FREE(fh, 2) - (DBLOCK_SIZE(fh, 0) + 1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5279,12 +8583,12 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes /* Fill remainder of first row of direct heap blocks up */ for(v = 0; v < (cparam->managed.width - 1); v++) { state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ /* Fill second row of direct blocks */ - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5300,16 +8604,52 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes /* Insert one more object, to create new 2 * start size direct block */ state.man_alloc_size += DBLOCK_SIZE(fh, 2); - if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, NULL)) + if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -5318,6 +8658,11 @@ test_abs_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_tes error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5357,9 +8702,16 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "skipping blocks with indirect root, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variable */ /* Set the filename to use for this test (dependent on fapl) */ @@ -5385,18 +8737,61 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("skipping blocks with indirect root, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Fill initial direct block */ state.heap_size = DBLOCK_SIZE(fh, 0); state.man_size = DBLOCK_SIZE(fh, 0); state.man_alloc_size = DBLOCK_SIZE(fh, 0); state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5415,7 +8810,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * state.man_size += (cparam->managed.width - 1) * DBLOCK_SIZE(fh, 0); state.man_alloc_size += DBLOCK_SIZE(fh, 0); state.man_free_space += (cparam->managed.width - 1) * DBLOCK_FREE(fh, 0); - if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, NULL)) + if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5443,7 +8838,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5459,7 +8854,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * /* Insert an object to fill up the (smaller) heap block just created */ obj_size = DBLOCK_FREE(fh, 0) - SMALL_OBJ_SIZE1; - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5475,7 +8870,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * /* Insert object to fill remainder of 4 * start size block */ obj_size = DBLOCK_FREE(fh, 3) - (DBLOCK_SIZE(fh, 2) + 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5493,7 +8888,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * for(u = 0; u < (cparam->managed.width - 2); u++) { /* Fill a direct heap block up */ state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_heap(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -5509,7 +8904,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * } /* end if */ /* Insert objects to fill remaining heaps in second row */ - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5524,7 +8919,7 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * } /* end if */ /* Insert objects to fill remaining heaps in third row */ - if(fill_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5540,17 +8935,53 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * /* Insert one more object, to create new 4 * start size direct block */ state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, NULL)) + if(add_obj(fh, dxpl, 10, SMALL_OBJ_SIZE1, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -5558,6 +8989,11 @@ test_abs_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t * error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5596,9 +9032,16 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling first row, then skipping rows, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -5623,14 +9066,57 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling first row, then skipping rows, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Fill first row of direct blocks */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5658,7 +9144,7 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 1); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 2); state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, 3); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5674,7 +9160,7 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test /* Insert object to fill remainder of 4 * start size block */ obj_size = DBLOCK_FREE(fh, 3) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5689,7 +9175,7 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test } /* end if */ /* Insert objects to fill remaining heaps in second row */ - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5704,7 +9190,7 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test } /* end if */ /* Insert objects to fill remaining heaps in third row */ - if(fill_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5720,17 +9206,53 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test /* Insert one more object, to create new 4 * start size direct block */ state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -5738,6 +9260,11 @@ test_abs_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5747,6 +9274,244 @@ error: /*------------------------------------------------------------------------- + * Function: test_abs_skip_direct_skip_indirect_two_rows_add_skipped + * + * Purpose: Test adding object too large for all but the last row in the + * direct blocks in root indirect block, then + * add object too large for initial block in first two rows of + * indirect blocks, to force extension of non-root + * indirect block (and range of skipped blocks). + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: Quincey Koziol + * Saturday, April 15, 2006 + * + *------------------------------------------------------------------------- + */ +static int +test_abs_skip_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +{ + hid_t file = -1; /* File ID */ + hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ + char filename[1024]; /* Filename to use */ + H5F_t *f = NULL; /* Internal file object pointer */ + H5HF_t *fh = NULL; /* Fractal heap wrapper */ + haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ + size_t id_len; /* Size of fractal heap IDs */ + unsigned num_direct_rows; /* Number of rows (of direct blocks) in root indirect block */ + unsigned row; /* Current row */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ + size_t obj_size; /* Size of object */ + fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "skipping direct blocks to last row and skipping two rows of root indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + unsigned v; /* Local index variables */ + + /* Set the filename to use for this test (dependent on fapl) */ + h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); + + /* Create the file to work on */ + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Create absolute heap */ + if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) + FAIL_STACK_ERROR + if(H5HF_get_id_len(fh, &id_len) < 0) + FAIL_STACK_ERROR + if(id_len > HEAP_ID_LEN) + FAIL_STACK_ERROR + if(H5HF_get_heap_addr(fh, &fh_addr) < 0) + FAIL_STACK_ERROR + if(!H5F_addr_defined(fh_addr)) + FAIL_STACK_ERROR + HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + + /* + * Display testing message + */ + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Compute # direct block rows in root indirect block */ + num_direct_rows = DTABLE_MAX_DROWS(fh); + + /* Compute heap size & free space when half direct blocks allocated */ + row = 0; + do { + state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); + row++; + } while(row < (num_direct_rows / 2)); + + /* Insert object to extend root block to middle of root direct blocks + */ + obj_size = DBLOCK_SIZE(fh, row - 2) + 1; + state.man_alloc_size += DBLOCK_SIZE(fh, row - 1); + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Compute heap size & free space when all direct blocks allocated */ + do { + state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); + row++; + } while(row < num_direct_rows); + + /* Insert large objects into last row of direct blocks in root indirect + * block, to force extension of root indirect block that covers the first + * row of indirect blocks in root indirect block + */ + obj_size = DBLOCK_SIZE(fh, num_direct_rows - 2) + 1; + for(v = 0; v < cparam->managed.width; v++) { + state.man_alloc_size += DBLOCK_SIZE(fh, num_direct_rows - 1); + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + } /* end for */ + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Compute heap size & free space when root indirect block doubles again */ + do { + state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); + state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); + row++; + } while(row < (2 * num_direct_rows)); + + /* Insert large object, to force creation of indirect blocks with + * range of skipped blocks that are too small to hold the large object + */ + obj_size = DBLOCK_SIZE(fh, num_direct_rows - 2) + 1; + state.man_alloc_size += DBLOCK_SIZE(fh, num_direct_rows - 1); + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Close the fractal heap */ + if(H5HF_close(fh, dxpl) < 0) + FAIL_STACK_ERROR + fh = NULL; + + /* Close the file */ + if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + + /* All tests passed */ + PASSED() + + return(0); + +error: + H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); + if(fh) + H5HF_close(fh, dxpl); + H5Fclose(file); + } H5E_END_TRY; + return(1); +} /* test_abs_skip_direct_skip_indirect_two_rows_add_skipped() */ + + +/*------------------------------------------------------------------------- * Function: test_abs_fill_direct_skip_indirect_start_block_add_skipped * * Purpose: Test filling all direct blocks in root indirect block, then @@ -5772,9 +9537,16 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks and skipping blocks in non-root indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -5799,14 +9571,57 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks and skipping blocks in non-root indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5825,7 +9640,7 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea */ obj_size = DBLOCK_SIZE(fh, 2) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5840,9 +9655,9 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea } /* end if */ /* Add rows of blocks to "backfill" direct blocks that were skipped */ - if(fill_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5858,7 +9673,7 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea /* Insert an object to fill up the (biggest) heap block created */ obj_size = DBLOCK_FREE(fh, 3) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5873,7 +9688,7 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea } /* end if */ /* Fill direct block heaps with 2 * initial block size in nested indirect block */ - if(fill_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -5890,17 +9705,53 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea /* Insert one more object, to create new 4 * start size direct block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -5908,6 +9759,11 @@ test_abs_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_crea error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -5943,11 +9799,18 @@ test_abs_fill_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H5HF_ H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ unsigned row; /* Current row in indirect block */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks and skipping row of non-root indirect blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variable */ /* Set the filename to use for this test (dependent on fapl) */ @@ -5973,20 +9836,60 @@ test_abs_fill_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H5HF_ if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks and skipping row of non-root indirect blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6005,11 +9908,8 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); * object */ obj_size = DBLOCK_SIZE(fh, num_first_indirect_rows - 1) + 1; -#ifdef QAK -HDfprintf(stderr, "obj_size = %Zu\n", obj_size); -#endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6025,7 +9925,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6043,11 +9943,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(row = 0; row < num_first_indirect_rows; row++) { /* Fill rows of direct blocks in skipped indirect blocks */ for(u = 0; u < cparam->managed.width; u++) - if(fill_row(fh, dxpl, row, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, row, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill row of direct blocks in largest (i.e. non-skipped) indirect block */ - if(fill_row(fh, dxpl, row, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, row, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -6065,17 +9965,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) FAIL_STACK_ERROR + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -6083,6 +10019,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -6119,10 +10060,17 @@ test_abs_fill_2nd_direct_less_one_wrap_start_block_add_skipped(hid_t fapl, H5HF_ H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, except last one, and insert object too large for 2nd level indirect blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -6148,20 +10096,60 @@ test_abs_fill_2nd_direct_less_one_wrap_start_block_add_skipped(hid_t fapl, H5HF_ if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, except last one, and insert object too large for 2nd level indirect blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6178,7 +10166,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill first row (except one) of 2nd level indirect blocks */ for(u = 0; u < cparam->managed.width - 1; u++) /* Fill all rows of 2nd level indirect blocks in root block */ - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6201,7 +10189,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6217,7 +10205,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6236,11 +10224,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); */ for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in skipped 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in current 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -6258,17 +10246,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -6276,6 +10300,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -6315,11 +10344,18 @@ test_abs_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(hid_t fapl, H5 H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ unsigned row; /* Current row in indirect block */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks and skipping row of non-root indirect blocks, then skip row of direct blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variable */ /* Set the filename to use for this test (dependent on fapl) */ @@ -6345,20 +10381,60 @@ test_abs_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(hid_t fapl, H5 if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks and skipping row of non-root indirect blocks, then skip row of direct blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6381,7 +10457,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6397,7 +10473,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6417,7 +10493,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, 4); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6436,7 +10512,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #ifdef QAK HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6454,7 +10530,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); obj_size = DBLOCK_FREE(fh, 4); for(u = 1; u < cparam->managed.width; u++) { state.man_alloc_size += DBLOCK_SIZE(fh, 4); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -6473,13 +10549,13 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(row = 0; row < num_first_indirect_rows; row++) { /* Fill rows of direct blocks in skipped indirect blocks */ for(u = 0; u < cparam->managed.width; u++) - if(fill_row(fh, dxpl, row, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, row, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill row of direct blocks in largest (i.e. non-skipped) indirect block */ /* (Skip the row of blocks filled above) */ if(row != 4) - if(fill_row(fh, dxpl, row, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, row, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end while */ @@ -6497,16 +10573,52 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -6515,6 +10627,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -6549,11 +10666,18 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ unsigned max_dblock_rows; /* Max. # of rows (of direct blocks) in the root indirect block */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks and skipping two rows of root indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -6579,18 +10703,61 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); - max_dblock_rows = DTABLE_MAX_DROWS(fh); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks and skipping two rows of root indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + max_dblock_rows = DTABLE_MAX_DROWS(fh); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6609,7 +10776,7 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ */ obj_size = DBLOCK_SIZE(fh, max_dblock_rows - 2) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, max_dblock_rows - 1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6625,7 +10792,7 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ /* Insert an object to fill up the (biggest) heap block created */ obj_size = DBLOCK_FREE(fh, max_dblock_rows - 1) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6643,16 +10810,16 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in first row of skipped 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block rows in second row of skipped 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in used 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -6671,7 +10838,7 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ /* Direct block rows in skipped 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, num_first_indirect_rows, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, num_first_indirect_rows, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6686,7 +10853,7 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ } /* end if */ /* Direct block row in used 2nd level indirect block */ - if(fill_row(fh, dxpl, num_first_indirect_rows, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, num_first_indirect_rows, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6703,16 +10870,52 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, max_dblock_rows - 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -6721,6 +10924,11 @@ test_abs_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -6757,11 +10965,18 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ unsigned max_dblock_rows; /* Max. # of rows (of direct blocks) in the root indirect block */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks and skipping two rows of root indirect block, skip one row of root indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -6787,18 +11002,61 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); - max_dblock_rows = DTABLE_MAX_DROWS(fh); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks and skipping two rows of root indirect block, skip one row of root indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + max_dblock_rows = DTABLE_MAX_DROWS(fh); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6817,7 +11075,7 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t */ obj_size = DBLOCK_SIZE(fh, max_dblock_rows - 2) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, max_dblock_rows - 1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6833,7 +11091,7 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t /* Insert an object to fill up the (biggest) heap block created */ obj_size = DBLOCK_FREE(fh, max_dblock_rows - 1) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6853,7 +11111,7 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t */ obj_size = DBLOCK_SIZE(fh, max_dblock_rows - 3) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, max_dblock_rows - 2); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6869,7 +11127,7 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t /* Insert an object to fill up the (2nd biggest) heap block created */ obj_size = DBLOCK_FREE(fh, max_dblock_rows - 2) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6887,16 +11145,16 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in first row of skipped 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block rows in second row of skipped 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in used 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -6914,13 +11172,13 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t /* Fill rows in second row of skipped 2nd level indirect blocks (and used 2nd level block) */ /* Finish blocks in partially used 2nd level indirect block */ - if(fill_partial_row(fh, dxpl, num_first_indirect_rows, cparam->managed.width - 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_partial_row(fh, dxpl, num_first_indirect_rows, cparam->managed.width - 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block rows in skipped 2nd level indirect blocks */ /* (less the one indirect block already used) */ for(v = 0; v < cparam->managed.width - 1; v++) - if(fill_row(fh, dxpl, num_first_indirect_rows, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, num_first_indirect_rows, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6935,7 +11193,7 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t } /* end if */ /* Direct block row in used 3rd row 2nd level indirect block */ - if(fill_row(fh, dxpl, num_first_indirect_rows, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, num_first_indirect_rows, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -6952,17 +11210,53 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, max_dblock_rows - 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -6970,6 +11264,11 @@ test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -7005,9 +11304,16 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, and skip first rows of direct blocks of 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -7032,14 +11338,57 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, and skip first rows of direct blocks of 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7054,7 +11403,7 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7074,7 +11423,7 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t */ obj_size = DBLOCK_SIZE(fh, 2) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7090,7 +11439,7 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, 3) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7105,11 +11454,11 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t } /* end if */ /* Fill rows skipped over in 3rd level indirect block's direct blocks */ - if(fill_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7126,16 +11475,52 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -7144,6 +11529,11 @@ test_abs_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -7181,9 +11571,16 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first rows of direct blocks of 3rd level indirect block's 2nd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -7208,14 +11605,57 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first rows of direct blocks of 3rd level indirect block's 2nd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7230,7 +11670,7 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7245,7 +11685,7 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H } /* end if */ /* Fill all direct block rows in third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7265,7 +11705,7 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H */ obj_size = DBLOCK_SIZE(fh, 2) + 1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7281,7 +11721,7 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, 3) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7298,11 +11738,11 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H /* Fill rows skipped over in (3rd level indirect block's) 2nd level * indirect block's direct blocks */ - if(fill_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 0, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR - if(fill_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, 2, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7319,17 +11759,53 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, 3); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -7337,6 +11813,11 @@ test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -7373,10 +11854,17 @@ test_abs_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(h H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first row of indirect blocks of 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -7402,20 +11890,60 @@ test_abs_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(h if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first row of indirect blocks of 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7430,7 +11958,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7445,7 +11973,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7468,7 +11996,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7484,7 +12012,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7505,11 +12033,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 3rd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -7527,17 +12055,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -7545,6 +12109,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -7582,10 +12151,17 @@ test_abs_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped( H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first two rows of indirect blocks of 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -7611,20 +12187,63 @@ test_abs_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped( if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect block's direct blocks, and skip first two rows of indirect blocks of 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); +#ifdef QAK +HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +#endif /* QAK */ /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7639,7 +12258,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7654,7 +12273,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7677,7 +12296,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows + 1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7696,7 +12315,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #ifdef QAK HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7717,16 +12336,16 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 3rd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ /* Fill row of direct blocks in second 3rd level indirect block */ - if(fill_row(fh, dxpl, num_first_indirect_rows, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, num_first_indirect_rows, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7743,17 +12362,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows + 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -7761,6 +12416,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -7799,10 +12459,17 @@ test_abs_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(hid_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling first row of 3rd level indirect blocks, except last one, fill all direct blocks in last 3rd level indirect block, and insert object too large for it's 2nd level indirect blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -7828,20 +12495,60 @@ test_abs_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(hid_t if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling first row of 3rd level indirect blocks, except last one, fill all direct blocks in last 3rd level indirect block, and insert object too large for it's 2nd level indirect blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7856,7 +12563,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in root indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7873,7 +12580,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill first row (except one) of 3rd level indirect blocks */ for(u = 0; u < cparam->managed.width - 1; u++) /* Fill 3rd level indirect block */ - if(fill_3rd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7888,7 +12595,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in last third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7911,7 +12618,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7927,7 +12634,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -7947,11 +12654,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in current 3rd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -7969,17 +12676,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -7987,6 +12730,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -8026,10 +12774,17 @@ test_abs_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_s H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling first row of 3rd level indirect blocks, fill all direct blocks in next 3rd level indirect block, fill all 1st row of 2nd level indirect blocks, except last one, and insert object too large for 2nd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -8055,20 +12810,60 @@ test_abs_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_s if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling first row of 3rd level indirect blocks, fill all direct blocks in next 3rd level indirect block, fill all 1st row of 2nd level indirect blocks, except last one, and insert object too large for 2nd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8083,7 +12878,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in 4th level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8098,7 +12893,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill first row of 3rd level indirect blocks */ - if(fill_3rd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8113,7 +12908,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 2nd row third level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8129,7 +12924,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill first row (except one) of 2nd level indirect blocks */ for(u = 0; u < cparam->managed.width - 1; u++) - if(fill_2nd_indirect(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8152,7 +12947,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8168,7 +12963,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8187,11 +12982,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); */ for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in skipped 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in current 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -8209,17 +13004,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -8227,6 +13058,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -8264,10 +13100,17 @@ test_abs_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(hid_t fapl, H5 H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill 4th level indirect block's direct blocks, and skip first row of 2nd indirect blocks of 4th level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -8293,20 +13136,60 @@ test_abs_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(hid_t fapl, H5 if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill 4th level indirect block's direct blocks, and skip first row of 2nd indirect blocks of 4th level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8321,7 +13204,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8336,7 +13219,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8351,7 +13234,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in fourth level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8374,7 +13257,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8390,7 +13273,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8411,11 +13294,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 2nd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -8433,17 +13316,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -8451,6 +13370,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -8490,10 +13414,17 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_blo H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill 4th level indirect block's direct, 2nd level indirect blocks and 3rd level direct block, and skip first row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -8519,20 +13450,60 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_blo if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill 4th level indirect block's direct, 2nd level indirect blocks and 3rd level direct block, and skip first row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8547,7 +13518,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8562,7 +13533,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8577,7 +13548,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in fourth level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8592,7 +13563,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in fourth level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8607,7 +13578,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in fourth level indirect block's 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8630,7 +13601,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8646,7 +13617,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8667,11 +13638,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 3rd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -8689,17 +13660,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -8707,6 +13714,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -8748,10 +13760,17 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_ H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 4th level indirect blocks, fill 2nd row 4th level indirect block's direct, 2nd level indirect blocks, first row of 3rd level indirect blocks, 3rd level direct block in 2nd row, and skip first row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -8777,20 +13796,60 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_ if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 4th level indirect blocks, fill 2nd row 4th level indirect block's direct, 2nd level indirect blocks, first row of 3rd level indirect blocks, 3rd level direct block in 2nd row, and skip first row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8805,7 +13864,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8820,7 +13879,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8835,7 +13894,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill first row of 4th level indirect blocks */ - if(fill_4th_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_4th_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Account for root indirect block doubling # of rows again */ @@ -8868,7 +13927,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 2nd row 4th level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8883,7 +13942,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in 2nd row 4th level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8898,7 +13957,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill first row of 3rd level indirect blocks in 2nd row 4th level indirect block */ - if(fill_3rd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8913,7 +13972,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 4th level indirect block's 2nd row of 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8936,7 +13995,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8952,7 +14011,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -8973,11 +14032,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 3rd level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -8995,17 +14054,53 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -9013,6 +14108,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -9056,10 +14156,17 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_star H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 3rd level indirect blocks in 4th level indirect block except last 3rd level block, fill direct blocks in 3rd level block, and skip row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -9085,20 +14192,60 @@ test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_star if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 3rd level indirect blocks in 4th level indirect block except last 3rd level block, fill direct blocks in 3rd level block, and skip row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9113,7 +14260,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9128,7 +14275,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9143,7 +14290,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 4th level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9158,7 +14305,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in 4th level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9175,11 +14322,11 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill first row (except one) of 3rd level indirect blocks in 4th level indirect block */ for(u = 0; u < cparam->managed.width - 1; u++) { /* Fill all direct block rows in 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill row of 2nd level indirect blocks in 3rd level indirect block */ - if(fill_2nd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9195,7 +14342,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 4th level indirect block's last 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9218,7 +14365,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9234,7 +14381,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9255,11 +14402,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 4th level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9277,16 +14424,52 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -9295,6 +14478,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -9338,10 +14526,17 @@ test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_ H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 4th level indirect blocks, except last one, fill first row of 3rd level indirect blocks in last 4th level indirect block except last 3rd level block, fill direct blocks in 3rd level block, and skip row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -9367,20 +14562,60 @@ test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_ if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve info about heap */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR #ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); #endif /* QAK */ + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + /* - * Test absolute heap + * Display testing message */ - TESTING("filling direct blocks, filling 2nd level indirect blocks, filling 3rd level indirect blocks, fill first row of 4th level indirect blocks, except last one, fill first row of 3rd level indirect blocks in last 4th level indirect block except last 3rd level block, fill direct blocks in 3rd level block, and skip row of 2nd indirect blocks of 4th level indirect block's 3rd level indirect block, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Retrieve info about heap */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9395,7 +14630,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9410,7 +14645,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 3rd level indirect blocks */ - if(fill_all_3rd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_3rd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9427,15 +14662,15 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill first row (except one) of 4th level indirect blocks */ for(u = 0; u < cparam->managed.width - 1; u++) { /* Fill all direct block rows in 4th level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill all rows of 2nd level indirect blocks in 4th level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill row of 3rd level indirect blocks in 4th level indirect block */ - if(fill_3rd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_3rd_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9451,7 +14686,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 4th level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9466,7 +14701,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all rows of 2nd level indirect blocks in 4th level indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9483,11 +14718,11 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); /* Fill row (except one) of 3rd level indirect blocks in 4th level indirect block */ for(u = 0; u < cparam->managed.width - 1; u++) { /* Fill all direct block rows in 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Fill row of 2nd level indirect blocks in 3rd level indirect block */ - if(fill_2nd_indirect_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_2nd_indirect_row(fh, dxpl, 1, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9503,7 +14738,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); } /* end if */ /* Fill all direct block rows in 4th level indirect block's last 3rd level indirect block */ - if(fill_all_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_all_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Account for root indirect block doubling # of rows again */ @@ -9544,7 +14779,7 @@ HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); HDfprintf(stderr, "obj_size = %Zu\n", obj_size); #endif /* QAK */ state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9560,7 +14795,7 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Insert object to fill space in (large) block created */ obj_size = DBLOCK_FREE(fh, num_first_indirect_rows) - obj_size; - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9581,11 +14816,11 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); for(u = 0; u < num_first_indirect_rows; u++) { /* Direct block rows in 2nd level indirect blocks */ for(v = 0; v < cparam->managed.width; v++) - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Direct block row in 4th level indirect block */ - if(fill_row(fh, dxpl, u, SMALL_OBJ_SIZE1, &state, NULL)) + if(fill_row(fh, dxpl, u, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9603,133 +14838,9 @@ HDfprintf(stderr, "obj_size = %Zu\n", obj_size); /* Add one more object, to create another "large" block */ obj_size = SMALL_OBJ_SIZE1; state.man_alloc_size += DBLOCK_SIZE(fh, num_first_indirect_rows); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_skip_direct_skip_indirect_two_rows_add_skipped - * - * Purpose: Test adding object too large for all but the last row in the - * direct blocks in root indirect block, then - * add object too large for initial block in first two rows of - * indirect blocks, to force extension of non-root - * indirect block (and range of skipped blocks). - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Saturday, April 15, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_skip_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - size_t id_len; /* Size of fractal heap IDs */ - unsigned num_direct_rows; /* Number of rows (of direct blocks) in root indirect block */ - unsigned row; /* Current row */ - size_t obj_size; /* Size of object */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned v; /* Local index variables */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - - /* Compute # direct block rows in root indirect block */ - num_direct_rows = DTABLE_MAX_DROWS(fh); - - /* - * Test absolute heap - */ - TESTING("skipping direct blocks to last row and skipping two rows of root indirect block, then backfill and extend"); - - /* Compute heap size & free space when half direct blocks allocated */ - row = 0; - do{ - state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); - row++; - } while(row < (num_direct_rows / 2)); - - /* Insert object to extend root block to middle of root direct blocks - */ - obj_size = DBLOCK_SIZE(fh, row - 2) + 1; - state.man_alloc_size += DBLOCK_SIZE(fh, row -1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR - /* Compute heap size & free space when all direct blocks allocated */ - do{ - state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); - row++; - } while(row < num_direct_rows); - - /* Insert large objects into last row of direct blocks in root indirect - * block, to force extension of root indirect block that covers the first - * row of indirect blocks in root indirect block - */ - obj_size = DBLOCK_SIZE(fh, num_direct_rows - 2) + 1; - for(v = 0; v < cparam->managed.width; v++) { - state.man_alloc_size += DBLOCK_SIZE(fh, num_direct_rows -1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) - FAIL_STACK_ERROR - } /* end for */ - /* Check for closing & re-opening the heap */ if(tparam->reopen_heap) { /* Close heap */ @@ -9741,29 +14852,38 @@ test_abs_skip_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ FAIL_STACK_ERROR } /* end if */ - /* Compute heap size & free space when root indirect block doubles again */ - do{ - state.heap_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_size += cparam->managed.width * DBLOCK_SIZE(fh, row); - state.man_free_space += cparam->managed.width * DBLOCK_FREE(fh, row); - row++; - } while(row < (2 * num_direct_rows)); + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Insert large object, to force creation of indirect blocks with - * range of skipped blocks that are too small to hold the large object - */ - obj_size = DBLOCK_SIZE(fh, num_direct_rows - 2) + 1; - state.man_alloc_size += DBLOCK_SIZE(fh, num_direct_rows -1); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) + TEST_ERROR + + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); /* All tests passed */ PASSED() @@ -9772,12 +14892,17 @@ test_abs_skip_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_ error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_skip_direct_skip_indirect_two_rows_add_skipped() */ +} /* test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped() */ #endif /* QAK */ #ifndef QAK @@ -9790,12 +14915,14 @@ error: * until start-block-size * 2 blocks are reached. Then, go back * and fill in the space in the blocks skipped. * + * Then, remove all the objects, in various ways + * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Tuesday, April 18, 2006 + * Monday, July 24, 2006 * *------------------------------------------------------------------------- */ @@ -9808,9 +14935,15 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "fragmenting small blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -9836,11 +14969,51 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("fragmenting small blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); /* Insert objects small enough to fit into initial blocks, but not to * share them with other objects of the same size, until the next larger @@ -9852,7 +15025,7 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar state.man_free_space = DBLOCK_FREE(fh, 0); for(u = 0; u < cparam->managed.width; u++) { state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR if(u == 0) { state.heap_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); @@ -9865,7 +15038,7 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar state.man_free_space += DBLOCK_FREE(fh, 1) * cparam->managed.width; for(u = 0; u < cparam->managed.width; u++) { state.man_alloc_size += DBLOCK_SIZE(fh, 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -9889,7 +15062,7 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar /* Add one more object, to create a 2 * start_block_size block */ state.man_alloc_size += DBLOCK_SIZE(fh, 2); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9906,10 +15079,10 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar /* Go back and fill in direct blocks of initial block size (which have large free space in them) */ obj_size = DBLOCK_FREE(fh, 0) - obj_size; for(u = 0; u < cparam->managed.width; u++) - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR for(u = 0; u < cparam->managed.width; u++) - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -9925,17 +15098,53 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar /* Fill in 2 * start_block_size block */ obj_size = DBLOCK_FREE(fh, 2) - (DBLOCK_SIZE(fh, 0) / 2); - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + + /* Check up on heap... */ + if(check_stats(fh, &state)) + FAIL_STACK_ERROR + + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) + FAIL_STACK_ERROR + + /* Get the size of the file */ + if((file_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ + + /* Verify the file is correct size */ + if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -9943,6 +15152,11 @@ test_abs_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); @@ -9958,12 +15172,14 @@ error: * in root block, but not to share a block with another object, * Then, go back and fill in the space in the blocks skipped. * + * Then, go back and remove all objects + * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Tuesday, April 18, 2006 + * Tuesday, July 25, 2006 * *------------------------------------------------------------------------- */ @@ -9976,10 +15192,16 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ unsigned root_direct_rows; /* Number of rows in root indirect block */ + off_t empty_size; /* Size of a file with an empty heap */ + off_t file_size; /* Size of file currently */ size_t obj_size; /* Size of object */ fheap_heap_state_t state; /* State of fractal heap */ + const char *base_desc = "fragmenting direct blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ @@ -10005,14 +15227,54 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar if(!H5F_addr_defined(fh_addr)) FAIL_STACK_ERROR HDmemset(&state, 0, sizeof(fheap_heap_state_t)); + if(check_stats(fh, &state)) + FAIL_STACK_ERROR - /* Retrieve # of direct rows in root indirect block */ - root_direct_rows = H5HF_get_dtable_max_drows_test(fh); + /* Prepare for querying the size of a file with an empty heap */ + + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR + + /* Close file */ + if(H5Fclose(file)<0) + TEST_ERROR + + /* Get the size of a file w/empty heap*/ + if((empty_size = h5_get_file_size(filename)) == 0) + TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +#endif /* QAK */ + + /* Re-open the file */ + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR + + /* Get a pointer to the internal file object */ + if(NULL == (f = H5I_object(file))) + STACK_ERROR + + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR /* - * Test absolute heap + * Display testing message */ - TESTING("fragmenting direct blocks, then backfill and extend"); + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); + + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + + /* Retrieve # of direct rows in root indirect block */ + root_direct_rows = H5HF_get_dtable_max_drows_test(fh); /* Insert objects small enough to fit into each direct block, but not to * share them with other objects of the same size. @@ -10024,7 +15286,7 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar /* First row */ for(u = 0; u < cparam->managed.width; u++) { state.man_alloc_size += DBLOCK_SIZE(fh, 0); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR if(u == 0) { state.heap_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); @@ -10038,7 +15300,7 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar /* Second row */ for(u = 0; u < cparam->managed.width; u++) { state.man_alloc_size += DBLOCK_SIZE(fh, 1); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -10065,7 +15327,7 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar obj_size = DBLOCK_SIZE(fh, u + 2) / 2; for(v = 0; v < cparam->managed.width; v++) { state.man_alloc_size += DBLOCK_SIZE(fh, u + 2); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ } /* end for */ @@ -10093,7 +15355,7 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar obj_size = DBLOCK_SIZE(fh, u + 4) / 2; for(v = 0; v < cparam->managed.width; v++) { state.man_alloc_size += DBLOCK_SIZE(fh, u + 4); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ } /* end for */ @@ -10120,7 +15382,7 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar obj_size = DBLOCK_SIZE(fh, 8) / 2; for(v = 0; v < cparam->managed.width; v++) { state.man_alloc_size += DBLOCK_SIZE(fh, 8); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR } /* end for */ @@ -10139,276 +15401,8 @@ test_abs_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar for(u = 0; u < root_direct_rows; u++) { obj_size = DBLOCK_FREE(fh, u) - (DBLOCK_SIZE(fh, u) / 2); for(v = 0; v < cparam->managed.width; v++) - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) - FAIL_STACK_ERROR - } /* end for */ - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_frag_direct() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_frag_2nd_direct - * - * Purpose: Test filling all direct blocks in root indirect block, then - * inserting small object to fit into each direct block - * in 2nd level indirect block, but not to share a block with - * another object. - * Then, go back and fill in the space in the blocks skipped. - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, April 18, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_frag_2nd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - size_t id_len; /* Size of fractal heap IDs */ - unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ - size_t obj_size; /* Size of object */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u, v; /* Local index variables */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - - /* Compute # of bits used in first row */ - num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); -#ifdef QAK -HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); -#endif /* QAK */ - - /* - * Test absolute heap - */ - TESTING("fill root direct blocks, then fragment 2nd level indirect block's direct blocks, then backfill and extend"); - - /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Insert objects small enough to fit into each direct block, but not to - * share them with other objects of the same size. - */ - for(u = 0; u < num_first_indirect_rows; u++) { - obj_size = DBLOCK_SIZE(fh, u) / 2; - for(v = 0; v < cparam->managed.width; v++) { - state.man_alloc_size += DBLOCK_SIZE(fh, u); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) - FAIL_STACK_ERROR - } /* end for */ - } /* end for */ - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Go back and backfill all 2nd level indirect block's direct blocks */ - for(u = 0; u < num_first_indirect_rows; u++) { - obj_size = DBLOCK_FREE(fh, u) - (DBLOCK_SIZE(fh, u) / 2); - for(v = 0; v < cparam->managed.width; v++) - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) - FAIL_STACK_ERROR - } /* end for */ - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_frag_2nd_direct() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_frag_3rd_direct - * - * Purpose: Test filling all direct blocks in root indirect block and - * all 2nd level indirect blocks, then - * inserting small object to fit into each direct block - * in 3rd level indirect block, but not to share a block with - * another object. - * Then, go back and fill in the space in the blocks skipped. - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, April 18, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_frag_3rd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - size_t id_len; /* Size of fractal heap IDs */ - unsigned root_direct_rows; /* Number of rows in root indirect block */ - size_t obj_size; /* Size of object */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u, v; /* Local index variables */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - - /* Compute # of direct rows in root indirect block */ - root_direct_rows = DTABLE_MAX_DROWS(fh); - - /* - * Test absolute heap - */ - TESTING("fill root direct blocks and 2nd level indirect blocks, then fragment 3rd level indirect block's direct blocks, then backfill and extend"); - - /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Fill all rows of 2nd level indirect blocks in root indirect block */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Insert objects small enough to fit into each direct block, but not to - * share them with other objects of the same size. - */ - for(u = 0; u < root_direct_rows; u++) { - obj_size = DBLOCK_SIZE(fh, u) / 2; - for(v = 0; v < cparam->managed.width; v++) { - state.man_alloc_size += DBLOCK_SIZE(fh, u); - if(add_obj(fh, dxpl, 10, obj_size, &state, NULL)) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR - } /* end for */ } /* end for */ /* Check for closing & re-opening the heap */ @@ -10422,1037 +15416,18 @@ test_abs_frag_3rd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t * FAIL_STACK_ERROR } /* end if */ - /* Go back and backfill all 3rd level indirect block's direct blocks */ - for(u = 0; u < root_direct_rows; u++) { - obj_size = DBLOCK_FREE(fh, u) - (DBLOCK_SIZE(fh, u) / 2); - for(v = 0; v < cparam->managed.width; v++) - if(add_obj(fh, dxpl, 20, obj_size, &state, NULL)) - FAIL_STACK_ERROR - } /* end for */ - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_frag_3rd_direct() */ -#endif /* QAK */ - -#ifndef QAK - -/*------------------------------------------------------------------------- - * Function: test_abs_random_managed - * - * Purpose: Test inserting random sized objects (that are smaller than - * the standalone size) into a heap, and read them back. - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, May 9, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_random_managed(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - size_t id_len; /* Size of fractal heap IDs */ - unsigned long seed = 0; /* Random # seed */ - size_t num_ids = 0; /* # of heap IDs in array */ - size_t alloc_ids = 0; /* # of heap IDs allocated in array */ - hsize_t total_obj_added; /* Size of objects added */ - size_t obj_size; /* Size of object */ - size_t obj_loc; /* Location of object in buffer */ - unsigned char *ids = NULL; /* Array of heap IDs */ - unsigned u; /* Local index variables */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR -#ifdef QAK -HDfprintf(stderr, "Fractal heap header address: %a\n", fh_addr); -#endif /* QAK */ - - /* - * Test absolute heap - */ - TESTING("inserting random-sized objects (smaller than standalone size)"); - - /* Choose random # seed */ - seed = (unsigned long)HDtime(NULL); -#ifdef QAK -/* seed = (unsigned long)1153176468; */ -HDfprintf(stderr, "Random # seed was: %lu\n", seed); -#endif /* QAK */ - HDsrandom(seed); - - /* Loop over adding objects to the heap, until the size limit is reached */ - total_obj_added = 0; - while(total_obj_added < size_limit) { - /* Choose a random size of object (from 1 up to stand alone block size) */ - obj_size = (HDrandom() % (cparam->standalone_size - 1)) + 1; - - /* Increment object count */ - num_ids++; -#ifdef QAK -HDfprintf(stderr, "num_ids = %Zu, total_obj_added = %Hu, obj_size = %Zu\n", num_ids, total_obj_added, obj_size); -#endif /* QAK */ - - /* Check for needing to increase size of heap ID array */ - if(num_ids > alloc_ids) { - alloc_ids = MAX(1024, (alloc_ids * 2)); - if(NULL == (ids = H5MM_realloc(ids, HEAP_ID_LEN * alloc_ids))) - FAIL_STACK_ERROR - } /* end if */ - - /* Insert object */ - obj_loc = cparam->standalone_size - obj_size; - if(H5HF_insert(fh, dxpl, obj_size, &shared_wobj_g[obj_loc], &ids[(num_ids - 1) * HEAP_ID_LEN]) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Increment the amount of objects added */ - total_obj_added += obj_size; - } /* end while */ -#ifdef QAK -HDfprintf(stderr, "num_ids = %Zu, total_obj_added = %Hu, size_limit = %Hu\n", num_ids, total_obj_added, size_limit); -#endif /* QAK */ - - /* Verify reading the objects written out */ - for(u = 0; u < num_ids; u++) { - /* Get object length */ - if(H5HF_get_obj_len(fh, &ids[u * HEAP_ID_LEN], &obj_size) < 0) - FAIL_STACK_ERROR - - /* Clear read buffer */ - HDmemset(shared_robj_g, 0, obj_size); - - /* Read in object */ - if(H5HF_read(fh, dxpl, &ids[u * HEAP_ID_LEN], shared_robj_g) < 0) - FAIL_STACK_ERROR - - /* Check for correct object */ - obj_loc = cparam->standalone_size - obj_size; - if(HDmemcmp(&shared_wobj_g[obj_loc], shared_robj_g, obj_size)) - FAIL_STACK_ERROR - } /* end for */ - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Free resources */ - H5MM_xfree(ids); - - /* All tests passed */ - PASSED() - - return(0); - -error: - HDfprintf(stderr, "Random # seed was: %lu\n", seed); - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - H5MM_xfree(ids); - } H5E_END_TRY; - return(1); -} /* test_abs_random_managed() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_random_pow2_managed - * - * Purpose: Test inserting random sized objects (that are smaller than the - * standalone size) with a "power of 2 distribution" into a heap, - * and read them back. - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, May 15, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_random_pow2_managed(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - size_t id_len; /* Size of fractal heap IDs */ - unsigned long seed = 0; /* Random # seed */ - size_t num_ids = 0; /* # of heap IDs in array */ - size_t alloc_ids = 0; /* # of heap IDs allocated in array */ - hsize_t total_obj_added; /* Size of objects added */ - size_t obj_size; /* Size of object */ - size_t obj_loc; /* Location of object in buffer */ - unsigned char *ids = NULL; /* Array of heap IDs */ - unsigned u; /* Local index variables */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR -#ifdef QAK -HDfprintf(stderr, "Fractal heap header address: %a\n", fh_addr); -#endif /* QAK */ - - /* - * Test absolute heap - */ - TESTING("inserting random-sized objects with power of 2 distribution (smaller than standalone size)"); - - /* Choose random # seed */ - seed = (unsigned long)HDtime(NULL); -#ifdef QAK -HDfprintf(stderr, "Random # seed was: %lu\n", seed); -#endif /* QAK */ - HDsrandom(seed); - - /* Loop over adding objects to the heap, until the size limit is reached */ - total_obj_added = 0; - while(total_obj_added < size_limit) { - unsigned size_range = 10; /* Object size range */ - - /* Determine the size of the range for this object */ - /* (50% of the objects inserted will use the initial size range, - * 25% of the objects will be twice as large, 12.5% will be - * four times larger, etc.) - */ - while(HDrandom() < (RAND_MAX / 2) && size_range < cparam->standalone_size) - size_range *= 2; - if(size_range > cparam->standalone_size) - size_range = cparam->standalone_size; - - /* Choose a random size of object (from 1 up to stand alone block size) */ - obj_size = (HDrandom() % (size_range - 1)) + 1; - - /* Increment object count */ - num_ids++; -#ifdef QAK -if((num_ids % 100000) == 0) - HDfprintf(stderr, "num_ids = %Zu, total_obj_added = %Hu, obj_size = %Zu\n", num_ids, total_obj_added, obj_size); -#endif /* QAK */ - - /* Check for needing to increase size of heap ID array */ - if(num_ids > alloc_ids) { - alloc_ids = MAX(1024, (alloc_ids * 2)); - if(NULL == (ids = H5MM_realloc(ids, HEAP_ID_LEN * alloc_ids))) - FAIL_STACK_ERROR - } /* end if */ - - /* Insert object */ - obj_loc = cparam->standalone_size - obj_size; - if(H5HF_insert(fh, dxpl, obj_size, &shared_wobj_g[obj_loc], &ids[(num_ids - 1) * HEAP_ID_LEN]) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Increment the amount of objects added */ - total_obj_added += obj_size; - } /* end while */ - - /* Verify reading the objects written out */ - for(u = 0; u < num_ids; u++) { - /* Get object length */ - if(H5HF_get_obj_len(fh, &ids[u * HEAP_ID_LEN], &obj_size) < 0) - FAIL_STACK_ERROR - - /* Clear read buffer */ - HDmemset(shared_robj_g, 0, obj_size); - - /* Read in object */ - if(H5HF_read(fh, dxpl, &ids[u * HEAP_ID_LEN], shared_robj_g) < 0) - FAIL_STACK_ERROR - - /* Check for correct object */ - obj_loc = cparam->standalone_size - obj_size; - if(HDmemcmp(&shared_wobj_g[obj_loc], shared_robj_g, obj_size)) - FAIL_STACK_ERROR - } /* end for */ - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Free resources */ - H5MM_xfree(ids); - - /* All tests passed */ - PASSED() - - return(0); - -error: - HDfprintf(stderr, "Random # seed was: %lu\n", seed); - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - H5MM_xfree(ids); - } H5E_END_TRY; - return(1); -} /* test_abs_random_pow2_managed() */ -#endif /* QAK */ - -#ifndef QAK - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_bogus - * - * Purpose: Test removing bogus heap IDs - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, May 15, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ - size_t id_len; /* Size of fractal heap IDs */ - hsize_t obj_off; /* Offset of object in heap */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* - * Test removing bogus IDs from heap - */ - TESTING("removing bad heap IDs from absolute heap"); - - /* Set heap ID to random (non-null) value */ - for(u = 0; u < HEAP_ID_LEN; u++) - heap_id[u] = HDrandom() + 1; - - /* Try removing bogus heap ID from empty heap */ - H5E_BEGIN_TRY { - ret = H5HF_remove(fh, dxpl, heap_id); - } H5E_END_TRY; - if(ret >= 0) - FAIL_STACK_ERROR - - /* Fill root direct blocks */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, NULL)) - FAIL_STACK_ERROR - - /* Get offset of random heap ID */ - if(H5HF_get_id_off_test(fh, heap_id, &obj_off) < 0) - FAIL_STACK_ERROR - - /* Make certain we can't accidentally use a valid heap ID */ - while(obj_off < state.heap_size) { - /* Set heap ID to random (non-null) value */ - for(u = 0; u < HEAP_ID_LEN; u++) - heap_id[u] = HDrandom() + 1; - - /* Get offset of random heap ID */ - if(H5HF_get_id_off_test(fh, heap_id, &obj_off) < 0) - FAIL_STACK_ERROR - } /* end while */ - - /* Try removing bogus heap ID from heap w/objects */ - H5E_BEGIN_TRY { - ret = H5HF_remove(fh, dxpl, heap_id); - } H5E_END_TRY; - if(ret >= 0) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_bogus() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_one - * - * Purpose: Test removing single object from heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, May 15, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ - unsigned char obj[SMALL_OBJ_SIZE1]; /* Buffer for object to insert */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test removing first (small) object from absolute heap - */ - TESTING("removing single object from absolute heap"); - - /* Initialize the buffer for objects to insert */ - for(u = 0; u < sizeof(obj); u++) - obj[u] = u; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = DBLOCK_SIZE(fh, 0); - state.man_size = DBLOCK_SIZE(fh, 0); - state.man_alloc_size = DBLOCK_SIZE(fh, 0); - state.man_free_space = DBLOCK_FREE(fh, 0) - sizeof(obj); - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove object from heap */ - if(H5HF_remove(fh, dxpl, heap_id) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = 0; - state.man_size = 0; - state.man_alloc_size = 0; - state.man_free_space = 0; - state.nobjs = 0; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Verify the file is correct size */ - if(file_size != empty_size) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_one() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_two - * - * Purpose: Test removing two objects from heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, May 22, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ - unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ - unsigned char obj[SMALL_OBJ_SIZE1]; /* Buffer for object to insert */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test removing two (small) objects from absolute heap - */ - TESTING("removing two objects from absolute heap"); - - /* Initialize the buffer for objects to insert */ - for(u = 0; u < sizeof(obj); u++) - obj[u] = u; - - /* Insert first object into heap */ - if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = DBLOCK_SIZE(fh, 0); - state.man_size = DBLOCK_SIZE(fh, 0); - state.man_alloc_size = DBLOCK_SIZE(fh, 0); - state.man_free_space = DBLOCK_FREE(fh, 0) - sizeof(obj); - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Insert second object into heap */ - if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.man_free_space -= sizeof(obj); - state.nobjs++; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove first object from heap */ - if(H5HF_remove(fh, dxpl, heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.man_free_space += sizeof(obj); - state.nobjs--; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove second object from heap */ - if(H5HF_remove(fh, dxpl, heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = 0; - state.man_size = 0; - state.man_alloc_size = 0; - state.man_free_space = 0; - state.nobjs = 0; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Verify the file is correct size */ - if(file_size != empty_size) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_two() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_one_larger - * - * Purpose: Test removing single larger (but < standalone size) object - * from heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, June 6, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id[HEAP_ID_LEN]; /* Heap ID for object */ - unsigned char *obj; /* Buffer for object to insert */ - size_t obj_len; /* Length of object to insert */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test removing one larger object from absolute heap - */ - TESTING("removing single larger object from absolute heap"); - - /* Set up object to insert */ - obj_len = DBLOCK_SIZE(fh, 2) + 1; - obj = shared_wobj_g; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - /* Check up on heap... */ - for(u = 0; u < 4; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size = DBLOCK_SIZE(fh, 3); - state.man_free_space -= obj_len; - state.nobjs = 1; if(check_stats(fh, &state)) FAIL_STACK_ERROR - /* Remove object from heap */ - if(H5HF_remove(fh, dxpl, heap_id) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = 0; - state.man_size = 0; - state.man_alloc_size = 0; - state.man_free_space = 0; - state.nobjs = 0; - if(check_stats(fh, &state)) + /* Delete objects inserted (either forward or reverse order) */ + if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) FAIL_STACK_ERROR /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) @@ -11461,11 +15436,19 @@ test_abs_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t /* Get the size of the file */ if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ /* Verify the file is correct size */ if(file_size != empty_size) TEST_ERROR + /* Free resources */ + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + /* All tests passed */ PASSED() @@ -11473,31 +15456,41 @@ test_abs_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t error: H5E_BEGIN_TRY { + H5MM_xfree(keep_ids.ids); + H5MM_xfree(keep_ids.lens); + H5MM_xfree(keep_ids.offs); + H5MM_xfree(del_str); + H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_remove_one_larger() */ +} /* test_abs_frag_direct() */ /*------------------------------------------------------------------------- - * Function: test_abs_remove_two_larger + * Function: test_abs_frag_2nd_direct * - * Purpose: Test removing two larger (but < standalone size) objects - * from heap + * Purpose: Test filling all direct blocks in root indirect block, then + * inserting small object to fit into each direct block + * in 2nd level indirect block, but not to share a block with + * another object. + * Then, go back and fill in the space in the blocks skipped. + * + * Then, go back and remove all the objects * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Saturday, June 10, 2006 + * Tuesday, July 25, 2006 * *------------------------------------------------------------------------- */ static int -test_abs_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +test_abs_frag_2nd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) { hid_t file = -1; /* File ID */ hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ @@ -11505,15 +15498,18 @@ test_abs_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5F_t *f = NULL; /* Internal file object pointer */ H5HF_t *fh = NULL; /* Fractal heap wrapper */ haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ - unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ - unsigned char *obj; /* Buffer for object to insert */ - size_t obj_len; /* Length of object to insert */ + fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + unsigned num_first_indirect_rows; /* Number of rows (of direct blocks) in each of the first indirect blocks */ off_t empty_size; /* Size of a file with an empty heap */ off_t file_size; /* Size of file currently */ + size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ + const char *base_desc = "fill root direct blocks, then fragment 2nd level indirect block's direct blocks, then backfill and extend, then remove all objects %s"; /* Test description */ + char *del_str = NULL; /* Deletion order description */ + char *test_desc = NULL; /* Test description */ + unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -11527,7 +15523,7 @@ test_abs_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t STACK_ERROR /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) FAIL_STACK_ERROR if(H5HF_get_id_len(fh, &id_len) < 0) FAIL_STACK_ERROR @@ -11548,285 +15544,15 @@ test_abs_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t TEST_ERROR /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + if(H5Fclose(file)<0) + TEST_ERROR /* Get the size of a file w/empty heap*/ if((empty_size = h5_get_file_size(filename)) == 0) TEST_ERROR - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test removing two larger objects from absolute heap - */ - if(tparam->del_dir == HEAP_DEL_FORWARD) - TESTING("removing two larger objects from absolute heap (forward)") - else - TESTING("removing two larger objects from absolute heap (reverse)") - - /* Set up first object to insert */ - obj_len = DBLOCK_SIZE(fh, 2) + 1; - obj = shared_wobj_g; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - for(u = 0; u < 4; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size = DBLOCK_SIZE(fh, 3); - state.man_free_space -= obj_len; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Set up second object to insert */ - obj_len = DBLOCK_SIZE(fh, 4) + 1; - obj = shared_wobj_g; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - /* (Goes to 8 rows because of doubling) */ - for(u = 4; u < 8; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size += DBLOCK_SIZE(fh, 5); - state.man_free_space -= obj_len; - state.nobjs = 2; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove objects in different orders */ - if(tparam->del_dir == HEAP_DEL_FORWARD) { - /* Remove first object from heap */ - if(H5HF_remove(fh, dxpl, heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 3); - state.man_free_space += DBLOCK_SIZE(fh, 2) + 1; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove second object from heap */ - if(H5HF_remove(fh, dxpl, heap_id2) < 0) - FAIL_STACK_ERROR - } /* end if */ - else { - /* Remove second object from heap */ - if(H5HF_remove(fh, dxpl, heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - /* (Goes to 4 rows because of halving) */ - for(u = 4; u < 8; u++) { - state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 5); - state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove first object from heap */ - if(H5HF_remove(fh, dxpl, heap_id1) < 0) - FAIL_STACK_ERROR - } /* end else */ - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.heap_size = 0; - state.man_size = 0; - state.man_alloc_size = 0; - state.man_free_space = 0; - state.nobjs = 0; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Verify the file is correct size */ #ifdef QAK HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); -HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); #endif /* QAK */ - if(file_size != empty_size) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_two_larger() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_three_larger - * - * Purpose: Test removing three larger (but < standalone size) objects - * from heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, June 12, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - unsigned char heap_id1[HEAP_ID_LEN]; /* Heap ID for first object */ - unsigned char heap_id2[HEAP_ID_LEN]; /* Heap ID for second object */ - unsigned char heap_id3[HEAP_ID_LEN]; /* Heap ID for third object */ - unsigned char *obj; /* Buffer for object to insert */ - size_t obj_len; /* Length of object to insert */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - unsigned u; /* Local index variable */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR /* Re-open the file */ if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) @@ -11841,87 +15567,35 @@ test_abs_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param FAIL_STACK_ERROR /* - * Test removing three larger objects from absolute heap + * Display testing message */ - if(tparam->del_dir == HEAP_DEL_FORWARD) - TESTING("removing three larger objects from absolute heap (forward)") - else - TESTING("removing three larger objects from absolute heap (reverse)") - - /* Set up first object to insert */ - obj_len = DBLOCK_SIZE(fh, 2) + 1; - obj = shared_wobj_g; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - for(u = 0; u < 4; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size = DBLOCK_SIZE(fh, 3); - state.man_free_space -= obj_len; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Set up second object to insert */ - obj_len = DBLOCK_SIZE(fh, 4) + 1; - obj = shared_wobj_g; - - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + del_str = get_del_string(tparam); + HDassert(del_str); + test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); + sprintf(test_desc, base_desc, del_str); + TESTING(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ + /* Initialize the heap ID structure */ + HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); - /* Check up on heap... */ - /* (Goes to 8 rows because of doubling) */ - for(u = 4; u < 8; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size += DBLOCK_SIZE(fh, 5); - state.man_free_space -= obj_len; - state.nobjs = 2; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); - /* Set up third object to insert */ - obj_len = DBLOCK_SIZE(fh, 7) + 1; - obj = shared_wobj_g; + /* Compute # of bits used in first row */ + num_first_indirect_rows = IBLOCK_MAX_DROWS(fh, 1); +#ifdef QAK +HDfprintf(stderr, "num_first_indirect_rows = %u\n", num_first_indirect_rows); +#endif /* QAK */ - /* Insert object into heap */ - if(H5HF_insert(fh, dxpl, obj_len, obj, &heap_id3) < 0) + /* Fill direct blocks in root indirect block */ + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ if(tparam->reopen_heap) { - /* Close (empty) heap */ + /* Close heap */ if(H5HF_close(fh, dxpl) < 0) TEST_ERROR @@ -11930,134 +15604,21 @@ test_abs_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param FAIL_STACK_ERROR } /* end if */ - /* Check up on heap... */ - /* (Goes to 16 rows because of doubling) */ - for(u = 8; u < 16; u++) { - state.heap_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size += DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space += DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size += DBLOCK_SIZE(fh, 8); - state.man_free_space -= obj_len; - state.nobjs = 3; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove objects in different orders */ - if(tparam->del_dir == HEAP_DEL_FORWARD) { - /* Remove first object from heap */ - if(H5HF_remove(fh, dxpl, heap_id1) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 3); - state.man_free_space += DBLOCK_SIZE(fh, 2) + 1; - state.nobjs = 2; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove second object from heap */ - if(H5HF_remove(fh, dxpl, heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 5); - state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove third object from heap */ - if(H5HF_remove(fh, dxpl, heap_id3) < 0) - FAIL_STACK_ERROR - } /* end if */ - else { - /* Remove third object from heap */ - if(H5HF_remove(fh, dxpl, heap_id3) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - /* (Goes to 8 rows because of halving) */ - for(u = 8; u < 16; u++) { - state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; - } /* end for */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 8); - state.man_free_space += DBLOCK_SIZE(fh, 7) + 1; - state.nobjs = 2; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove second object from heap */ - if(H5HF_remove(fh, dxpl, heap_id2) < 0) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + /* Insert objects small enough to fit into each direct block, but not to + * share them with other objects of the same size. + */ + for(u = 0; u < num_first_indirect_rows; u++) { + obj_size = DBLOCK_SIZE(fh, u) / 2; + for(v = 0; v < cparam->managed.width; v++) { + state.man_alloc_size += DBLOCK_SIZE(fh, u); + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - /* (Goes to 4 rows because of halving) */ - for(u = 4; u < 8; u++) { - state.heap_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_size -= DBLOCK_SIZE(fh, u) * cparam->managed.width; - state.man_free_space -= DBLOCK_FREE(fh, u) * cparam->managed.width; } /* end for */ - state.man_alloc_size -= DBLOCK_SIZE(fh, 5); - state.man_free_space += DBLOCK_SIZE(fh, 4) + 1; - state.nobjs = 1; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Remove first object from heap */ - if(H5HF_remove(fh, dxpl, heap_id1) < 0) - FAIL_STACK_ERROR - } /* end else */ + } /* end for */ /* Check for closing & re-opening the heap */ if(tparam->reopen_heap) { - /* Close (empty) heap */ + /* Close heap */ if(H5HF_close(fh, dxpl) < 0) TEST_ERROR @@ -12066,158 +15627,13 @@ test_abs_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param FAIL_STACK_ERROR } /* end if */ - /* Check up on heap... */ - state.heap_size = 0; - state.man_size = 0; - state.man_alloc_size = 0; - state.man_free_space = 0; - state.nobjs = 0; - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Verify the file is correct size */ -#ifdef QAK -HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); -HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); -#endif /* QAK */ - if(file_size != empty_size) - TEST_ERROR - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_three_larger() */ -#endif /* QAK */ - -#ifndef QAK -#ifndef QAK2 - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_root_direct - * - * Purpose: Test filling and removing all objects from root direct block in - * heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, May 22, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from root direct block of absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test filling & removing all (small) objects from root direct block of absolute heap - */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); - - /* Initialize the heap ID structure */ - HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); - - /* Fill the heap up */ - state.heap_size = DBLOCK_SIZE(fh, 0); - state.man_size = DBLOCK_SIZE(fh, 0); - state.man_alloc_size = DBLOCK_SIZE(fh, 0); - state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR + /* Go back and backfill all 2nd level indirect block's direct blocks */ + for(u = 0; u < num_first_indirect_rows; u++) { + obj_size = DBLOCK_FREE(fh, u) - (DBLOCK_SIZE(fh, u) / 2); + for(v = 0; v < cparam->managed.width; v++) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + } /* end for */ /* Check for closing & re-opening the heap */ if(tparam->reopen_heap) { @@ -12240,15 +15656,19 @@ test_abs_remove_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_ /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR + fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) - TEST_ERROR + FAIL_STACK_ERROR /* Get the size of the file */ if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR +#ifdef QAK +HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +#endif /* QAK */ /* Verify the file is correct size */ if(file_size != empty_size) @@ -12276,26 +15696,32 @@ error: H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_remove_root_direct() */ +} /* test_abs_frag_2nd_direct() */ /*------------------------------------------------------------------------- - * Function: test_abs_remove_two_direct + * Function: test_abs_frag_3rd_direct * - * Purpose: Test filling and removing all objects from (first) two direct - * blocks in heap + * Purpose: Test filling all direct blocks in root indirect block and + * all 2nd level indirect blocks, then + * inserting small object to fit into each direct block + * in 3rd level indirect block, but not to share a block with + * another object. + * Then, go back and fill in the space in the blocks skipped. + * + * Then, go back and remove all objects * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Monday, May 22, 2006 + * Tuesday, July 25, 2006 * *------------------------------------------------------------------------- */ static int -test_abs_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +test_abs_frag_3rd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) { hid_t file = -1; /* File ID */ hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ @@ -12305,12 +15731,16 @@ test_abs_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t haddr_t fh_addr; /* Address of fractal heap */ fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + unsigned root_direct_rows; /* Number of rows in root indirect block */ off_t empty_size; /* Size of a file with an empty heap */ off_t file_size; /* Size of file currently */ + size_t obj_size; /* Size of object */ + size_t fill_size; /* Size of objects for "bulk" filled blocks */ fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from two direct blocks of absolute heap %s"; /* Test description */ + const char *base_desc = "fill root direct blocks and 2nd level indirect blocks, then fragment 3rd level indirect block's direct blocks, then backfill and extend, then remove all objects %s"; /* Test description */ char *del_str = NULL; /* Deletion order description */ char *test_desc = NULL; /* Test description */ + unsigned u, v; /* Local index variables */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -12324,7 +15754,7 @@ test_abs_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t STACK_ERROR /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) FAIL_STACK_ERROR if(H5HF_get_id_len(fh, &id_len) < 0) FAIL_STACK_ERROR @@ -12345,7 +15775,8 @@ test_abs_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t TEST_ERROR /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + if(H5Fclose(file)<0) + TEST_ERROR /* Get the size of a file w/empty heap*/ if((empty_size = h5_get_file_size(filename)) == 0) @@ -12367,25 +15798,27 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); FAIL_STACK_ERROR /* - * Test filling & removing all (small) objects from two direct blocks of absolute heap + * Display testing message */ del_str = get_del_string(tparam); HDassert(del_str); test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); sprintf(test_desc, base_desc, del_str); TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); + del_str = H5MM_xfree(del_str); + test_desc = H5MM_xfree(test_desc); /* Initialize the heap ID structure */ HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); - /* Fill the first block in heap */ - state.heap_size = DBLOCK_SIZE(fh, 0); - state.man_size = DBLOCK_SIZE(fh, 0); - state.man_alloc_size = DBLOCK_SIZE(fh, 0); - state.man_free_space = DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) + /* Retrieve "bulk" filling object size */ + fill_size = get_fill_size(tparam); + + /* Compute # of direct rows in root indirect block */ + root_direct_rows = DTABLE_MAX_DROWS(fh); + + /* Fill direct blocks in root indirect block */ + if(fill_root_direct(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -12399,16 +15832,8 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); FAIL_STACK_ERROR } /* end if */ - /* Check up on heap... */ - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Fill the second block in heap */ - state.heap_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); - state.man_size = cparam->managed.width * DBLOCK_SIZE(fh, 0); - state.man_alloc_size += DBLOCK_SIZE(fh, 0); - state.man_free_space = (cparam->managed.width - 1) * DBLOCK_FREE(fh, 0); - if(fill_heap(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) + /* Fill all rows of 2nd level indirect blocks in root indirect block */ + if(fill_all_2nd_indirect_rows(fh, dxpl, fill_size, &state, &keep_ids)) FAIL_STACK_ERROR /* Check for closing & re-opening the heap */ @@ -12422,164 +15847,36 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); FAIL_STACK_ERROR } /* end if */ - /* Check up on heap... */ - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Delete objects inserted (either forward or reverse order) */ - if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - fh = NULL; - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR -#ifdef QAK -HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); -#endif /* QAK */ - - /* Verify the file is correct size */ - if(file_size != empty_size) - TEST_ERROR - - /* Free resources */ - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_two_direct() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_first_row - * - * Purpose: Test filling and removing all objects from first row of direct - * blocks in heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Monday, June 5, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from first row of direct blocks of absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Prepare for querying the size of a file with an empty heap */ - - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; - - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR -#ifdef QAK -HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); -#endif /* QAK */ - - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - - /* - * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + /* Insert objects small enough to fit into each direct block, but not to + * share them with other objects of the same size. */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); + for(u = 0; u < root_direct_rows; u++) { + obj_size = DBLOCK_SIZE(fh, u) / 2; + for(v = 0; v < cparam->managed.width; v++) { + state.man_alloc_size += DBLOCK_SIZE(fh, u); + if(add_obj(fh, dxpl, 10, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + } /* end for */ + } /* end for */ - /* Initialize the heap ID structure */ - HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR - /* Fill first row of direct blocks */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + /* Go back and backfill all 3rd level indirect block's direct blocks */ + for(u = 0; u < root_direct_rows; u++) { + obj_size = DBLOCK_FREE(fh, u) - (DBLOCK_SIZE(fh, u) / 2); + for(v = 0; v < cparam->managed.width; v++) + if(add_obj(fh, dxpl, 20, obj_size, &state, &keep_ids)) + FAIL_STACK_ERROR + } /* end for */ /* Check for closing & re-opening the heap */ if(tparam->reopen_heap) { @@ -12602,12 +15899,12 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) - TEST_ERROR + FAIL_STACK_ERROR /* Get the size of the file */ if((file_size = h5_get_file_size(filename)) == 0) @@ -12642,26 +15939,30 @@ error: H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_remove_first_row() */ +} /* test_abs_frag_3rd_direct() */ +#endif /* QAK */ +#ifndef QAK /*------------------------------------------------------------------------- - * Function: test_abs_remove_first_two_rows + * Function: test_abs_random_managed * - * Purpose: Test filling and removing all objects from first two rows of - * direct blocks in heap + * Purpose: Test inserting random sized objects (that are smaller than + * the standalone size) into a heap, and read them back. + * + * Then, go back and remove all objects * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Monday, June 12, 2006 + * Tuesday, May 9, 2006 * *------------------------------------------------------------------------- */ static int -test_abs_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +test_abs_random_managed(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) { hid_t file = -1; /* File ID */ hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ @@ -12671,12 +15972,14 @@ test_abs_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_par haddr_t fh_addr; /* Address of fractal heap */ fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + unsigned long seed = 0; /* Random # seed */ + hsize_t total_obj_added; /* Size of objects added */ off_t empty_size; /* Size of a file with an empty heap */ off_t file_size; /* Size of file currently */ + size_t obj_size; /* Size of object */ + size_t obj_loc; /* Location of object in buffer */ fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from first two rows of direct blocks of absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ + size_t u; /* Local index variable */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -12690,7 +15993,7 @@ test_abs_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_par STACK_ERROR /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) FAIL_STACK_ERROR if(H5HF_get_id_len(fh, &id_len) < 0) FAIL_STACK_ERROR @@ -12711,7 +16014,8 @@ test_abs_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_par TEST_ERROR /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + if(H5Fclose(file)<0) + TEST_ERROR /* Get the size of a file w/empty heap*/ if((empty_size = h5_get_file_size(filename)) == 0) @@ -12733,227 +16037,100 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); FAIL_STACK_ERROR /* - * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + * Display testing message */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); + TESTING("inserting random-sized objects (smaller than standalone size), then remove all objects (all - random)"); /* Initialize the heap ID structure */ HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); - /* Fill first two rows of direct blocks */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - if(fill_root_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Delete objects inserted (either forward or reverse order) */ - if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - fh = NULL; - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR + /* Choose random # seed */ + seed = (unsigned long)HDtime(NULL); #ifdef QAK -HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +/* seed = (unsigned long)1153176468; */ +HDfprintf(stderr, "Random # seed was: %lu\n", seed); #endif /* QAK */ + HDsrandom(seed); - /* Verify the file is correct size */ - if(file_size != empty_size) - TEST_ERROR - - /* Free resources */ - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_first_two_rows() */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_first_four_rows - * - * Purpose: Test filling and removing all objects from first four rows of - * direct blocks in heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, June 13, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_first_four_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from first four rows of direct blocks of absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR + /* Loop over adding objects to the heap, until the size limit is reached */ + total_obj_added = 0; + while(total_obj_added < size_limit) { + /* Choose a random size of object (from 1 up to stand alone block size) */ + obj_size = (HDrandom() % (cparam->standalone_size - 1)) + 1; + obj_loc = cparam->standalone_size - obj_size; - /* Prepare for querying the size of a file with an empty heap */ + /* Insert object */ + if(add_obj(fh, dxpl, obj_loc, obj_size, NULL, &keep_ids)) + FAIL_STACK_ERROR - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR + /* Increment the amount of objects added */ + total_obj_added += obj_size; + } /* end while */ #ifdef QAK -HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +HDfprintf(stderr, "keep_ids.num_ids = %Zu, total_obj_added = %Hu, size_limit = %Hu\n", keep_ids.num_ids, total_obj_added, size_limit); #endif /* QAK */ - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR + /* Randomize the order of the IDs kept */ + for(u = 0; u < keep_ids.num_ids; u++) { + size_t pos; /* Position to swap with */ - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR + /* Choose a position to swap with */ + /* (0 is current position) */ + pos = HDrandom() % (keep_ids.num_ids - u); - /* - * Test filling & removing all (small) objects from first row of direct blocks of absolute heap - */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); + /* If we chose a different position, swap with it */ + if(pos > 0) { + unsigned char temp_id[HEAP_ID_LEN]; /* Temp. heap ID holder */ - /* Initialize the heap ID structure */ - HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + /* Swap current position with future position */ + /* (just swap the heap ID, the len & offset isn't used */ + HDmemcpy(temp_id, &keep_ids.ids[u * HEAP_ID_LEN], HEAP_ID_LEN); + HDmemcpy(&keep_ids.ids[u * HEAP_ID_LEN], &keep_ids.ids[(u + pos) * HEAP_ID_LEN], HEAP_ID_LEN); + HDmemcpy(&keep_ids.ids[(u + pos) * HEAP_ID_LEN], temp_id, HEAP_ID_LEN); + } /* end if */ + } /* end for */ - /* Fill first two rows of direct blocks */ - if(fill_root_row(fh, dxpl, 0, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - if(fill_root_row(fh, dxpl, 1, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - if(fill_root_row(fh, dxpl, 2, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - if(fill_root_row(fh, dxpl, 3, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR + /* Delete objects inserted */ + for(u = 0; u < keep_ids.num_ids; u++) { + /* Remove object from heap */ + if(H5HF_remove(fh, dxpl, &keep_ids.ids[HEAP_ID_LEN * u]) < 0) + FAIL_STACK_ERROR - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + } /* end for */ /* Check up on heap... */ if(check_stats(fh, &state)) FAIL_STACK_ERROR - /* Delete objects inserted (either forward or reverse order) */ - if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) - FAIL_STACK_ERROR - /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) - TEST_ERROR + FAIL_STACK_ERROR /* Get the size of the file */ if((file_size = h5_get_file_size(filename)) == 0) @@ -12977,37 +16154,39 @@ HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); return(0); error: + HDfprintf(stderr, "Random # seed was: %lu\n", seed); H5E_BEGIN_TRY { H5MM_xfree(keep_ids.ids); H5MM_xfree(keep_ids.lens); H5MM_xfree(keep_ids.offs); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_remove_first_four_rows() */ +} /* test_abs_random_managed() */ /*------------------------------------------------------------------------- - * Function: test_abs_remove_all_root_direct + * Function: test_abs_random_pow2_managed * - * Purpose: Test filling and removing all objects from all direct blocks - * in root indirect block of heap + * Purpose: Test inserting random sized objects (that are smaller than the + * standalone size) with a "power of 2 distribution" into a heap, + * and read them back. + * + * Then, go back and remove all objects * * Return: Success: 0 * * Failure: 1 * * Programmer: Quincey Koziol - * Tuesday, June 13, 2006 + * Monday, May 15, 2006 * *------------------------------------------------------------------------- */ static int -test_abs_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) +test_abs_random_pow2_managed(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) { hid_t file = -1; /* File ID */ hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ @@ -13017,12 +16196,14 @@ test_abs_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa haddr_t fh_addr; /* Address of fractal heap */ fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ size_t id_len; /* Size of fractal heap IDs */ + unsigned long seed = 0; /* Random # seed */ + hsize_t total_obj_added; /* Size of objects added */ off_t empty_size; /* Size of a file with an empty heap */ off_t file_size; /* Size of file currently */ + size_t obj_size; /* Size of object */ + size_t obj_loc; /* Location of object in buffer */ fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from all direct blocks of root group in absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ + size_t u; /* Local index variable */ /* Set the filename to use for this test (dependent on fapl) */ h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); @@ -13036,7 +16217,7 @@ test_abs_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa STACK_ERROR /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) + if(NULL == (fh = H5HF_create(f, H5P_DATASET_XFER_DEFAULT, cparam))) FAIL_STACK_ERROR if(H5HF_get_id_len(fh, &id_len) < 0) FAIL_STACK_ERROR @@ -13057,7 +16238,8 @@ test_abs_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa TEST_ERROR /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + if(H5Fclose(file)<0) + TEST_ERROR /* Get the size of a file w/empty heap*/ if((empty_size = h5_get_file_size(filename)) == 0) @@ -13079,224 +16261,112 @@ HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); FAIL_STACK_ERROR /* - * Test filling & removing all (small) objects from first row of direct blocks of absolute heap + * Display testing message */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); + TESTING("inserting random-sized objects with power of 2 distribution (smaller than standalone size), then remove all objects (all - random)"); /* Initialize the heap ID structure */ HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); - /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR - - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ - - /* Check up on heap... */ - if(check_stats(fh, &state)) - FAIL_STACK_ERROR - - /* Delete objects inserted (either forward or reverse order) */ - if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) - FAIL_STACK_ERROR - - /* Close the fractal heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR - fh = NULL; - - /* Close the file */ - if(H5Fclose(file) < 0) - TEST_ERROR - - /* Get the size of the file */ - if((file_size = h5_get_file_size(filename)) == 0) - TEST_ERROR + /* Choose random # seed */ + seed = (unsigned long)HDtime(NULL); #ifdef QAK -HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); +/* seed = (unsigned long)1153176468; */ +HDfprintf(stderr, "Random # seed was: %lu\n", seed); #endif /* QAK */ + HDsrandom(seed); - /* Verify the file is correct size */ - if(file_size != empty_size) - TEST_ERROR - - /* Free resources */ - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - - /* All tests passed */ - PASSED() - - return(0); - -error: - H5E_BEGIN_TRY { - H5MM_xfree(keep_ids.ids); - H5MM_xfree(keep_ids.lens); - H5MM_xfree(keep_ids.offs); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); - if(fh) - H5HF_close(fh, dxpl); - H5Fclose(file); - } H5E_END_TRY; - return(1); -} /* test_abs_remove_all_root_direct() */ -#endif /* QAK2 */ - - -/*------------------------------------------------------------------------- - * Function: test_abs_remove_2nd_indirect - * - * Purpose: Test filling and removing all objects up to 2nd level indirect - * blocks of heap - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: Quincey Koziol - * Tuesday, June 13, 2006 - * - *------------------------------------------------------------------------- - */ -static int -test_abs_remove_2nd_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam) -{ - hid_t file = -1; /* File ID */ - hid_t dxpl = H5P_DATASET_XFER_DEFAULT; /* DXPL to use */ - char filename[1024]; /* Filename to use */ - H5F_t *f = NULL; /* Internal file object pointer */ - H5HF_t *fh = NULL; /* Fractal heap wrapper */ - haddr_t fh_addr; /* Address of fractal heap */ - fheap_heap_ids_t keep_ids; /* Structure to retain heap IDs */ - size_t id_len; /* Size of fractal heap IDs */ - off_t empty_size; /* Size of a file with an empty heap */ - off_t file_size; /* Size of file currently */ - fheap_heap_state_t state; /* State of fractal heap */ - const char *base_desc = "removing all objects from 2nd level indirect blocks of absolute heap %s"; /* Test description */ - char *del_str = NULL; /* Deletion order description */ - char *test_desc = NULL; /* Test description */ - - /* Set the filename to use for this test (dependent on fapl) */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - - /* Create the file to work on */ - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR + /* Loop over adding objects to the heap, until the size limit is reached */ + total_obj_added = 0; + while(total_obj_added < size_limit) { + unsigned size_range = 64; /* Object size range */ - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR + /* Determine the size of the range for this object */ + /* (50% of the objects inserted will use the initial size range, + * 25% of the objects will be twice as large, 12.5% will be + * four times larger, etc.) + */ + while(HDrandom() < (RAND_MAX / 2) && size_range < cparam->standalone_size) + size_range *= 2; + if(size_range > cparam->standalone_size) + size_range = cparam->standalone_size; - /* Create absolute heap */ - if(NULL == (fh = H5HF_create(f, dxpl, cparam))) - FAIL_STACK_ERROR - if(H5HF_get_id_len(fh, &id_len) < 0) - FAIL_STACK_ERROR - if(id_len > HEAP_ID_LEN) - FAIL_STACK_ERROR - if(H5HF_get_heap_addr(fh, &fh_addr) < 0) - FAIL_STACK_ERROR - if(!H5F_addr_defined(fh_addr)) - FAIL_STACK_ERROR - HDmemset(&state, 0, sizeof(fheap_heap_state_t)); - if(check_stats(fh, &state)) - FAIL_STACK_ERROR + /* Choose a random size of object (from 1 up to stand alone block size) */ + obj_size = (HDrandom() % (size_range - 1)) + 1; + obj_loc = cparam->standalone_size - obj_size; - /* Prepare for querying the size of a file with an empty heap */ + /* Insert object */ + if(add_obj(fh, dxpl, obj_loc, obj_size, NULL, &keep_ids)) + FAIL_STACK_ERROR - /* Close (empty) heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR - /* Close file */ - if(H5Fclose(file)<0) TEST_ERROR; + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ - /* Get the size of a file w/empty heap*/ - if((empty_size = h5_get_file_size(filename)) == 0) - TEST_ERROR + /* Increment the amount of objects added */ + total_obj_added += obj_size; + } /* end while */ #ifdef QAK -HDfprintf(stderr, "empty_size = %lu\n", (unsigned long)empty_size); +HDfprintf(stderr, "keep_ids.num_ids = %Zu, total_obj_added = %Hu, size_limit = %Hu\n", keep_ids.num_ids, total_obj_added, size_limit); #endif /* QAK */ - /* Re-open the file */ - if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) - TEST_ERROR - - /* Get a pointer to the internal file object */ - if(NULL == (f = H5I_object(file))) - STACK_ERROR - - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR + /* Randomize the order of the IDs kept */ + for(u = 0; u < keep_ids.num_ids; u++) { + size_t pos; /* Position to swap with */ - /* - * Test filling & removing all (small) objects from first row of direct blocks of absolute heap - */ - del_str = get_del_string(tparam); - HDassert(del_str); - test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc)); - sprintf(test_desc, base_desc, del_str); - TESTING(test_desc); - del_str = H5MM_xfree(del_str); - test_desc = H5MM_xfree(test_desc); + /* Choose a position to swap with */ + /* (0 is current position) */ + pos = HDrandom() % (keep_ids.num_ids - u); - /* Initialize the heap ID structure */ - HDmemset(&keep_ids, 0, sizeof(fheap_heap_ids_t)); + /* If we chose a different position, swap with it */ + if(pos > 0) { + unsigned char temp_id[HEAP_ID_LEN]; /* Temp. heap ID holder */ - /* Fill direct blocks in root indirect block */ - if(fill_root_direct(fh, dxpl, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR + /* Swap current position with future position */ + /* (just swap the heap ID, the len & offset isn't used */ + HDmemcpy(temp_id, &keep_ids.ids[u * HEAP_ID_LEN], HEAP_ID_LEN); + HDmemcpy(&keep_ids.ids[u * HEAP_ID_LEN], &keep_ids.ids[(u + pos) * HEAP_ID_LEN], HEAP_ID_LEN); + HDmemcpy(&keep_ids.ids[(u + pos) * HEAP_ID_LEN], temp_id, HEAP_ID_LEN); + } /* end if */ + } /* end for */ - /* Fill all rows of 2nd level indirect blocks */ - if(fill_all_2nd_indirect_rows(fh, dxpl, SMALL_OBJ_SIZE1, &state, &keep_ids)) - FAIL_STACK_ERROR + /* Delete objects inserted */ + for(u = 0; u < keep_ids.num_ids; u++) { + /* Remove object from heap */ + if(H5HF_remove(fh, dxpl, &keep_ids.ids[HEAP_ID_LEN * u]) < 0) + FAIL_STACK_ERROR - /* Check for closing & re-opening the heap */ - if(tparam->reopen_heap) { - /* Close heap */ - if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + /* Check for closing & re-opening the heap */ + if(tparam->reopen_heap) { + /* Close (empty) heap */ + if(H5HF_close(fh, dxpl) < 0) + TEST_ERROR - /* Re-open heap */ - if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) - FAIL_STACK_ERROR - } /* end if */ + /* Re-open heap */ + if(NULL == (fh = H5HF_open(f, dxpl, fh_addr))) + FAIL_STACK_ERROR + } /* end if */ + } /* end for */ /* Check up on heap... */ if(check_stats(fh, &state)) FAIL_STACK_ERROR - /* Delete objects inserted (either forward or reverse order) */ - if(del_objs(f, dxpl, &fh, tparam, &state, &keep_ids)) - FAIL_STACK_ERROR - /* Close the fractal heap */ if(H5HF_close(fh, dxpl) < 0) - TEST_ERROR + FAIL_STACK_ERROR fh = NULL; /* Close the file */ if(H5Fclose(file) < 0) - TEST_ERROR + FAIL_STACK_ERROR /* Get the size of the file */ if((file_size = h5_get_file_size(filename)) == 0) @@ -13320,18 +16390,17 @@ HDfprintf(stderr, "file_size = %lu\n", (unsigned long)file_size); return(0); error: + HDfprintf(stderr, "Random # seed was: %lu\n", seed); H5E_BEGIN_TRY { H5MM_xfree(keep_ids.ids); H5MM_xfree(keep_ids.lens); H5MM_xfree(keep_ids.offs); - H5MM_xfree(del_str); - H5MM_xfree(test_desc); if(fh) H5HF_close(fh, dxpl); H5Fclose(file); } H5E_END_TRY; return(1); -} /* test_abs_remove_2nd_indirect() */ +} /* test_abs_random_pow2_managed() */ #endif /* QAK */ @@ -13412,170 +16481,215 @@ curr_test = FHEAP_TEST_NORMAL; nerrors += test_create(fapl, &cparam, &tparam); nerrors += test_reopen(fapl, &cparam, &tparam); - /* - * Test fractal heap object insertion - */ +#ifndef QAK + { + fheap_test_fill_t fill; /* Size of objects to fill heap blocks with */ + +#ifndef QAK2 + /* Filling with different sized objects */ + for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; fill++) { +#else /* QAK2 */ +HDfprintf(stderr, "Uncomment test loop!\n"); +fill = FHEAP_TEST_FILL_LARGE; +/* fill = FHEAP_TEST_FILL_SINGLE; */ +#endif /* QAK2 */ + tparam.fill = fill; + + /* Set appropriate testing parameters for each test */ + switch(fill) { + /* "Bulk fill" heap blocks with 'large' objects */ + case FHEAP_TEST_FILL_LARGE: + puts("Bulk-filling blocks w/large objects"); + break; + + /* "Bulk fill" heap blocks with 'single' objects */ + case FHEAP_TEST_FILL_SINGLE: + puts("Bulk-filling blocks w/single object"); + break; + + /* An unknown test? */ + default: + goto error; + } /* end switch */ + + /* + * Test fractal heap object insertion + */ #ifdef ALL_INSERT_TESTS - /* Simple insertion */ - nerrors += test_abs_insert_first(fapl, &cparam, &tparam); - nerrors += test_abs_insert_second(fapl, &cparam, &tparam); - nerrors += test_abs_insert_root_mult(fapl, &cparam, &tparam); - nerrors += test_abs_insert_force_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_insert_fill_second(fapl, &cparam, &tparam); - nerrors += test_abs_insert_third_direct(fapl, &cparam, &tparam); - nerrors += test_abs_fill_first_row(fapl, &cparam, &tparam); - nerrors += test_abs_start_second_row(fapl, &cparam, &tparam); - nerrors += test_abs_fill_second_row(fapl, &cparam, &tparam); - nerrors += test_abs_start_third_row(fapl, &cparam, &tparam); - nerrors += test_abs_fill_fourth_row(fapl, &cparam, &tparam); - nerrors += test_abs_fill_all_root_direct(fapl, &cparam, &tparam); - nerrors += test_abs_first_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_second_direct_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_first_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_second_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_second_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_recursive_indirect_row(fapl, &cparam, &tparam); - nerrors += test_abs_start_2nd_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_recursive_indirect_two_deep(fapl, &cparam, &tparam); - nerrors += test_abs_start_3rd_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_first_3rd_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_recursive_indirect_row(fapl, &cparam, &tparam); - nerrors += test_abs_fill_all_3rd_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_start_4th_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_first_4th_recursive_indirect(fapl, &cparam, &tparam); - nerrors += test_abs_fill_4th_recursive_indirect_row(fapl, &cparam, &tparam); - nerrors += test_abs_fill_all_4th_recursive_indirect(fapl, &cparam, &tparam); + /* Simple insertion */ + nerrors += test_abs_insert_first(fapl, &cparam, &tparam); + nerrors += test_abs_insert_second(fapl, &cparam, &tparam); + nerrors += test_abs_insert_root_mult(fapl, &cparam, &tparam); + nerrors += test_abs_insert_force_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_insert_fill_second(fapl, &cparam, &tparam); + nerrors += test_abs_insert_third_direct(fapl, &cparam, &tparam); + nerrors += test_abs_fill_first_row(fapl, &cparam, &tparam); + nerrors += test_abs_start_second_row(fapl, &cparam, &tparam); + nerrors += test_abs_fill_second_row(fapl, &cparam, &tparam); + nerrors += test_abs_start_third_row(fapl, &cparam, &tparam); + nerrors += test_abs_fill_fourth_row(fapl, &cparam, &tparam); + nerrors += test_abs_fill_all_root_direct(fapl, &cparam, &tparam); + nerrors += test_abs_first_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_second_direct_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_first_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_second_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_second_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_recursive_indirect_row(fapl, &cparam, &tparam); + nerrors += test_abs_start_2nd_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_recursive_indirect_two_deep(fapl, &cparam, &tparam); + nerrors += test_abs_start_3rd_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_first_3rd_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_3rd_recursive_indirect_row(fapl, &cparam, &tparam); + nerrors += test_abs_fill_all_3rd_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_start_4th_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_first_4th_recursive_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_fill_4th_recursive_indirect_row(fapl, &cparam, &tparam); + nerrors += test_abs_fill_all_4th_recursive_indirect(fapl, &cparam, &tparam); #endif /* ALL_INSERT_TESTS */ - /* If this test fails, uncomment the tests above, which build up to this - * level of complexity gradually. -QAK - */ + /* If this test fails, uncomment the tests above, which build up to this + * level of complexity gradually. -QAK + */ #ifndef QAK - if (ExpressMode > 1) - printf("***Express test mode on. test_abs_start_5th_recursive_indirect is skipped\n"); - else - nerrors += test_abs_start_5th_recursive_indirect(fapl, &cparam, &tparam); + if (ExpressMode > 1) + printf("***Express test mode on. test_abs_start_5th_recursive_indirect is skipped\n"); + else + nerrors += test_abs_start_5th_recursive_indirect(fapl, &cparam, &tparam); #else /* QAK */ HDfprintf(stderr, "Uncomment tests!\n"); #endif /* QAK */ + /* + * Test fractal heap object deletion + */ + /* Simple removal */ #ifndef QAK - /* Skip blocks insertion */ - nerrors += test_abs_skip_start_block(fapl, &cparam, &tparam); - nerrors += test_abs_skip_start_block_add_back(fapl, &cparam, &tparam); - nerrors += test_abs_skip_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_skip_2nd_block(fapl, &cparam, &tparam); - nerrors += test_abs_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_one_partial_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_row_skip_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_direct_skip_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_2nd_direct_skip_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &cparam, &tparam); - nerrors += test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &cparam, &tparam); - - /* Additional skipped block insertion tests */ - nerrors += test_abs_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_remove_bogus(fapl, &cparam, &tparam); + nerrors += test_abs_remove_one(fapl, &cparam, &tparam); + nerrors += test_abs_remove_two(fapl, &cparam, &tparam); + nerrors += test_abs_remove_one_larger(fapl, &cparam, &tparam); + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_abs_remove_two_larger(fapl, &cparam, &tparam); + tparam.del_dir = FHEAP_DEL_REVERSE; + nerrors += test_abs_remove_two_larger(fapl, &cparam, &tparam); + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_abs_remove_three_larger(fapl, &cparam, &tparam); + tparam.del_dir = FHEAP_DEL_REVERSE; + nerrors += test_abs_remove_three_larger(fapl, &cparam, &tparam); #else /* QAK */ HDfprintf(stderr, "Uncomment tests!\n"); #endif /* QAK */ - /* Fragmented block insertion */ #ifndef QAK - nerrors += test_abs_frag_simple(fapl, &cparam, &tparam); - nerrors += test_abs_frag_direct(fapl, &cparam, &tparam); - nerrors += test_abs_frag_2nd_direct(fapl, &cparam, &tparam); - nerrors += test_abs_frag_3rd_direct(fapl, &cparam, &tparam); -#else /* QAK */ -HDfprintf(stderr, "Uncomment tests!\n"); -#endif /* QAK */ +#ifndef QAK2 + { + fheap_test_del_dir_t del_dir; /* Deletion direction */ + fheap_test_del_drain_t drain_half; /* Deletion draining */ + + /* More complex removal patterns */ + for(drain_half = FHEAP_DEL_DRAIN_ALL; drain_half < FHEAP_DEL_DRAIN_N; drain_half++) { + tparam.drain_half = drain_half; + for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; del_dir++) { + tparam.del_dir = del_dir; +#else /* QAK2 */ +HDfprintf(stderr, "Uncomment test loops!\n"); +tparam.drain_half = FHEAP_DEL_DRAIN_ALL; +/* tparam.drain_half = FHEAP_DEL_DRAIN_HALF; */ +tparam.del_dir = FHEAP_DEL_FORWARD; +/* tparam.del_dir = FHEAP_DEL_REVERSE; */ +#endif /* QAK2 */ - /* Random object insertion */ #ifndef QAK - if (ExpressMode > 1) - printf("***Express test mode on. Some tests skipped\n"); - else { - nerrors += test_abs_random_managed((hsize_t)(100*1000*1000), fapl, &cparam, &tparam); - nerrors += test_abs_random_pow2_managed((hsize_t)(100*1000*1000), fapl, &cparam, &tparam); - } /* end else */ -#else /* QAK */ -HDfprintf(stderr, "Uncomment tests!\n"); + /* Simple insertion patterns */ + nerrors += test_abs_remove_root_direct(fapl, &cparam, &tparam); + nerrors += test_abs_remove_two_direct(fapl, &cparam, &tparam); + nerrors += test_abs_remove_first_row(fapl, &cparam, &tparam); + nerrors += test_abs_remove_first_two_rows(fapl, &cparam, &tparam); + nerrors += test_abs_remove_first_four_rows(fapl, &cparam, &tparam); + if (ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + nerrors += test_abs_remove_all_root_direct(fapl, &cparam, &tparam); + nerrors += test_abs_remove_2nd_indirect(fapl, &cparam, &tparam); + nerrors += test_abs_remove_3rd_indirect(fapl, &cparam, &tparam); + } /* end else */ #endif /* QAK */ - /* - * Test fractal heap object deletion - */ - /* Simple removal */ #ifndef QAK - nerrors += test_abs_remove_bogus(fapl, &cparam, &tparam); - nerrors += test_abs_remove_one(fapl, &cparam, &tparam); - nerrors += test_abs_remove_two(fapl, &cparam, &tparam); - nerrors += test_abs_remove_one_larger(fapl, &cparam, &tparam); - tparam.del_dir = HEAP_DEL_FORWARD; - nerrors += test_abs_remove_two_larger(fapl, &cparam, &tparam); - tparam.del_dir = HEAP_DEL_REVERSE; - nerrors += test_abs_remove_two_larger(fapl, &cparam, &tparam); - tparam.del_dir = HEAP_DEL_FORWARD; - nerrors += test_abs_remove_three_larger(fapl, &cparam, &tparam); - tparam.del_dir = HEAP_DEL_REVERSE; - nerrors += test_abs_remove_three_larger(fapl, &cparam, &tparam); + /* Skip blocks insertion */ + /* (covers insertion & deletion of skipped blocks) */ + nerrors += test_abs_skip_start_block(fapl, &cparam, &tparam); + nerrors += test_abs_skip_start_block_add_back(fapl, &cparam, &tparam); + nerrors += test_abs_skip_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_skip_2nd_block(fapl, &cparam, &tparam); + nerrors += test_abs_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_one_partial_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_row_skip_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_direct_skip_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_2nd_direct_skip_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &cparam, &tparam); + if (ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + nerrors += test_abs_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &cparam, &tparam); + nerrors += test_abs_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &cparam, &tparam); + } /* end else */ #else /* QAK */ HDfprintf(stderr, "Uncomment tests!\n"); #endif /* QAK */ #ifndef QAK + /* Fragmented insertion patterns */ + /* (covers insertion & deletion of fragmented blocks) */ + nerrors += test_abs_frag_simple(fapl, &cparam, &tparam); + nerrors += test_abs_frag_direct(fapl, &cparam, &tparam); + nerrors += test_abs_frag_2nd_direct(fapl, &cparam, &tparam); + nerrors += test_abs_frag_3rd_direct(fapl, &cparam, &tparam); +#else /* QAK */ + HDfprintf(stderr, "Uncomment tests!\n"); +#endif /* QAK */ #ifndef QAK2 - { - fheap_test_del_dir_t del_dir; /* Deletion direction */ - fheap_test_del_drain_t drain_half; /* Deletion draining */ - - /* More complex removals */ - for(drain_half = HEAP_DEL_DRAIN_ALL; drain_half < HEAP_DEL_DRAIN_N; drain_half++) { - tparam.drain_half = drain_half; - for(del_dir = HEAP_DEL_FORWARD; del_dir < HEAP_DEL_NDIRS; del_dir++) { - tparam.del_dir = del_dir; -#else /* QAK2 */ -HDfprintf(stderr, "Uncomment test loops!\n"); -/* tparam.drain_half = HEAP_DEL_DRAIN_ALL; */ -tparam.drain_half = HEAP_DEL_DRAIN_HALF; -/* tparam.del_dir = HEAP_DEL_FORWARD; */ -tparam.del_dir = HEAP_DEL_REVERSE; -#endif /* QAK2 */ - -#ifndef QAK -#ifndef QAK2 - nerrors += test_abs_remove_root_direct(fapl, &cparam, &tparam); - nerrors += test_abs_remove_two_direct(fapl, &cparam, &tparam); - nerrors += test_abs_remove_first_row(fapl, &cparam, &tparam); - nerrors += test_abs_remove_first_two_rows(fapl, &cparam, &tparam); - nerrors += test_abs_remove_first_four_rows(fapl, &cparam, &tparam); - nerrors += test_abs_remove_all_root_direct(fapl, &cparam, &tparam); -#else /* QAK2 */ -HDfprintf(stderr, "Uncomment tests!\n"); + } /* end for */ + } /* end for */ + } /* end block */ #endif /* QAK2 */ - nerrors += test_abs_remove_2nd_indirect(fapl, &cparam, &tparam); #else /* QAK */ HDfprintf(stderr, "Uncomment tests!\n"); #endif /* QAK */ #ifndef QAK2 } /* end for */ - } /* end for */ - } /* end block */ #endif /* QAK2 */ + } /* end block */ #else /* QAK */ HDfprintf(stderr, "Uncomment tests!\n"); #endif /* QAK */ + +#ifndef QAK + /* Random object insertion & deletion */ + if (ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + /* (reduce size of tests when re-opening each time) */ +/* XXX: Try to speed things up enough that these tests don't have to be reduced */ + nerrors += test_abs_random_managed((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &cparam, &tparam); + nerrors += test_abs_random_pow2_managed((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &cparam, &tparam); + } /* end else */ +#else /* QAK */ +HDfprintf(stderr, "Uncomment tests!\n"); +#endif /* QAK */ + #ifndef QAK } /* end for */ #endif /* QAK */ |