diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-08-17 15:59:14 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-08-17 15:59:14 (GMT) |
commit | 49d1901fdde7e3c4ebb2db7f13214793832cba42 (patch) | |
tree | 218114d6911d2b046b3b66656556bc0784942618 /src/H5HFtest.c | |
parent | 0de233508859e5d2c029a4079c2e7569078412c2 (diff) | |
download | hdf5-49d1901fdde7e3c4ebb2db7f13214793832cba42.zip hdf5-49d1901fdde7e3c4ebb2db7f13214793832cba42.tar.gz hdf5-49d1901fdde7e3c4ebb2db7f13214793832cba42.tar.bz2 |
[svn-r12592] Description:
Several changes, all mooshed together:
- Add support for "tiny" objects - which can be stored in the heap
ID itself, instead of in the heap data blocks.
- Flesh out support for compressed direct blocks, but comment it
out until John's got some metadata cache changes in place to
support it.
- Add support for applying I/O pipeline filters to 'huge' objects
- Refactor 'huge' object code to store information for 'huge' objects
directly in the heap ID, when there are I/O pipeline filters
applied to the heap (and the heap ID is large enough to hold the
information)
- Update h5debug tool to correctly handle 'huge' & 'tiny' objects.
- Misc. other code cleanups, etc.
Tested on:
FreeBSD/32 4.11 (sleipnir)
Linux/64 2.4 (mir)
Solaris/64 2.9 (shanti)
Diffstat (limited to 'src/H5HFtest.c')
-rw-r--r-- | src/H5HFtest.c | 210 |
1 files changed, 208 insertions, 2 deletions
diff --git a/src/H5HFtest.c b/src/H5HFtest.c index d1daa2b..bbe93ca 100644 --- a/src/H5HFtest.c +++ b/src/H5HFtest.c @@ -93,14 +93,122 @@ H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam) HDassert(cparam); /* Get fractal heap creation parameters */ + if(fh->hdr->id_len == (unsigned)(1 + fh->hdr->heap_off_size + fh->hdr->heap_len_size)) + cparam->id_len = 0; + else if(fh->hdr->id_len == (1 + fh->hdr->sizeof_size + fh->hdr->sizeof_addr)) + cparam->id_len = 1; + else + cparam->id_len = fh->hdr->id_len; cparam->max_man_size = fh->hdr->max_man_size; HDmemcpy(&(cparam->managed), &(fh->hdr->man_dtable.cparam), sizeof(H5HF_dtable_cparam_t)); + H5O_copy(H5O_PLINE_ID, &(fh->hdr->pline), &(cparam->pline)); FUNC_LEAVE_NOAPI(SUCCEED) } /* H5HF_get_cparam_test() */ /*------------------------------------------------------------------------- + * Function: H5HF_cmp_cparam_test + * + * Purpose: Compare the parameters used to create the fractal heap + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, August 14, 2006 + * + *------------------------------------------------------------------------- + */ +int +H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2) +{ + int ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5HF_cmp_cparam_test) + + /* Check arguments. */ + HDassert(cparam1); + HDassert(cparam2); + + /* Compare doubling table parameters */ + if((ret_value = HDmemcmp(&(cparam1->managed), &(cparam2->managed), sizeof(H5HF_dtable_cparam_t)))) + HGOTO_DONE(ret_value) + + /* Compare other general parameters for heap */ + if(cparam1->max_man_size < cparam2->max_man_size) + HGOTO_DONE(-1) + else if(cparam1->max_man_size > cparam2->max_man_size) + HGOTO_DONE(1) + if(cparam1->id_len < cparam2->id_len) + HGOTO_DONE(-1) + else if(cparam1->id_len > cparam2->id_len) + HGOTO_DONE(1) + + /* Compare "important" parameters for any I/O pipeline filters */ + if(cparam1->pline.nused < cparam2->pline.nused) + HGOTO_DONE(-1) + else if(cparam1->pline.nused > cparam2->pline.nused) + HGOTO_DONE(1) + else { + size_t u, v; /* Local index variables */ + + /* Compare each filter */ + for(u = 0; u < cparam1->pline.nused; u++) { + /* Check filter ID */ + if(cparam1->pline.filter[u].id < cparam2->pline.filter[u].id) + HGOTO_DONE(-1) + else if(cparam1->pline.filter[u].id > cparam2->pline.filter[u].id) + HGOTO_DONE(1) + + /* Check filter flags */ + if(cparam1->pline.filter[u].flags < cparam2->pline.filter[u].flags) + HGOTO_DONE(-1) + else if(cparam1->pline.filter[u].flags > cparam2->pline.filter[u].flags) + HGOTO_DONE(1) + +/* Don't worry about comparing the filter names right now... */ +/* (they are expanded during the encode/decode process, but aren't copied + * during the H5Z_append operation, generating false positive failures) + */ +#ifdef QAK + /* Check filter name */ +HDfprintf(stderr, "%s: Check 1.0\n", "H5HF_cmp_cparam_test"); +HDfprintf(stderr, "%s: cparam1->pline.filter[%Zu].name = %s\n", "H5HF_cmp_cparam_test", u, (cparam1->pline.filter[u].name ? cparam1->pline.filter[u].name : "<nil>")); +HDfprintf(stderr, "%s: cparam2->pline.filter[%Zu].name = %s\n", "H5HF_cmp_cparam_test", u, (cparam2->pline.filter[u].name ? cparam2->pline.filter[u].name : "<nil>")); + if(!cparam1->pline.filter[u].name && cparam2->pline.filter[u].name) + HGOTO_DONE(-1) + else if(cparam1->pline.filter[u].name && !cparam2->pline.filter[u].name) + HGOTO_DONE(1) + else if(cparam1->pline.filter[u].name && cparam2->pline.filter[u].name) { + if((ret_value = HDstrcmp(cparam1->pline.filter[u].name, cparam2->pline.filter[u].name))) + HGOTO_DONE(ret_value) + } /* end if */ +#endif /* QAK */ + + /* Check # of filter parameters */ + if(cparam1->pline.filter[u].cd_nelmts < cparam2->pline.filter[u].cd_nelmts) + HGOTO_DONE(-1) + else if(cparam1->pline.filter[u].cd_nelmts > cparam2->pline.filter[u].cd_nelmts) + HGOTO_DONE(1) + + /* Check filter parameters */ + for(v = 0; v < cparam1->pline.filter[u].cd_nelmts; v++) { + if(cparam1->pline.filter[u].cd_values[v] < cparam2->pline.filter[u].cd_values[v]) + HGOTO_DONE(-1) + else if(cparam1->pline.filter[u].cd_values[v] > cparam2->pline.filter[u].cd_values[v]) + HGOTO_DONE(1) + } /* end for */ + + } /* end for */ + } /* end else */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* H5HF_get_cparam_test() */ + + +/*------------------------------------------------------------------------- * Function: H5HF_get_max_root_rows * * Purpose: Retrieve the max. # of rows in the root indirect block @@ -296,7 +404,7 @@ H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row) /*------------------------------------------------------------------------- * Function: H5HF_get_id_off_test * - * Purpose: Retrieve the offset for a heap ID + * Purpose: Retrieve the offset for a [managed] heap ID * * Return: Success: non-negative * @@ -322,8 +430,106 @@ H5HF_get_id_off_test(const H5HF_t *fh, const void *_id, hsize_t *obj_off) /* Get the offset for a 'normal' heap ID */ id++; - UINT64DECODE_VAR(id, *obj_off, fh->hdr->heap_off_size); \ + UINT64DECODE_VAR(id, *obj_off, fh->hdr->heap_off_size); FUNC_LEAVE_NOAPI(SUCCEED) } /* H5HF_get_id_off_test() */ + +/*------------------------------------------------------------------------- + * Function: H5HF_get_id_type_test + * + * Purpose: Retrieve the type of a heap ID + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, August 14, 2006 + * + *------------------------------------------------------------------------- + */ +herr_t +H5HF_get_id_type_test(const H5HF_t *fh, const void *_id, unsigned char *obj_type) +{ + const uint8_t *id = (const uint8_t *)_id; /* Object ID */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5HF_get_id_type_test) + + /* Check arguments. */ + HDassert(fh); + HDassert(fh->hdr); + HDassert(id); + HDassert(obj_type); + + /* Get the type for a heap ID */ + *obj_type = *id & H5HF_ID_TYPE_MASK; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5HF_get_id_type_test() */ + + +/*------------------------------------------------------------------------- + * Function: H5HF_get_tiny_info_test + * + * Purpose: Retrieve information about tiny object's ID length + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, August 14, 2006 + * + *------------------------------------------------------------------------- + */ +herr_t +H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len, + hbool_t *len_extended) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5HF_get_tiny_info_test) + + /* Check arguments. */ + HDassert(fh); + HDassert(fh->hdr); + HDassert(max_len); + HDassert(len_extended); + + /* Retrieve information about tiny object's ID encoding in a heap */ + *max_len = fh->hdr->tiny_max_len; + *len_extended = fh->hdr->tiny_len_extended; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5HF_get_tiny_info_test() */ + + +/*------------------------------------------------------------------------- + * Function: H5HF_get_huge_info_test + * + * Purpose: Retrieve information about huge object's ID length + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, August 14, 2006 + * + *------------------------------------------------------------------------- + */ +herr_t +H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id, hbool_t *ids_direct) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5HF_get_huge_info_test) + + /* Check arguments. */ + HDassert(fh); + HDassert(fh->hdr); + HDassert(ids_direct); + + /* Retrieve information about tiny object's ID encoding in a heap */ + if(next_id) + *next_id = fh->hdr->huge_next_id; + *ids_direct = fh->hdr->huge_ids_direct; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5HF_get_huge_info_test() */ + |