summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2007-02-06 12:18:05 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2007-02-06 12:18:05 (GMT)
commit571523db1ffab60b505a0f66d3f7c25f4d1752d7 (patch)
treec3da7f1799eb8048885c4ce2b5372ba5fd3c183a
parent4e57d80f2e085a80dfe5f55a39c15e1edc4366f9 (diff)
downloadhdf5-571523db1ffab60b505a0f66d3f7c25f4d1752d7.zip
hdf5-571523db1ffab60b505a0f66d3f7c25f4d1752d7.tar.gz
hdf5-571523db1ffab60b505a0f66d3f7c25f4d1752d7.tar.bz2
[svn-r13243] Description:
Add API routines for tracking & indexing the creation order on attributes. Tested on: Mac OS X/32 10.4.8 (amazon) FreeBSD/32 6.2 (duty)
-rw-r--r--src/H5O.c11
-rw-r--r--src/H5Oattribute.c2
-rw-r--r--src/H5Odbg.c15
-rw-r--r--src/H5Omessage.c16
-rw-r--r--src/H5Oprivate.h1
-rw-r--r--src/H5Pgcpl.c2
-rwxr-xr-xsrc/H5Pocpl.c103
-rw-r--r--src/H5Ppublic.h2
-rw-r--r--src/H5T.c2
9 files changed, 133 insertions, 21 deletions
diff --git a/src/H5O.c b/src/H5O.c
index 74edeca..ccebb8c 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -689,6 +689,10 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, hid_t ocpl_id,
if(H5P_get(oc_plist, H5O_CRT_ATTR_MIN_DENSE_NAME, &oh->min_dense) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get min. # of dense attributes")
+ /* Get object header flags */
+ if(H5P_get(oc_plist, H5O_CRT_OHDR_FLAGS_NAME, &oh->flags) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
/* Set starting values for attribute info */
oh->attr_fheap_addr = HADDR_UNDEF;
oh->name_bt2_addr = HADDR_UNDEF;
@@ -1080,11 +1084,8 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5O_touch_oh(H5F_t *f,
- hid_t dxpl_id,
- H5O_t *oh,
- hbool_t force,
- unsigned * oh_flags_ptr)
+H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hbool_t force,
+ unsigned * oh_flags_ptr)
{
time_t now; /* Current time */
herr_t ret_value = SUCCEED; /* Return value */
diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c
index feb2da0..a616943 100644
--- a/src/H5Oattribute.c
+++ b/src/H5Oattribute.c
@@ -262,7 +262,7 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr)
HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, FAIL, "unable to create new attribute in header")
} /* end else */
- /* Was new attribugte shared? */
+ /* Was new attribute shared? */
if((shared_mesg = H5O_msg_is_shared(H5O_ATTR_ID, attr)) > 0) {
hsize_t attr_rc; /* Attribute's ref count in shared message storage */
diff --git a/src/H5Odbg.c b/src/H5Odbg.c
index a53493e..90c9376 100644
--- a/src/H5Odbg.c
+++ b/src/H5Odbg.c
@@ -299,6 +299,12 @@ H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, i
"Birth Time:", buf);
/* Attribute tracking fields */
+ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Attribute creation order tracked:",
+ (oh->flags & H5P_CRT_ORDER_TRACKED) ? "Yes" : "No");
+ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Attribute creation order indexed:",
+ (oh->flags & H5P_CRT_ORDER_INDEXED) ? "Yes" : "No");
HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
"Max. compact attributes:",
(unsigned)oh->max_compact);
@@ -377,20 +383,19 @@ H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, i
(unsigned) (oh->mesg[i].type->id),
oh->mesg[i].type->name,
sequence[oh->mesg[i].type->id]++);
- HDfprintf (stream, "%*s%-*s %t\n", indent+3, "", MAX (0, fwidth-3),
+ HDfprintf(stream, "%*s%-*s %t\n", indent+3, "", MAX (0, fwidth-3),
"Dirty:",
oh->mesg[i].dirty);
- HDfprintf (stream, "%*s%-*s %s\n", indent+3, "", MAX (0, fwidth-3),
+ HDfprintf(stream, "%*s%-*s %s\n", indent+3, "", MAX (0, fwidth-3),
"Shared:",
(oh->mesg[i].flags & H5O_MSG_FLAG_SHARED) ? "Yes" : "No");
HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", MAX(0, fwidth - 3),
"Constant:",
(oh->mesg[i].flags & H5O_MSG_FLAG_CONSTANT) ? "Yes" : "No");
- if(oh->mesg[i].flags & ~H5O_MSG_FLAG_BITS) {
- HDfprintf (stream, "%*s%-*s 0x%02x\n", indent+3,"",MAX(0,fwidth-3),
+ if(oh->mesg[i].flags & ~H5O_MSG_FLAG_BITS)
+ HDfprintf(stream, "%*s%-*s 0x%02x\n", indent+3,"",MAX(0,fwidth-3),
"*** ADDITIONAL UNKNOWN FLAGS --->",
oh->mesg[i].flags & ~H5O_MSG_FLAG_BITS);
- } /* end if */
HDfprintf(stream, "%*s%-*s %Zu bytes\n", indent+3, "", MAX(0,fwidth-3),
"Raw size in obj header:",
oh->mesg[i].raw_size);
diff --git a/src/H5Omessage.c b/src/H5Omessage.c
index d598819..2831d6b 100644
--- a/src/H5Omessage.c
+++ b/src/H5Omessage.c
@@ -1681,7 +1681,7 @@ done:
*/
unsigned
H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
- unsigned *mesg_flags, void *mesg, unsigned *oh_flags_ptr)
+ unsigned *mesg_flags, void *native, unsigned *oh_flags_ptr)
{
htri_t shared_mesg; /* Should this message be stored in the Shared Message table? */
unsigned ret_value = UFAIL; /* Return value */
@@ -1694,15 +1694,15 @@ H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
HDassert(mesg_flags);
HDassert(!(*mesg_flags & H5O_MSG_FLAG_SHARED));
HDassert(type);
- HDassert(mesg);
+ HDassert(native);
HDassert(oh_flags_ptr);
/* Check if message is already shared */
- if((shared_mesg = H5O_msg_is_shared(type->id, mesg)) < 0)
+ if((shared_mesg = H5O_msg_is_shared(type->id, native)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, UFAIL, "error determining if message is shared")
else if(shared_mesg > 0) {
/* Increment message's reference count */
- if(type->link && (type->link)(f, dxpl_id, mesg) < 0)
+ if(type->link && (type->link)(f, dxpl_id, native) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, UFAIL, "unable to adjust shared message ref count")
*mesg_flags |= H5O_MSG_FLAG_SHARED;
} /* end if */
@@ -1710,7 +1710,7 @@ H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
/* Avoid unsharable messages */
if(!(*mesg_flags & H5O_MSG_FLAG_DONTSHARE)) {
/* Attempt to share message */
- if((shared_mesg = H5SM_try_share(f, dxpl_id, type->id, mesg)) > 0)
+ if((shared_mesg = H5SM_try_share(f, dxpl_id, type->id, native)) > 0)
/* Mark the message as shared */
*mesg_flags |= H5O_MSG_FLAG_SHARED;
else if(shared_mesg < 0)
@@ -1719,13 +1719,13 @@ H5O_msg_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type,
} /* end else */
/* Allocate space in the object header for the message */
- if((ret_value = H5O_alloc(f, dxpl_id, oh, type, mesg, oh_flags_ptr)) == UFAIL)
+ if((ret_value = H5O_alloc(f, dxpl_id, oh, type, native, oh_flags_ptr)) == UFAIL)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, UFAIL, "unable to allocate space for message")
/* Get the message's "creation index", if it has one */
if(type->get_crt_index) {
- /* Retrieve the creation index for the message */
- if((type->get_crt_index)(mesg, &oh->mesg[ret_value].crt_idx) < 0)
+ /* Retrieve the creation index from the native message */
+ if((type->get_crt_index)(native, &oh->mesg[ret_value].crt_idx) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, UFAIL, "unable to retrieve creation index")
} /* end if */
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 9cb0a0e..4a9dc95 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -80,6 +80,7 @@ typedef struct H5O_t H5O_t;
/* ========= Object Creation properties ============ */
#define H5O_CRT_ATTR_MAX_COMPACT_NAME "max compact attr" /* Max. # of attributes to store compactly */
#define H5O_CRT_ATTR_MIN_DENSE_NAME "min dense attr" /* Min. # of attributes to store densely */
+#define H5O_CRT_OHDR_FLAGS_NAME "object header flags" /* Object header flags */
/* ========= Object Copy properties ============ */
#define H5O_CPY_OPTION_NAME "copy object" /* Copy options */
diff --git a/src/H5Pgcpl.c b/src/H5Pgcpl.c
index 0e8ec9e..8f6ed3b 100644
--- a/src/H5Pgcpl.c
+++ b/src/H5Pgcpl.c
@@ -466,7 +466,7 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5Pget_creation_order_tracking
+ * Function: H5Pget_link_creation_order
*
* Purpose: Returns the flag indicating that creation order is tracked
* for links in a group.
diff --git a/src/H5Pocpl.c b/src/H5Pocpl.c
index ee62df1..482598d 100755
--- a/src/H5Pocpl.c
+++ b/src/H5Pocpl.c
@@ -49,6 +49,9 @@
/* Definitions for the min. # of attributes to store densely */
#define H5O_CRT_ATTR_MIN_DENSE_SIZE sizeof(unsigned)
#define H5O_CRT_ATTR_MIN_DENSE_DEF 6
+/* Definitions for the min. # of attributes to store densely */
+#define H5O_CRT_OHDR_FLAGS_SIZE sizeof(unsigned)
+#define H5O_CRT_OHDR_FLAGS_DEF 0
/******************/
@@ -117,6 +120,7 @@ H5P_ocrt_reg_prop(H5P_genclass_t *pclass)
{
unsigned attr_max_compact = H5O_CRT_ATTR_MAX_COMPACT_DEF; /* Default max. compact attribute storage settings */
unsigned attr_min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF; /* Default min. dense attribute storage settings */
+ unsigned ohdr_flags = H5O_CRT_OHDR_FLAGS_DEF; /* Default object header flag settings */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5P_ocrt_reg_prop)
@@ -131,6 +135,11 @@ H5P_ocrt_reg_prop(H5P_genclass_t *pclass)
&attr_min_dense, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+ /* Register object header flags property */
+ if(H5P_register(pclass, H5O_CRT_OHDR_FLAGS_NAME, H5O_CRT_OHDR_FLAGS_SIZE,
+ &ohdr_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P_ocrt_reg_prop() */
@@ -229,3 +238,97 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pget_attr_phase_change() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5Pset_attr_creation_order
+ *
+ * Purpose: Set the flags for creation order of attributes in a group
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * February 6, 2007
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags)
+{
+ H5P_genplist_t *plist; /* Property list pointer */
+ unsigned ohdr_flags; /* Object header flags */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_API(H5Pset_attr_creation_order, FAIL)
+ H5TRACE2("e", "iIu", plist_id, crt_order_flags);
+
+ /* Check for bad combination of flags */
+ if(!(crt_order_flags & H5P_CRT_ORDER_TRACKED) && (crt_order_flags & H5P_CRT_ORDER_INDEXED))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tracking creation order is required for index")
+
+ /* Get the plist structure */
+ if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+ /* Get object header flags */
+ if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+ /* Mask off previous attribute creation order flag settings */
+ ohdr_flags &= ~(H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED);
+
+ /* Update with new attribute creation order flags */
+ ohdr_flags |= (crt_order_flags & H5P_CRT_ORDER_TRACKED);
+ ohdr_flags |= (crt_order_flags & H5P_CRT_ORDER_INDEXED);
+
+ /* Set object header flags */
+ if(H5P_set(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object header flags")
+
+done:
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_attr_creation_order() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5Pget_attr_creation_order
+ *
+ * Purpose: Returns the flag indicating that creation order is tracked
+ * for attributes in a group.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Ferbruary 6, 2007
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags)
+{
+ herr_t ret_value = SUCCEED; /* return value */
+
+ FUNC_ENTER_API(H5Pget_attr_creation_order, FAIL)
+ H5TRACE2("e", "ix", plist_id, crt_order_flags);
+
+ /* Get values */
+ if(crt_order_flags) {
+ H5P_genplist_t *plist; /* Property list pointer */
+ unsigned ohdr_flags; /* Object header flags */
+
+ /* Reset the value to return */
+ *crt_order_flags = 0;
+
+ /* Get the plist structure */
+ if(NULL == (plist = H5P_object_verify(plist_id, H5P_GROUP_CREATE)))
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+ /* Get object header flags */
+ if(H5P_get(plist, H5O_CRT_OHDR_FLAGS_NAME, &ohdr_flags) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object header flags")
+
+ /* Set creation order flags to return */
+ *crt_order_flags = ohdr_flags & (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED);
+ } /* end if */
+
+done:
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_attr_creation_order() */
+
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index 515120b..0625592 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -221,6 +221,8 @@ H5_DLL hid_t H5Pcopy(hid_t plist_id);
/* Object creation property list (OCPL) routines */
H5_DLL herr_t H5Pset_attr_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense);
H5_DLL herr_t H5Pget_attr_phase_change(hid_t plist_id, unsigned *max_compact, unsigned *min_dense);
+H5_DLL herr_t H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags);
+H5_DLL herr_t H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags);
/* File creation property list (FCPL) routines */
H5_DLL herr_t H5Pget_version(hid_t plist_id, unsigned *boot/*out*/,
diff --git a/src/H5T.c b/src/H5T.c
index 7981606..861a35d 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -2458,7 +2458,7 @@ H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst,
int nprint = 0; /*number of paths shut down */
int i; /*counter */
- FUNC_ENTER_NOAPI_NOINIT(H5T_unregister)
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5T_unregister)
/* Remove matching entries from the soft list */
if(H5T_PERS_DONTCARE == pers || H5T_PERS_SOFT == pers) {