summaryrefslogtreecommitdiffstats
path: root/src/H5HFtest.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-08-17 15:59:14 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-08-17 15:59:14 (GMT)
commit49d1901fdde7e3c4ebb2db7f13214793832cba42 (patch)
tree218114d6911d2b046b3b66656556bc0784942618 /src/H5HFtest.c
parent0de233508859e5d2c029a4079c2e7569078412c2 (diff)
downloadhdf5-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.c210
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() */
+