summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MANIFEST2
-rw-r--r--src/H5Adense.c22
-rw-r--r--src/H5Apkg.h7
-rw-r--r--src/H5Atest.c150
-rw-r--r--src/H5Oattr.c3
-rw-r--r--src/H5Oattribute.c55
-rwxr-xr-xsrc/H5SM.c120
-rwxr-xr-xsrc/H5SMbtree2.c26
-rw-r--r--src/H5SMcache.c13
-rwxr-xr-xsrc/H5SMpkg.h52
-rwxr-xr-xsrc/H5SMprivate.h8
-rw-r--r--src/H5SMtest.c196
-rwxr-xr-xsrc/Makefile.am4
-rw-r--r--src/Makefile.in10
-rw-r--r--test/tattr.c201
15 files changed, 713 insertions, 156 deletions
diff --git a/MANIFEST b/MANIFEST
index 811290f..bcb9e0a 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -414,6 +414,7 @@
./src/H5Adense.c
./src/H5Adeprec.c
./src/H5Aint.c
+./src/H5Atest.c
./src/H5Apkg.h
./src/H5Aprivate.h
./src/H5Apublic.h
@@ -643,6 +644,7 @@
./src/H5SMcache.c
./src/H5SMpkg.h
./src/H5SMprivate.h
+./src/H5SMtest.c
./src/H5ST.c
./src/H5STprivate.h
./src/H5T.c
diff --git a/src/H5Adense.c b/src/H5Adense.c
index d6231cf..61726f8 100644
--- a/src/H5Adense.c
+++ b/src/H5Adense.c
@@ -464,7 +464,7 @@ H5A_dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_t *oh, unsigned mesg_flags,
attr_ptr = attr_buf;
/* Create serialized form of attribute or shared message */
- if(H5O_msg_encode(f, H5O_ATTR_ID, attr_ptr, attr) < 0)
+ if(H5O_msg_encode(f, H5O_ATTR_ID, (unsigned char *)attr_ptr, attr) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute")
/* Insert the serialized attribute into the fractal heap */
@@ -499,14 +499,14 @@ done:
if(fheap && H5HF_close(fheap, dxpl_id) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
if(attr_ptr && attr_ptr != attr_buf)
- H5FL_BLK_FREE(ser_attr, attr_ptr);
+ (void)H5FL_BLK_FREE(ser_attr, attr_ptr);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5A_dense_insert() */
/*-------------------------------------------------------------------------
- * Function: H5A_dense_write_cb
+ * Function: H5A_dense_write_bt2_cb
*
* Purpose: v2 B-tree 'find' callback to update the data for an attribute
*
@@ -519,7 +519,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5A_dense_write_cb(const void *_record, void *_op_data)
+H5A_dense_write_bt2_cb(const void *_record, void *_op_data)
{
const H5A_dense_bt2_name_rec_t *record = (const H5A_dense_bt2_name_rec_t *)_record; /* Record from B-tree */
H5A_bt2_od_wrt_t *op_data = (H5A_bt2_od_wrt_t *)_op_data; /* "op data" from v2 B-tree modify */
@@ -527,7 +527,7 @@ H5A_dense_write_cb(const void *_record, void *_op_data)
hbool_t id_changed = FALSE; /* Whether the heap ID changed */
herr_t ret_value = SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI_NOINIT(H5A_dense_write_cb)
+ FUNC_ENTER_NOAPI_NOINIT(H5A_dense_write_bt2_cb)
/*
* Check arguments.
@@ -559,7 +559,7 @@ H5A_dense_write_cb(const void *_record, void *_op_data)
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_dense_write_cb() */
+} /* end H5A_dense_write_bt2_cb() */
/*-------------------------------------------------------------------------
@@ -627,7 +627,7 @@ H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_t *oh, const H5A_t *attr)
attr_ptr = attr_buf;
/* Create serialized form of attribute */
- if(H5O_msg_encode(f, H5O_ATTR_ID, attr_ptr, attr) < 0)
+ if(H5O_msg_encode(f, H5O_ATTR_ID, (unsigned char *)attr_ptr, attr) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode attribute")
/* Open the fractal heap */
@@ -654,7 +654,7 @@ H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_t *oh, const H5A_t *attr)
op_data.attr_size = attr_size;
/* Modify attribute through 'name' tracking v2 B-tree */
- if(H5B2_find(f, dxpl_id, H5A_BT2_NAME, oh->name_bt2_addr, &udata, H5A_dense_write_cb, &op_data) < 0)
+ if(H5B2_find(f, dxpl_id, H5A_BT2_NAME, oh->name_bt2_addr, &udata, H5A_dense_write_bt2_cb, &op_data) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to modify record in v2 B-tree")
done:
@@ -664,7 +664,7 @@ done:
if(fheap && H5HF_close(fheap, dxpl_id) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
if(attr_ptr && attr_ptr != attr_buf)
- H5FL_BLK_FREE(ser_attr, attr_ptr);
+ (void)H5FL_BLK_FREE(ser_attr, attr_ptr);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5A_dense_write() */
@@ -699,7 +699,7 @@ H5A_dense_copy_fh_cb(const void *obj, size_t UNUSED obj_len, void *_udata)
* HDF5 routine, it could attempt to re-protect that direct block for the
* heap, causing the HDF5 routine called to fail)
*/
- if(NULL == (udata->attr = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_ATTR_ID, obj)))
+ if(NULL == (udata->attr = (H5A_t *)H5O_msg_decode(udata->f, udata->dxpl_id, H5O_ATTR_ID, (const unsigned char *)obj)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, FAIL, "can't decode attribute")
done:
@@ -926,7 +926,7 @@ H5A_dense_remove_fh_cb(const void *obj, size_t UNUSED obj_len, void *_udata)
FUNC_ENTER_NOAPI_NOINIT(H5A_dense_remove_fh_cb)
/* Decode attribute */
- if(NULL == (attr = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_ATTR_ID, obj)))
+ if(NULL == (attr = (H5A_t *)H5O_msg_decode(udata->f, udata->dxpl_id, H5O_ATTR_ID, (const unsigned char *)obj)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTDECODE, FAIL, "can't decode attribute")
/* Perform the deletion action on the attribute */
diff --git a/src/H5Apkg.h b/src/H5Apkg.h
index ca7983f..6b618c8 100644
--- a/src/H5Apkg.h
+++ b/src/H5Apkg.h
@@ -190,7 +190,14 @@ H5_DLL herr_t H5A_attr_release_table(H5A_attr_table_t *atable);
/* Attribute object header routines */
H5_DLL herr_t H5O_attr_reset(void *_mesg);
H5_DLL herr_t H5O_attr_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link);
+H5_DLL htri_t H5O_attr_is_shared(const void *_mesg);
H5_DLL void *H5O_attr_get_share(const void *_mesg, H5O_shared_t *sh);
+/* Testing functions */
+#ifdef H5A_TESTING
+H5_DLL htri_t H5A_is_shared_test(hid_t aid);
+H5_DLL herr_t H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count);
+#endif /* H5A_TESTING */
+
#endif /* _H5Apkg_H */
diff --git a/src/H5Atest.c b/src/H5Atest.c
new file mode 100644
index 0000000..80348e8
--- /dev/null
+++ b/src/H5Atest.c
@@ -0,0 +1,150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created: H5Aint.c
+ * Dec 18 2006
+ * Quincey Koziol <koziol@hdfgroup.org>
+ *
+ * Purpose: Internal routines for managing attributes.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5A_PACKAGE /*suppress error about including H5Apkg */
+#define H5A_TESTING /*suppress warning about H5A testing funcs*/
+#define H5SM_PACKAGE /*suppress error about including H5SMpkg */
+#define H5SM_TESTING /*suppress warning about H5SM testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h" /* Generic Functions */
+#include "H5Apkg.h" /* Attributes */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Iprivate.h" /* IDs */
+#include "H5SMpkg.h" /* Shared object header messages */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5A_is_shared_test
+ *
+ * Purpose: Check if an attribute is shared
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Dec 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5A_is_shared_test(hid_t attr_id)
+{
+ H5A_t *attr; /* Attribute object for ID */
+ htri_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5A_is_shared_test)
+
+ /* Check arguments */
+ if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+ /* Check if attribute is shared */
+ ret_value = H5O_attr_is_shared(attr);
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_is_shared_test() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5A_get_shared_rc_test
+ *
+ * Purpose: Retrieve the refcount for a shared attribute
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Dec 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count)
+{
+ H5A_t *attr; /* Attribute object for ID */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5A_get_shared_rc_test)
+
+ /* Check arguments */
+ if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
+
+ /* Sanity check */
+ HDassert(H5O_attr_is_shared(attr));
+
+ /* Retrieve ref count for shared attribute */
+ if(H5SM_get_refcount_test(attr->oloc.file, H5AC_ind_dxpl_id, H5O_ATTR_ID,
+ &attr->sh_loc, ref_count) < 0)
+ HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A_get_shared_rc_test() */
+
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 75b7d3a..619dcac 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -40,7 +40,6 @@ static void *H5O_attr_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_typ
void *native_src, H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info,
void *udata);
static herr_t H5O_attr_set_share(void *_mesg, const H5O_shared_t *sh);
-static htri_t H5O_attr_is_shared(const void *_mesg);
static herr_t H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
FILE * stream, int indent, int fwidth);
@@ -1145,7 +1144,7 @@ H5O_attr_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
*
*-------------------------------------------------------------------------
*/
-static htri_t
+htri_t
H5O_attr_is_shared(const void *_mesg)
{
const H5A_t *mesg = (const H5A_t *)_mesg;
diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c
index 2d43d9b..a7aeb79 100644
--- a/src/H5Oattribute.c
+++ b/src/H5Oattribute.c
@@ -162,7 +162,7 @@ H5O_attr_to_dense_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
{
H5O_iter_cvt_t *udata = (H5O_iter_cvt_t *)_udata; /* Operator user data */
H5A_t shared_attr; /* Copy of shared attribute */
- H5A_t *attr; /* Pointer to attribute to insert */
+ H5A_t *attr = NULL; /* Pointer to attribute to insert */
herr_t ret_value = H5_ITER_CONT; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5O_attr_to_dense_cb)
@@ -174,14 +174,14 @@ H5O_attr_to_dense_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
/* Check for shared attribute */
if(mesg->flags & H5O_MSG_FLAG_SHARED) {
/* Read the shared attribute in */
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Point attribute to insert at shared attribute read in */
attr = &shared_attr;
} /* end if */
else
- attr = mesg->native;
+ attr = (H5A_t *)mesg->native;
/* Insert attribute into dense storage */
if(H5A_dense_insert(udata->f, udata->dxpl_id, oh, mesg->flags, attr) < 0)
@@ -242,7 +242,7 @@ HDfprintf(stderr, "%s: adding attribute, attr->name = '%s'\n", FUNC, attr->name)
HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
#ifdef QAK
@@ -300,7 +300,7 @@ done:
HDONE_ERROR(H5E_ATTR, H5E_PROTECT, FAIL, "unable to release object header")
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_attr_create */
+} /* end H5O_attr_create() */
/*-------------------------------------------------------------------------
@@ -318,7 +318,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_open_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+H5O_attr_open_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
unsigned UNUSED sequence, unsigned UNUSED *oh_flags_ptr, void *_udata/*in,out*/)
{
H5O_iter_opn_t *udata = (H5O_iter_opn_t *)_udata; /* Operator user data */
@@ -340,7 +340,7 @@ H5O_attr_open_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Check for correct attribute message to modify */
@@ -399,7 +399,7 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
HDassert(name);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, NULL, "unable to load object header")
#ifdef QAK
@@ -533,7 +533,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+H5O_attr_write_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
unsigned UNUSED sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/)
{
H5O_iter_wrt_t *udata = (H5O_iter_wrt_t *)_udata; /* Operator user data */
@@ -555,7 +555,7 @@ H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Check for correct attribute message to modify */
@@ -569,12 +569,12 @@ H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
else if(shared_mesg < 0)
HGOTO_ERROR(H5E_ATTR, H5E_BADMESG, H5_ITER_ERROR, "can't share attribute")
- /* Remove the old attribut from the SOHM index */
- if(H5SM_try_delete(udata->f, udata->dxpl_id, H5O_ATTR_ID, mesg->native) < 0)
+ /* Remove the old attribute from the SOHM index */
+ if(H5SM_try_delete(udata->f, udata->dxpl_id, H5O_ATTR_ID, (const H5O_shared_t *)mesg->native) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTFREE, H5_ITER_ERROR, "unable to delete shared attribute in shared storage")
/* Extract shared message info from current attribute */
- if(NULL == H5O_attr_get_share(udata->attr, mesg->native))
+ if(NULL == H5O_attr_get_share(udata->attr, (H5O_shared_t *)mesg->native))
HGOTO_ERROR(H5E_ATTR, H5E_BADMESG, H5_ITER_ERROR, "can't get shared info")
/* Indicate that we found the correct attribute */
@@ -643,7 +643,7 @@ H5O_attr_write(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr)
HDassert(attr);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
@@ -699,7 +699,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_rename_chk_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+H5O_attr_rename_chk_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
unsigned UNUSED sequence, unsigned UNUSED *oh_flags_ptr, void *_udata/*in,out*/)
{
H5O_iter_ren_t *udata = (H5O_iter_ren_t *)_udata; /* Operator user data */
@@ -721,7 +721,7 @@ H5O_attr_rename_chk_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Check for existing attribute with new name */
@@ -767,7 +767,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+H5O_attr_rename_mod_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
unsigned UNUSED sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/)
{
H5O_iter_ren_t *udata = (H5O_iter_ren_t *)_udata; /* Operator user data */
@@ -789,7 +789,7 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Check for correct attribute message to modify */
@@ -855,7 +855,7 @@ H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id, const char *old_name, const
HDassert(new_name);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
@@ -931,7 +931,7 @@ H5O_attr_iterate(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id,
HDassert(attr_op);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
@@ -1023,11 +1023,12 @@ H5O_attr_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
HDfprintf(stderr, "%s: removing a shared attribute not supported yet!\n", FUNC);
HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "deleting a shared attribute not supported yet")
+#ifdef NOT_YET
/* Check for correct attribute message to modify */
if(HDstrcmp(shared_attr.name, udata->name) == 0)
/* Indicate that this message is the attribute to be deleted */
@@ -1035,6 +1036,7 @@ HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "deleting a shared attribute not su
/* Release copy of shared attribute */
H5O_attr_reset(&shared_attr);
+#endif /* NOT_YET */
} /* end if */
else {
/* Check for correct attribute message to modify */
@@ -1094,7 +1096,7 @@ H5O_attr_remove(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
HDassert(name);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
@@ -1209,7 +1211,7 @@ H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id)
HDassert(loc);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
@@ -1247,7 +1249,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_exists_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+H5O_attr_exists_cb(H5O_t UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
unsigned UNUSED sequence, unsigned UNUSED *oh_flags_ptr, void *_udata/*in,out*/)
{
H5O_iter_rm_t *udata = (H5O_iter_rm_t *)_udata; /* Operator user data */
@@ -1256,7 +1258,6 @@ H5O_attr_exists_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
FUNC_ENTER_NOAPI_NOINIT(H5O_attr_exists_cb)
/* check args */
- HDassert(oh);
HDassert(mesg);
HDassert(!udata->found);
@@ -1269,7 +1270,7 @@ H5O_attr_exists_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
* H5O_MSG_SHARED message. We use that information to look up the real
* message in the global heap or some other object header.
*/
- if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, mesg->native, H5O_MSG_ATTR, &shared_attr))
+ if(NULL == H5O_shared_read(udata->f, udata->dxpl_id, (const H5O_shared_t *)mesg->native, H5O_MSG_ATTR, &shared_attr))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5_ITER_ERROR, "unable to read shared attribute")
/* Check for correct attribute message */
@@ -1324,7 +1325,7 @@ H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
HDassert(name);
/* Protect the object header to iterate over */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header")
/* Check for attributes stored densely */
diff --git a/src/H5SM.c b/src/H5SM.c
index 76914b8..348e4b6 100755
--- a/src/H5SM.c
+++ b/src/H5SM.c
@@ -61,9 +61,7 @@ static herr_t H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *head
static herr_t H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id,
H5SM_index_header_t *header, unsigned type_id, const H5O_shared_t * mesg,
unsigned *cache_flags);
-static hsize_t H5SM_find_in_list(H5F_t *f, H5SM_list_t *list, const H5SM_mesg_key_t *key);
static herr_t H5SM_type_to_flag(unsigned type_id, unsigned *type_flag);
-static ssize_t H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id);
/*********************/
@@ -169,7 +167,7 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, hid_t dxpl_id)
HDassert(table->num_indexes > 0 && table->num_indexes <= H5SM_MAX_NUM_INDEXES);
/* Allocate the SOHM indexes as an array. */
- if(NULL == (table->indexes = H5FL_ARR_MALLOC(H5SM_index_header_t, table->num_indexes)))
+ if(NULL == (table->indexes = (H5SM_index_header_t *)H5FL_ARR_MALLOC(H5SM_index_header_t, (size_t)table->num_indexes)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for SOHM indexes")
/* Initialize all of the indexes, but don't allocate space for them to
@@ -278,7 +276,7 @@ done:
*
*-------------------------------------------------------------------------
*/
-static ssize_t
+ssize_t
H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id)
{
ssize_t x;
@@ -339,7 +337,7 @@ H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id)
/* Look up the master SOHM table */
if(H5F_addr_defined(f->shared->sohm_addr)) {
- if(NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
} /* end if */
else
@@ -385,7 +383,7 @@ H5SM_get_fheap_addr(H5F_t *f, unsigned type_id, hid_t dxpl_id)
FUNC_ENTER_NOAPI(H5SM_get_fheap_addr, FAIL)
/* Look up the master SOHM table */
- if(NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, HADDR_UNDEF, "unable to load SOHM master table")
/* JAMES! */
@@ -447,8 +445,8 @@ H5SM_create_index(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
{
header->index_type = H5SM_BTREE;
- if(H5B2_create(f, dxpl_id, H5SM_INDEX, H5SM_B2_NODE_SIZE,
- H5SM_SOHM_ENTRY_SIZE(f), H5SM_B2_SPLIT_PERCENT,
+ if(H5B2_create(f, dxpl_id, H5SM_INDEX, (size_t)H5SM_B2_NODE_SIZE,
+ (size_t)H5SM_SOHM_ENTRY_SIZE(f), H5SM_B2_SPLIT_PERCENT,
H5SM_B2_MERGE_PERCENT, &tree_addr) <0)
HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, FAIL, "B-tree creation failed for SOHM index")
@@ -508,10 +506,10 @@ done:
static haddr_t
H5SM_create_list(H5F_t *f, H5SM_index_header_t * header, hid_t dxpl_id)
{
- H5SM_list_t *list = NULL; /* List of messages */
- hsize_t x; /* Counter variable */
- hsize_t size; /* Size of list on disk */
- size_t num_entries; /* Number of messages to create in list */
+ H5SM_list_t *list = NULL; /* List of messages */
+ hsize_t x; /* Counter variable */
+ hsize_t size = 0; /* Size of list on disk */
+ size_t num_entries; /* Number of messages to create in list */
haddr_t addr = HADDR_UNDEF; /* Address of the list on disk */
haddr_t ret_value;
@@ -525,7 +523,7 @@ H5SM_create_list(H5F_t *f, H5SM_index_header_t * header, hid_t dxpl_id)
/* Allocate list in memory */
if((list = H5FL_MALLOC(H5SM_list_t)) == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
- if((list->messages = H5FL_ARR_MALLOC(H5SM_sohm_t, num_entries)) == NULL)
+ if((list->messages = (H5SM_sohm_t *)H5FL_ARR_MALLOC(H5SM_sohm_t, num_entries)) == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list")
/* Initialize messages in list */
@@ -629,7 +627,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, unsigned type_id, void *mesg)
}
/* Look up the master SOHM table */
- if (NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
+ if (NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
/* Find the right index for this message type. If there is no such index
@@ -642,7 +640,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, unsigned type_id, void *mesg)
} /* end if */
/* If the message isn't big enough, don't bother sharing it */
- if(0 == (mesg_size = H5O_msg_mesg_size(f, type_id, mesg, 0)))
+ if(0 == (mesg_size = H5O_msg_mesg_size(f, type_id, mesg, (size_t)0)))
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unable to get OH message size")
if(mesg_size < table->indexes[index_num].min_mesg_size)
HGOTO_DONE(FALSE);
@@ -721,7 +719,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
if(NULL == (encoding_buf = H5MM_calloc(buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate buffer for encoding")
- if(H5O_msg_encode(f, type_id, encoding_buf, mesg) < 0)
+ if(H5O_msg_encode(f, type_id, (unsigned char *)encoding_buf, mesg) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "can't encode message to be shared")
/* Open the fractal heap for this index */
@@ -742,13 +740,13 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
if(header->index_type == H5SM_LIST)
{
/* The index is a list; get it from the cache */
- if (NULL == (list = H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
+ if (NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
/* JAMES: not very effecient (gets hash value twice, searches list twice). Refactor. */
/* See if the message is already in the index and get its location */
/* JAMES: should return a pointer to the message */
- list_pos = H5SM_find_in_list(f, list, &key);
+ list_pos = H5SM_find_in_list(list, &key);
if(list_pos != UFAIL)
{
/* The message was in the index. Increment its reference count. */
@@ -794,8 +792,8 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
hsize_t list_size; /* Size of list on disk */
haddr_t tree_addr;
- if(H5B2_create(f, dxpl_id, H5SM_INDEX, H5SM_B2_NODE_SIZE,
- H5SM_SOHM_ENTRY_SIZE(f), H5SM_B2_SPLIT_PERCENT,
+ if(H5B2_create(f, dxpl_id, H5SM_INDEX, (size_t)H5SM_B2_NODE_SIZE,
+ (size_t)H5SM_SOHM_ENTRY_SIZE(f), H5SM_B2_SPLIT_PERCENT,
H5SM_B2_MERGE_PERCENT, &tree_addr) <0)
HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, FAIL, "B-tree creation failed for SOHM index")
@@ -912,7 +910,7 @@ H5SM_try_delete(H5F_t *f, hid_t dxpl_id, unsigned type_id,
HDassert(f->shared->sohm_addr != HADDR_UNDEF);
/* Look up the master SOHM table */
- if(NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
/* Find the correct index and try to delete from it */
@@ -945,15 +943,14 @@ done:
*
*-------------------------------------------------------------------------
*/
-static hsize_t
-H5SM_find_in_list(H5F_t *f, H5SM_list_t *list, const H5SM_mesg_key_t *key)
+size_t
+H5SM_find_in_list(H5SM_list_t *list, const H5SM_mesg_key_t *key)
{
- hsize_t x;
- hsize_t ret_value = UFAIL;
+ size_t x;
+ size_t ret_value = UFAIL;
FUNC_ENTER_NOAPI_NOFUNC(H5SM_find_in_list)
- HDassert(f);
HDassert(list);
HDassert(key);
@@ -971,6 +968,34 @@ H5SM_find_in_list(H5F_t *f, H5SM_list_t *list, const H5SM_mesg_key_t *key)
/*-------------------------------------------------------------------------
+ * Function: H5SM_get_hash_fh_cb
+ *
+ * Purpose: Callback for fractal heap operator, to make copy of link when
+ * when lookup up a link by index
+ *
+ * Return: SUCCEED/FAIL
+ *
+ * Programmer: Quincey Koziol
+ * koziol@hdfgroup.org
+ * Nov 7 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_hash_fh_cb(const void *obj, size_t obj_len, void *_udata)
+{
+ H5SM_fh_ud_gh_t *udata = (H5SM_fh_ud_gh_t *)_udata; /* User data for fractal heap 'op' callback */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_get_hash_fh_cb)
+
+ /* Compute hash value on raw message */
+ udata->hash = H5_checksum_lookup3(obj, obj_len, udata->type_id);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_get_hash_fh_cb() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5SM_delete_from_index
*
* Purpose: Given a SOHM message, delete it from this index.
@@ -991,10 +1016,9 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
H5SM_list_t *list = NULL;
H5SM_mesg_key_t key;
H5SM_sohm_t message;
- unsigned char *buf = NULL;
- size_t buf_size;
- hsize_t list_pos; /* Position of the message in the list */
- H5HF_t *fheap=NULL; /* Fractal heap that contains the message */
+ size_t list_pos = UFAIL; /* Position of the message in the list */
+ H5HF_t *fheap = NULL; /* Fractal heap that contains the message */
+ H5SM_fh_ud_gh_t udata; /* User data for fractal heap 'op' callback */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5SM_delete_from_index, FAIL)
@@ -1005,39 +1029,33 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
HDassert(mesg->flags & H5O_SHARED_IN_HEAP_FLAG);
/* Open the heap that this message is in */
- if(NULL == (fheap=H5HF_open(f, dxpl_id, header->heap_addr)))
+ if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
- /* JAMES: use heap op command */
- /* Get the message size */
- if(H5HF_get_obj_len(fheap, dxpl_id, &(mesg->u.heap_id), &buf_size) < 0)
- HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get message size from fractal heap.")
-
- /* Allocate a buffer to hold the message */
- if(NULL == (buf = H5MM_malloc(buf_size)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "couldn't allocate memory")
+ /* Prepare user data for fractal heap 'op' callback */
+ udata.type_id = type_id;
- /* Read the message to get its hash value */
- if(H5HF_read(fheap, dxpl_id, &(mesg->u.heap_id), buf) < 0)
- HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't read message from fractal heap.")
+ /* Compute the hash value for the B-tree lookup */
+ if(H5HF_op(fheap, dxpl_id, &(mesg->u.heap_id), H5SM_get_hash_fh_cb, &udata) < 0)
+ HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't access message in fractal heap")
/* Set up key for message to be deleted. */
- key.hash = H5_checksum_lookup3(buf, buf_size, type_id);
+ key.hash = udata.hash;
key.encoding = NULL;
key.encoding_size = 0;
- key.fheap = fheap; /* JAMES: unused */
+ key.fheap = fheap;
key.mesg_heap_id = mesg->u.heap_id;
/* Try to find the message in the index */
if(header->index_type == H5SM_LIST)
{
/* If the index is stored as a list, get it from the cache */
- if (NULL == (list = H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
+ if (NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
/* Find the message in the list */
- if((list_pos = H5SM_find_in_list(f, list, &key)) == UFAIL)
+ if((list_pos = H5SM_find_in_list(list, &key)) == UFAIL)
HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
--(list->messages[list_pos].ref_count);
@@ -1104,7 +1122,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create shared message list")
HDassert(NULL == list);
- if(NULL == (list = H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
+ if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
/* Delete the B-tree and have messages copy themselves to the
@@ -1116,10 +1134,6 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
} /* end if */
done:
- /* Free the message buffer */
- if(buf)
- H5MM_xfree(buf);
-
/* Release the SOHM list */
if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
@@ -1164,7 +1178,7 @@ H5SM_get_info(H5F_t *f, unsigned *index_flags, unsigned *minsizes,
/* Read the rest of the SOHM table information from the cache */
- if (NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, NULL, NULL, H5AC_READ)))
+ if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
/* Return info */
@@ -1210,7 +1224,7 @@ H5SM_reconstitute(H5O_shared_t *sh_mesg, const uint8_t *heap_id)
/* Set flag for shared message */
sh_mesg->flags = H5O_SHARED_IN_HEAP_FLAG;
- HDmemcpy(&sh_mesg->u.heap_id, heap_id, H5SM_FHEAP_ID_LEN);
+ HDmemcpy(&sh_mesg->u.heap_id, heap_id, (size_t)H5SM_FHEAP_ID_LEN);
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5SM_reconstitute() */
diff --git a/src/H5SMbtree2.c b/src/H5SMbtree2.c
index c495f56..adfcaba 100755
--- a/src/H5SMbtree2.c
+++ b/src/H5SMbtree2.c
@@ -17,28 +17,25 @@
/****************/
#define H5SM_PACKAGE /*suppress error about including H5SMpkg */
-#define H5F_PACKAGE /*suppress error about including H5Fpkg */
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
-#include "H5ACprivate.h" /* Metadata cache */
#include "H5Eprivate.h" /* Error handling */
-#include "H5FLprivate.h" /* Free Lists */
-#include "H5MMprivate.h" /* Memory management */
-#include "H5Fpkg.h" /* File access */
#include "H5SMpkg.h" /* Shared object header messages */
-#include "H5B2private.h" /* v2 B-trees */
+
/****************/
/* Local Macros */
/****************/
+
/******************/
/* Local Typedefs */
/******************/
+
/********************/
/* Local Prototypes */
/********************/
@@ -91,8 +88,9 @@ H5SM_message_compare(const void *rec1, const void *rec2)
{
const H5SM_mesg_key_t *key = (const H5SM_mesg_key_t *) rec1;
const H5SM_sohm_t *mesg = (const H5SM_sohm_t *) rec2;
- int64_t hash_diff; /* Has to be able to hold two 32-bit values */
- herr_t ret_value=0;
+ int64_t hash_diff; /* Has to be able to hold two 32-bit values */
+ herr_t ret_value = 0;
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_compare)
hash_diff = key->hash;
@@ -116,7 +114,7 @@ H5SM_message_compare(const void *rec1, const void *rec2)
/* We need to see if this message is in fact the message stored
* in the heap. Read it from the heap and compare the two.
*/
- HDmemset(buf2, 0, H5O_MESG_MAX_SIZE);
+ HDmemset(buf2, 0, (size_t)H5O_MESG_MAX_SIZE);
ret = H5HF_read(key->fheap, H5AC_dxpl_id, &(mesg->fheap_id), &buf2);
HDassert(ret >= 0);
@@ -136,7 +134,6 @@ H5SM_message_compare(const void *rec1, const void *rec2)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5SM_message_compare */
-
/*-------------------------------------------------------------------------
* Function: H5SM_message_store
@@ -163,7 +160,6 @@ H5SM_message_store(void *native, const void *udata)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5SM_message_store */
-
/*-------------------------------------------------------------------------
* Function: H5SM_message_retrieve
@@ -192,7 +188,6 @@ H5SM_message_retrieve(void *udata, const void *native)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5SM_message_retrieve */
-
/*-------------------------------------------------------------------------
* Function: H5SM_message_encode
@@ -252,7 +247,6 @@ H5SM_message_decode(const H5F_t UNUSED *f, const uint8_t *raw, void *_nrecord)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5SM_message_decode */
-
/*-------------------------------------------------------------------------
* Function: H5SM_message_debug
@@ -303,6 +297,7 @@ herr_t
H5SM_incr_ref(void *record, void *op_data, hbool_t *changed)
{
H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_incr_ref)
HDassert(record);
@@ -318,7 +313,6 @@ H5SM_incr_ref(void *record, void *op_data, hbool_t *changed)
FUNC_LEAVE_NOAPI(SUCCEED)
}
-
/*-------------------------------------------------------------------------
* Function: H5SM_decr_ref
@@ -343,6 +337,7 @@ herr_t
H5SM_decr_ref(void *record, void *op_data, hbool_t *changed)
{
H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_decr_ref)
HDassert(record);
@@ -359,7 +354,6 @@ H5SM_decr_ref(void *record, void *op_data, hbool_t *changed)
}
-
/*-------------------------------------------------------------------------
* Function: H5SM_convert_to_list_op
*
@@ -382,6 +376,7 @@ H5SM_convert_to_list_op(const void * record, void *op_data)
const H5SM_sohm_t *message = (const H5SM_sohm_t *) record;
const H5SM_list_t *list = (const H5SM_list_t *) op_data;
hsize_t x;
+
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_convert_to_list_op)
HDassert(record);
@@ -402,3 +397,4 @@ H5SM_convert_to_list_op(const void * record, void *op_data)
FUNC_LEAVE_NOAPI(SUCCEED)
}
+
diff --git a/src/H5SMcache.c b/src/H5SMcache.c
index 155a3ab..1786c74 100644
--- a/src/H5SMcache.c
+++ b/src/H5SMcache.c
@@ -246,7 +246,7 @@ H5SM_load_table(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED *udata1
HDassert((size_t)(p - buf) == H5SM_TABLE_SIZE(f) - H5SM_SIZEOF_CHECKSUM);
/* Allocate space for the index headers in memory*/
- if(NULL == (table->indexes = H5FL_ARR_MALLOC(H5SM_index_header_t, table->num_indexes)))
+ if(NULL == (table->indexes = H5FL_ARR_MALLOC(H5SM_index_header_t, (size_t)table->num_indexes)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for SOHM indexes")
/* Read in the index headers */
@@ -337,13 +337,12 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5SM_dest_table(H5F_t *f, H5SM_master_table_t* table)
+H5SM_dest_table(H5F_t UNUSED *f, H5SM_master_table_t* table)
{
FUNC_ENTER_NOAPI_NOFUNC(H5SM_dest_table)
- assert(table);
-
- assert(table->indexes);
+ HDassert(table);
+ HDassert(table->indexes);
H5FL_ARR_FREE(H5SM_index_header_t, table->indexes);
@@ -623,7 +622,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5SM_dest_list(H5F_t *f, H5SM_list_t* list)
+H5SM_dest_list(H5F_t UNUSED *f, H5SM_list_t* list)
{
FUNC_ENTER_NOAPI_NOFUNC(H5SM_dest_list)
@@ -653,7 +652,7 @@ H5SM_dest_list(H5F_t *f, H5SM_list_t* list)
*-------------------------------------------------------------------------
*/
static herr_t
-H5SM_list_size(const H5F_t *f, const H5SM_list_t *list, size_t *size_ptr)
+H5SM_list_size(const H5F_t UNUSED *f, const H5SM_list_t *list, size_t *size_ptr)
{
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_list_size)
diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h
index 0aea386..342b2bc 100755
--- a/src/H5SMpkg.h
+++ b/src/H5SMpkg.h
@@ -63,6 +63,10 @@
#define H5SM_MAX_INDEXES 8
#define H5SM_MAX_LIST_ELEMS 1000
+#define H5SM_B2_NODE_SIZE 512
+#define H5SM_B2_SPLIT_PERCENT 100
+#define H5SM_B2_MERGE_PERCENT 40
+
/****************************/
/* Package Typedefs */
/****************************/
@@ -95,10 +99,13 @@
* disk.
*/
-/* Declare free lists to manage H5SM structs */
-H5FL_ARR_EXTERN(H5SM_index_header_t);
-H5FL_EXTERN(H5SM_list_t);
-H5FL_ARR_EXTERN(H5SM_sohm_t);
+/* Typedef for a SOHM index node */
+typedef struct {
+ /* JAMES: I think I need message type here, and stored in file. */
+ uint32_t hash; /* Hash value for OHM */
+ H5SM_fheap_id_t fheap_id; /* ID of the OHM in the fractal heap */
+ hsize_t ref_count; /* JAMES TODO: should this be hsize_t? */
+} H5SM_sohm_t;
typedef enum {
H5SM_BADTYPE = -1,
@@ -147,22 +154,39 @@ typedef struct {
H5SM_index_header_t *indexes; /* Array of num_indexes indexes */
} H5SM_master_table_t;
+/*
+ * Data exchange structure to pass through the fractal heap layer for the
+ * H5HF_op function when computing a hash value for a message.
+ */
+typedef struct {
+ /* downward (internal) */
+ unsigned type_id; /* Message type */
+
+ /* upward */
+ uint32_t hash; /* Hash value */
+} H5SM_fh_ud_gh_t;
-#define H5SM_B2_NODE_SIZE 512
-#define H5SM_B2_SPLIT_PERCENT 100
-#define H5SM_B2_MERGE_PERCENT 40
/****************************/
/* Package Variables */
/****************************/
+/* Declare free lists to manage H5SM structs */
+H5FL_ARR_EXTERN(H5SM_index_header_t);
+H5FL_EXTERN(H5SM_list_t);
+H5FL_ARR_EXTERN(H5SM_sohm_t);
+
H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1];
H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1];
-
H5_DLLVAR const H5B2_class_t H5SM_INDEX[1];
/****************************/
/* Package Prototypes */
/****************************/
+
+/* General routines */
+H5_DLL ssize_t H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id);
+H5_DLL size_t H5SM_find_in_list(H5SM_list_t *list, const H5SM_mesg_key_t *key);
+
/* Encode and decode routines, used for B-tree and cache encoding/decoding */
H5_DLL herr_t H5SM_message_encode(const H5F_t *f, uint8_t *raw,
const void *native);
@@ -183,4 +207,14 @@ H5_DLL herr_t H5SM_decr_ref(void *record, void *op_data, hbool_t *changed);
/* H5B2_remove_t callback to add messages to a list index */
H5_DLL herr_t H5SM_convert_to_list_op(const void * record, void *op_data);
-#endif /*_H5SMpkg_H*/
+/* Fractal heap 'op' callback to compute hash value for message "in place" */
+H5_DLL herr_t H5SM_get_hash_fh_cb(const void *obj, size_t obj_len, void *_udata);
+
+/* Testing functions */
+#ifdef H5SM_TESTING
+H5_DLL herr_t H5SM_get_refcount_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+ const H5O_shared_t *sh_mesg, hsize_t *ref_count);
+#endif /* H5SM_TESTING */
+
+#endif /* _H5SMpkg_H */
+
diff --git a/src/H5SMprivate.h b/src/H5SMprivate.h
index fd421e1..37d4689 100755
--- a/src/H5SMprivate.h
+++ b/src/H5SMprivate.h
@@ -31,14 +31,6 @@
#define H5SM_MAX_NUM_INDEXES 6
-/* Typedef for a SOHM index node */
-typedef struct {
- /* JAMES: I think I need message type here, and stored in file. */
- uint32_t hash; /* Hash value for OHM */
- H5SM_fheap_id_t fheap_id; /* ID of the OHM in the fractal heap */
- hsize_t ref_count; /* JAMES TODO: should this be hsize_t? */
-} H5SM_sohm_t;
-
/******************************/
/* Library Private Prototypes */
/******************************/
diff --git a/src/H5SMtest.c b/src/H5SMtest.c
new file mode 100644
index 0000000..03526bb
--- /dev/null
+++ b/src/H5SMtest.c
@@ -0,0 +1,196 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5F_PACKAGE /*suppress error about including H5Fpkg */
+#define H5SM_PACKAGE /*suppress error about including H5SMpkg */
+#define H5SM_TESTING /*suppress warning about H5SM testing funcs*/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h" /* Generic Functions */
+#include "H5ACprivate.h" /* Metadata cache */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Fpkg.h" /* File access */
+#include "H5SMpkg.h" /* Shared object header messages */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_get_refcount_bt2_cb
+ *
+ * Purpose: v2 B-tree 'find' callback to retrieve the record for a message
+ *
+ * Return: SUCCEED/FAIL
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, December 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_get_refcount_bt2_cb(const void *_record, void *_op_data)
+{
+ const H5SM_sohm_t *record = (const H5SM_sohm_t *)_record; /* v2 B-tree record for message */
+ H5SM_sohm_t *op_data = (H5SM_sohm_t *)_op_data; /* "op data" from v2 B-tree find */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_get_refcount_bt2_cb)
+
+ /*
+ * Check arguments.
+ */
+ HDassert(record);
+ HDassert(op_data);
+
+ /* Make a copy of the record */
+ *op_data = *record;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_get_refcount_bt2_cb() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_get_refcount_test
+ *
+ * Purpose: Retrieve the reference count for a message
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, December 19, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_get_refcount_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+ const H5O_shared_t *sh_mesg, hsize_t *ref_count)
+{
+ H5HF_t *fheap = NULL; /* Fractal heap that contains shared messages */
+ H5SM_master_table_t *table = NULL; /* SOHM master table */
+ H5SM_list_t *list = NULL; /* SOHM index list for message type (if in list form) */
+ H5SM_index_header_t *header; /* Index header for message type */
+ H5SM_mesg_key_t key; /* Key for looking up message */
+ H5SM_fh_ud_gh_t udata; /* User data for fractal heap 'op' callback */
+ H5SM_sohm_t message; /* Record for shared message */
+ ssize_t index_num; /* Table index for message type */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5SM_get_refcount_test)
+
+ /* Sanity check */
+ HDassert(f);
+ HDassert(sh_mesg);
+ HDassert(ref_count);
+
+ /* Look up the master SOHM table */
+ if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_READ)))
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+ /* Find the correct index and try to delete from it */
+ if((index_num = H5SM_get_index(table, type_id)) < 0)
+ HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "unable to find correct SOHM index")
+ header = &(table->indexes[index_num]);
+
+ /* Open the heap that this message is in */
+ if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
+ HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
+
+ /* Prepare user data for callback */
+ udata.type_id = type_id;
+
+ /* Compute the hash value for the B-tree lookup */
+ if(H5HF_op(fheap, dxpl_id, &(sh_mesg->u.heap_id), H5SM_get_hash_fh_cb, &udata) < 0)
+ HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't access message in fractal heap")
+
+ /* Set up key for message to locate */
+ key.hash = udata.hash;
+ key.encoding = NULL;
+ key.encoding_size = 0;
+ key.fheap = fheap;
+ key.mesg_heap_id = sh_mesg->u.heap_id;
+
+ /* Try to find the message in the index */
+ if(header->index_type == H5SM_LIST) {
+ size_t list_pos; /* Position of the message in the list */
+
+ /* If the index is stored as a list, get it from the cache */
+ if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_READ)))
+ HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
+
+ /* Find the message in the list */
+ if((list_pos = H5SM_find_in_list(list, &key)) == UFAIL)
+ HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+
+ /* Copy the message */
+ message = list->messages[list_pos];
+ } /* end if */
+ else /* Index is a B-tree */
+ {
+ HDassert(header->index_type == H5SM_BTREE);
+
+ /* Look up the message in the v2 B-tree */
+ if(H5B2_find(f, dxpl_id, H5SM_INDEX, header->index_addr, &key, H5SM_get_refcount_bt2_cb, &message) < 0)
+ HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
+ } /* end else */
+
+ /* Set the refcount for the message */
+ *ref_count = message.ref_count;
+
+done:
+ /* Release resources */
+ if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__NO_FLAGS_SET) < 0)
+ HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+ if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, table, H5AC__NO_FLAGS_SET) < 0)
+ HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table")
+ if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+ HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_get_refcount_test() */
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 630e7fb..099f76a 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,7 +41,7 @@ DISTCLEANFILES=H5pubconf.h
# library sources
libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
- H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c \
+ H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
H5AC.c H5B.c H5Bcache.c \
H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \
@@ -71,7 +71,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5R.c H5RC.c \
H5RS.c H5S.c H5Sall.c H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c \
H5Sselect.c H5Stest.c H5SL.c H5SM.c H5SMbtree2.c \
- H5SMcache.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
+ H5SMcache.c H5SMtest.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
H5Tcompound.c H5Tconv.c H5Tcset.c H5Tenum.c H5Tfields.c H5Tfixed.c \
H5Tfloat.c H5Tinit.c H5Tnative.c H5Toffset.c H5Toh.c H5Topaque.c \
H5Torder.c \
diff --git a/src/Makefile.in b/src/Makefile.in
index 90d13cd..f754ab5 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -82,7 +82,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
libhdf5_la_LIBADD =
am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
H5timer.lo H5trace.lo H5A.lo H5Abtree2.lo H5Adense.lo \
- H5Adeprec.lo H5Aint.lo H5AC.lo H5B.lo H5Bcache.lo H5B2.lo H5B2cache.lo \
+ H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5B.lo H5Bcache.lo H5B2.lo H5B2cache.lo \
H5B2dbg.lo H5B2int.lo H5B2stat.lo H5B2test.lo H5C.lo H5CS.lo \
H5D.lo H5Dcompact.lo H5Dcontig.lo H5Defl.lo H5Dio.lo \
H5Distore.lo H5Dmpio.lo H5Doh.lo H5Dselect.lo H5Dtest.lo \
@@ -109,7 +109,7 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
H5Pstrcpl.lo H5Ptest.lo H5R.lo H5RC.lo H5RS.lo H5S.lo \
H5Sall.lo H5Shyper.lo H5Smpio.lo H5Snone.lo H5Spoint.lo \
H5Sselect.lo H5Stest.lo H5SL.lo H5SM.lo H5SMbtree2.lo \
- H5SMcache.lo H5ST.lo H5T.lo H5Tarray.lo H5Tbit.lo H5Tcommit.lo \
+ H5SMcache.lo H5SMtest.lo H5ST.lo H5T.lo H5Tarray.lo H5Tbit.lo H5Tcommit.lo \
H5Tcompound.lo H5Tconv.lo H5Tcset.lo H5Tenum.lo H5Tfields.lo \
H5Tfixed.lo H5Tfloat.lo H5Tinit.lo H5Tnative.lo H5Toffset.lo \
H5Toh.lo H5Topaque.lo H5Torder.lo H5Tpad.lo H5Tprecis.lo \
@@ -398,7 +398,7 @@ DISTCLEANFILES = H5pubconf.h
# library sources
libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
- H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5AC.c H5B.c H5Bcache.c \
+ H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c H5AC.c H5B.c H5Bcache.c \
H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
H5C.c H5CS.c H5D.c H5Dcompact.c H5Dcontig.c \
H5Defl.c H5Dio.c H5Distore.c H5Dmpio.c H5Doh.c H5Dselect.c H5Dtest.c \
@@ -427,7 +427,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5R.c H5RC.c \
H5RS.c H5S.c H5Sall.c H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c \
H5Sselect.c H5Stest.c H5SL.c H5SM.c H5SMbtree2.c \
- H5SMcache.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
+ H5SMcache.c H5SMtest.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
H5Tcompound.c H5Tconv.c H5Tcset.c H5Tenum.c H5Tfields.c H5Tfixed.c \
H5Tfloat.c H5Tinit.c H5Tnative.c H5Toffset.c H5Toh.c H5Topaque.c \
H5Torder.c \
@@ -573,6 +573,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Adense.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Adeprec.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Aint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Atest.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2cache.Plo@am__quote@
@@ -708,6 +709,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5SM.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5SMbtree2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5SMcache.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5SMtest.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5ST.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Sall.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Shyper.Plo@am__quote@
diff --git a/test/tattr.c b/test/tattr.c
index 5860dae..4679b5b 100644
--- a/test/tattr.c
+++ b/test/tattr.c
@@ -28,13 +28,21 @@
#include "hdf5.h"
/*
- * This file needs to access private information from the H5G package.
- * This file also needs to access the group testing code.
+ * This file needs to access private information from the H5O package.
+ * This file also needs to access the object header testing code.
*/
#define H5O_PACKAGE
#define H5O_TESTING
#include "H5Opkg.h" /* Object headers */
+/*
+ * This file needs to access private information from the H5A package.
+ * This file also needs to access the attribute testing code.
+ */
+#define H5A_PACKAGE
+#define H5A_TESTING
+#include "H5Apkg.h" /* Attributes */
+
#define FILENAME "tattr.h5"
#define NAME_BUF_SIZE 1024
#define ATTR_NAME_LEN 16
@@ -1740,6 +1748,7 @@ test_attr_dense_verify(hid_t loc_id, unsigned max_attr)
} /* end for */
} /* test_attr_dense_verify() */
+#ifndef QAK
/****************************************************************
**
** test_attr_dense_create(): Test basic H5A (attribute) code.
@@ -1791,7 +1800,7 @@ HDfprintf(stderr, "max_compact = %u, min_dense = %u\n", max_compact, min_dense);
is_dense = H5O_is_attr_dense_test(dataset);
VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
- /* Add attributes, until just before coverting to dense storage */
+ /* Add attributes, until just before converting to dense storage */
for(u = 0; u < max_compact; u++) {
/* Create attribute */
sprintf(attrname, "attr %02u", u);
@@ -1897,7 +1906,7 @@ HDfprintf(stderr, "max_compact = %u, min_dense = %u\n", max_compact, min_dense);
is_dense = H5O_is_attr_dense_test(dataset);
VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
- /* Add attributes, until just before coverting to dense storage */
+ /* Add attributes, until just before converting to dense storage */
for(u = 0; u < max_compact; u++) {
/* Create attribute */
sprintf(attrname, "attr %02u", u);
@@ -2087,6 +2096,159 @@ HDfprintf(stderr, "max_compact = %u, min_dense = %u\n", max_compact, min_dense);
ret = H5Fclose(fid);
CHECK(ret, FAIL, "H5Fclose");
} /* test_attr_dense_delete() */
+#endif /* QAK */
+
+/****************************************************************
+**
+** test_attr_shared_write(): Test basic H5A (attribute) code.
+** Tests writing to shared attributes in "compact" & "dense" storage
+**
+****************************************************************/
+static void
+test_attr_shared_write(hid_t fcpl, hid_t fapl)
+{
+ hid_t fid; /* HDF5 File ID */
+ hid_t dataset, dataset2; /* Dataset ID2 */
+ hid_t sid; /* Dataspace ID */
+ hid_t attr; /* Attribute ID */
+ hid_t dcpl; /* Dataset creation property list ID */
+ char attrname[NAME_BUF_SIZE]; /* Name of attribute */
+ unsigned max_compact; /* Maximum # of attributes to store compactly */
+ unsigned min_dense; /* Minimum # of attributes to store "densely" */
+ htri_t is_dense; /* Are attributes stored densely? */
+ htri_t is_shared; /* Is attributes shared? */
+ hsize_t shared_refcount; /* Reference count of shared attribute */
+ unsigned attr_value; /* Attribute value */
+ unsigned u; /* Local index variable */
+ herr_t ret; /* Generic return value */
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Testing Writing to Shared Attributes in Compact & Dense Storage\n"));
+
+ /* Create file */
+ fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl);
+ CHECK(fid, FAIL, "H5Fcreate");
+
+ /* Create dataspace for dataset */
+ sid = H5Screate(H5S_SCALAR);
+ CHECK(sid, FAIL, "H5Screate");
+
+ /* Set up to query the object creation properties */
+ dcpl = H5Pcreate(H5P_DATASET_CREATE);
+ CHECK(dcpl, FAIL, "H5Pcreate");
+
+ /* Create datasets */
+ dataset = H5Dcreate(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, dcpl);
+ CHECK(dataset, FAIL, "H5Dcreate");
+ dataset2 = H5Dcreate(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, dcpl);
+ CHECK(dataset2, FAIL, "H5Dcreate");
+
+ /* Retrieve limits for compact/dense attribute storage */
+ ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense);
+ CHECK(ret, FAIL, "H5Pget_attr_phase_change");
+#ifdef QAK
+HDfprintf(stderr, "max_compact = %u, min_dense = %u\n", max_compact, min_dense);
+#endif /* QAK */
+
+ /* Check on datasets' attribute storage status */
+ is_dense = H5O_is_attr_dense_test(dataset);
+ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
+ is_dense = H5O_is_attr_dense_test(dataset2);
+ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
+
+ /* Add attributes to each dataset, until just before converting to dense storage */
+ for(u = 0; u < max_compact; u++) {
+ /* Create attribute name */
+ sprintf(attrname, "attr %02u", u);
+
+ /* Create attribute on first dataset */
+ attr = H5Acreate(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT);
+ CHECK(attr, FAIL, "H5Acreate");
+
+ /* Check that attribute is shared */
+ is_shared = H5A_is_shared_test(attr);
+ VERIFY(is_shared, TRUE, "H5A_is_shared_test");
+
+ /* Check refcount for attribute */
+ ret = H5A_get_shared_rc_test(attr, &shared_refcount);
+ CHECK(ret, FAIL, "H5A_get_shared_rc_test");
+ VERIFY(shared_refcount, 1, "H5A_get_shared_rc_test");
+
+ /* Write data into the attribute */
+ attr_value = u + 1;
+ ret = H5Awrite(attr, H5T_NATIVE_UINT, &attr_value);
+ CHECK(ret, FAIL, "H5Awrite");
+
+ /* Close attribute */
+ ret = H5Aclose(attr);
+ CHECK(ret, FAIL, "H5Aclose");
+
+ /* Create attribute on second dataset */
+ attr = H5Acreate(dataset2, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT);
+ CHECK(attr, FAIL, "H5Acreate");
+
+ /* Check that attribute is shared */
+ is_shared = H5A_is_shared_test(attr);
+ VERIFY(is_shared, TRUE, "H5A_is_shared_test");
+
+ /* Check refcount for attribute */
+ ret = H5A_get_shared_rc_test(attr, &shared_refcount);
+ CHECK(ret, FAIL, "H5A_get_shared_rc_test");
+ VERIFY(shared_refcount, 1, "H5A_get_shared_rc_test");
+
+ /* Write data into the attribute */
+ attr_value = u + 1;
+ ret = H5Awrite(attr, H5T_NATIVE_UINT, &attr_value);
+ CHECK(ret, FAIL, "H5Awrite");
+
+ /* Check refcount for attribute */
+ ret = H5A_get_shared_rc_test(attr, &shared_refcount);
+ CHECK(ret, FAIL, "H5A_get_shared_rc_test");
+ VERIFY(shared_refcount, 2, "H5A_get_shared_rc_test");
+
+ /* Close attribute */
+ ret = H5Aclose(attr);
+ CHECK(ret, FAIL, "H5Aclose");
+ } /* end for */
+
+ /* Check on dataset's attribute storage status */
+ is_dense = H5O_is_attr_dense_test(dataset);
+ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
+
+#ifdef LATER
+ /* Add one more attribute, to push into "dense" storage */
+ /* Create attribute */
+ sprintf(attrname, "attr %02u", u);
+ attr = H5Acreate(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT);
+ CHECK(attr, FAIL, "H5Acreate");
+
+ /* Check on dataset's attribute storage status */
+ is_dense = H5O_is_attr_dense_test(dataset);
+ VERIFY(is_dense, TRUE, "H5O_is_attr_dense_test");
+
+ /* Write data into the attribute */
+ ret = H5Awrite(attr, H5T_NATIVE_UINT, &u);
+ CHECK(ret, FAIL, "H5Awrite");
+
+ /* Close attribute */
+ ret = H5Aclose(attr);
+ CHECK(ret, FAIL, "H5Aclose");
+#endif /* LATER */
+
+ /* Close dataspace */
+ ret = H5Sclose(sid);
+ CHECK(ret, FAIL, "H5Sclose");
+
+ /* Close Dataset2 */
+ ret = H5Dclose(dataset);
+ CHECK(ret, FAIL, "H5Dclose");
+ ret = H5Dclose(dataset2);
+ CHECK(ret, FAIL, "H5Dclose");
+
+ /* Close file */
+ ret = H5Fclose(fid);
+ CHECK(ret, FAIL, "H5Fclose");
+} /* test_attr_shared_write() */
/****************************************************************
**
@@ -2117,6 +2279,20 @@ test_attr(void)
ret = H5Pset_latest_format(fapl2, TRUE);
CHECK(ret, FAIL, "H5Pset_latest_format");
+ /* Create a default file creation property list */
+ fcpl = H5Pcreate(H5P_FILE_CREATE);
+ CHECK(fcpl, FAIL, "H5Pcreate");
+
+ /* Copy the file creation property list */
+ fcpl2 = H5Pcopy(fcpl);
+ CHECK(fcpl2, FAIL, "H5Pcopy");
+
+ /* Make attributes > 1 byte shared (i.e. all of them :-) */
+ ret = H5Pset_shared_mesg_nindexes(fcpl2, (unsigned)1);
+ CHECK_I(ret, "H5Pset_shared_mesg_nindexes");
+ ret = H5Pset_shared_mesg_index(fcpl2, (unsigned)1, H5O_MESG_ATTR_FLAG, (unsigned)1);
+ CHECK_I(ret, "H5Pset_shared_mesg_index");
+
#ifndef QAK
/* Loop over using new group format */
for(new_format = FALSE; new_format <= TRUE; new_format++) {
@@ -2158,20 +2334,6 @@ test_attr(void)
test_attr_dtype_shared(my_fapl); /* Test using shared dataypes in attributes */
} /* end for */
- /* Create a default file creation property list */
- fcpl = H5Pcreate(H5P_FILE_CREATE);
- CHECK(fcpl, FAIL, "H5Pcreate");
-
- /* Copy the file creation property list */
- fcpl2 = H5Pcopy(fcpl);
- CHECK(fcpl2, FAIL, "H5Pcopy");
-
- /* Make attributes > 1 byte shared (i.e. all of them :-) */
- ret = H5Pset_shared_mesg_nindexes(fcpl2, (unsigned)1);
- CHECK_I(ret, "H5Pset_shared_mesg_nindexes");
- ret = H5Pset_shared_mesg_index(fcpl2, (unsigned)1, H5O_MESG_ATTR_FLAG, (unsigned)1);
- CHECK_I(ret, "H5Pset_shared_mesg_index");
-
/* Tests on "new format" attribute storage */
/* Loop over using shared attributes */
for(use_shared = FALSE; use_shared <= TRUE; use_shared++) {
@@ -2191,6 +2353,9 @@ test_attr(void)
test_attr_dense_open(my_fcpl, fapl2); /* Test opening attributes in dense storage */
test_attr_dense_delete(my_fcpl, fapl2); /* Test deleting attributes in dense storage */
} /* end for */
+
+ /* Tests with both "new format" and shared attributes */
+ test_attr_shared_write(fcpl2, fapl2); /* Test writing to shared attributes in compact & dense storage */
#else /* QAK */
HDfprintf(stderr, "Uncomment tests!\n");
#endif /* QAK */