summaryrefslogtreecommitdiffstats
path: root/src/H5Oplist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Oplist.c')
-rw-r--r--src/H5Oplist.c206
1 files changed, 91 insertions, 115 deletions
diff --git a/src/H5Oplist.c b/src/H5Oplist.c
index 554d0b7..352df06 100644
--- a/src/H5Oplist.c
+++ b/src/H5Oplist.c
@@ -65,6 +65,12 @@ static int interface_initialize_g = 0;
/* Declare external the free list for hsize_t arrays */
H5FL_ARR_EXTERN(hsize_t);
+/* Declare the external free list for the H5P_genprop_t struct */
+H5FL_EXTERN(H5P_genprop_t);
+
+/* Declare the external free list for the H5P_genplist_t struct */
+H5FL_EXTERN(H5P_genplist_t);
+
#define UINT_ENCODE(dst, src) \
if (sizeof(src) == 2) { \
UINT16ENCODE(dst, src); \
@@ -131,7 +137,7 @@ H5O_plist_decode(H5F_t UNUSED *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
H5P_genclass_t *pclass; /* property list class to modify */
hid_t new_plist_id; /* property list ID of new list created */
int version; /* message version number */
- unsigned int i, nprops, hashsize;
+ unsigned int i, nprops;
void *ret_value;
FUNC_ENTER_NOAPI(H5O_plist_decode, NULL);
@@ -169,11 +175,9 @@ H5O_plist_decode(H5F_t UNUSED *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
++p;
UINT_DECODE(p, nprops);
- UINT_DECODE(p, hashsize);
/* Allocate new property list */
- if ((new_plist = H5MM_calloc(sizeof(H5P_genplist_t) +
- ((hashsize - 1) * sizeof(H5P_genprop_t *)))) == NULL)
+ if ((new_plist = H5FL_CALLOC(H5P_genplist_t)) == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
/* Initialize new property list */
@@ -183,7 +187,11 @@ H5O_plist_decode(H5F_t UNUSED *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
new_plist->class_init = 0; /* Initially, wait until the class
callback finishes to set */
- /* Create new property list */
+ /* Initialize the TBBT to hold the properties */
+ if((new_plist->props=H5TB_fast_dmake(H5TB_FAST_STR_COMPARE))==NULL)
+ HGOTO_ERROR(H5E_PLIST,H5E_CANTMAKETREE,NULL,"can't create TBBT for properties");
+
+ /* Insert properties into property list */
for (i = 0; i < nprops; ++i) {
H5P_genprop_t *tprop;
unsigned str_len;
@@ -192,35 +200,19 @@ H5O_plist_decode(H5F_t UNUSED *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
* Allocate and initialize the property structure which is going
* to hold the information we're reading in.
*/
- if (NULL == (tprop = H5MM_malloc(sizeof(H5P_genprop_t))))
+ if (NULL == (tprop = H5FL_CALLOC(H5P_genprop_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
- tprop->create = NULL;
- tprop->def_value = NULL;
- tprop->set = NULL;
- tprop->get = NULL;
- tprop->del = NULL;
- tprop->copy = NULL;
- tprop->close = NULL;
- tprop->next = NULL;
-
- /* Grab the XORed value of the name and get the length of the name */
- UINT_DECODE(p, tprop->xor_val);
+ /* Grab the length of the name */
UINT_DECODE(p, str_len);
- if (str_len) {
- /* If there is a name, allocate space for it and copy */
- if (NULL == (tprop->name = H5MM_malloc(str_len + 1))) {
- H5MM_xfree(tprop);
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
- }
-
- HDmemcpy(tprop->name, p, str_len + 1);
- p += str_len + 1;
- } else {
- tprop->name = NULL;
- ++p;
+ /* Allocate space for the name and copy it */
+ if (NULL == (tprop->name = H5MM_malloc(str_len + 1))) {
+ H5FL_FREE(H5P_genprop_t,tprop);
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
}
+ HDmemcpy(tprop->name, p, str_len + 1);
+ p += str_len + 1;
/* Grab the size of the "value" data */
UINT_DECODE(p, tprop->size);
@@ -228,18 +220,21 @@ H5O_plist_decode(H5F_t UNUSED *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
/* Allocate and memcpy the value part of the property. */
if ((tprop->value = H5MM_malloc(tprop->size)) == NULL) {
H5MM_xfree(tprop->name);
- H5MM_xfree(tprop);
+ H5FL_FREE(H5P_genprop_t,tprop);
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
}
HDmemcpy(tprop->value, p, tprop->size);
p += tprop->size;
+ /* Set the property's type */
+ tprop->type=H5P_PROP_WITHIN_LIST;
+
/* Insert the initialized property into the property list */
- if (H5P_add_prop(new_plist->props, new_plist->pclass->hashsize, tprop) < 0) {
+ if (H5P_add_prop(new_plist->props, tprop) < 0) {
H5MM_xfree(tprop->value);
H5MM_xfree(tprop->name);
- H5MM_xfree(tprop);
+ H5FL_FREE(H5P_genprop_t,tprop);
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, NULL, "Can't insert property into list");
}
@@ -292,9 +287,8 @@ static herr_t
H5O_plist_encode(H5F_t UNUSED *f, uint8_t *p, const void *mesg)
{
const H5P_genplist_t *plist = (const H5P_genplist_t *)mesg;
+ char *class_path; /* Pointer to class path generated for property list */
herr_t ret_value = SUCCEED;
- unsigned int i;
- char *class_path;
FUNC_ENTER_NOAPI(H5O_plist_encode, FAIL);
@@ -333,45 +327,47 @@ H5O_plist_encode(H5F_t UNUSED *f, uint8_t *p, const void *mesg)
HDfree(class_path);
UINT_ENCODE(p, plist->nprops);
- UINT_ENCODE(p, plist->pclass->hashsize);
- for (i = 0; i < plist->pclass->hashsize; ++i) {
- H5P_genprop_t *tprop = plist->props[i];
+ /* Encode the properties for this property list */
+ if(plist->nprops>0) {
+ H5TB_NODE *curr_node; /* Current node in TBBT */
+ H5P_genprop_t *tprop; /* Pointer to property */
+
+ /* Walk through the properties in the old class */
+ curr_node=H5TB_first(plist->props->root);
+ while(curr_node!=NULL) {
+ size_t s; /* Length of property name */
- /* Walk through the list of properties at each hash location */
- while (tprop) {
- const char *n = tprop->name;
+ /* Get a pointer to the property from the node */
+ tprop=curr_node->data;
+ assert(tprop->name); /* Properties are guaranteed to have names */
/*
* Copy the meat of the generic property:
*
- * 1. The XORed version of the name
+ * 1. The length of the property name
* 2. The name of the property
* 3. The size of the property value
* 4. The property value
*/
- UINT_ENCODE(p, tprop->xor_val);
- if (n && *n) {
- size_t s = HDstrlen(n);
+ /* Get the name's length & encode it */
+ s = HDstrlen(tprop->name);
+ UINT_ENCODE(p, s);
- UINT_ENCODE(p, s);
- HDmemcpy(p, n, s + 1);
- p += s + 1;
- } else {
- /* if there isn't a name, put a NULL there */
- UINT_ENCODE(p, 0u);
- *p++ = '\0';
- }
+ /* Encode the name itself */
+ HDmemcpy(p, tprop->name, s + 1);
+ p += s + 1;
+ /* Encode the property value's size & data */
UINT_ENCODE(p, tprop->size);
HDmemcpy(p, tprop->value, tprop->size);
p += tprop->size;
- /* Go to next registered property in class */
- tprop = tprop->next;
- }
- }
+ /* Get the next property node in the TBBT */
+ curr_node=H5TB_next(curr_node);
+ } /* end while */
+ } /* end if */
done:
FUNC_LEAVE(ret_value);
@@ -398,37 +394,17 @@ static size_t
H5O_plist_size(H5F_t UNUSED *f, const void *mesg)
{
const H5P_genplist_t *plist = (const H5P_genplist_t *)mesg;
- const H5P_genclass_t *pclass;
+ char *class_path=NULL; /* Pointer to class path generated for property list */
size_t ret_value;
- char *class_path = NULL;
- unsigned i;
FUNC_ENTER_NOAPI(H5O_plist_size, 0);
/* check args */
assert(plist);
- ret_value = 2 + /*version info */
+ ret_value = 1 + /*version info */
1; /*reserved */
- /*
- * Loop through the class and its parent(s) to gather the complete
- * length of the name. The class name encoded will look like:
- *
- * DerivedClass/ParentClass/.../BaseClass
- */
- pclass = plist->pclass;
-
- while (pclass) {
- if (pclass->name)
- ret_value += HDstrlen(pclass->name);/*length of class name */
-
- if ((pclass = pclass->parent) != NULL)
- ++ret_value; /*separating "/" */
- }
-
- ++ret_value; /*terminating NULL */
-
class_path = H5P_get_class_path(plist->pclass);
if (class_path)
@@ -437,31 +413,29 @@ H5O_plist_size(H5F_t UNUSED *f, const void *mesg)
++ret_value;
HDfree(class_path);
- ret_value += sizeof(plist->nprops) + /*num properties */
- sizeof(plist->pclass->hashsize); /*hash size */
- for (i = 0; i < plist->pclass->hashsize; ++i) {
- H5P_genprop_t *tprop = plist->props[i];
+ ret_value += sizeof(plist->nprops); /*num properties */
- /* Walk through the list of properties at each hash location */
- while (tprop) {
- const char *n = tprop->name;
+ /* Calculate the size of the properties for this property list */
+ if(plist->nprops>0) {
+ H5TB_NODE *curr_node; /* Current node in TBBT */
+ H5P_genprop_t *tprop; /* Pointer to property */
- ret_value += sizeof(tprop->xor_val) + /*xored value */
- sizeof(size_t); /*length of the name */
+ /* Walk through the properties in the old class */
+ curr_node=H5TB_first(plist->props->root);
+ while(curr_node!=NULL) {
+ /* Get a pointer to the property from the node */
+ tprop=curr_node->data;
- if (n && *n)
- ret_value += HDstrlen(n) + 1; /*the name */
- else
- ++ret_value; /*the name: NULL */
+ ret_value += sizeof(size_t); /*length of the name */
+ ret_value += HDstrlen(tprop->name) + 1; /*the name */
+ ret_value += sizeof(tprop->size) + /*size of data size */
+ tprop->size; /*the data */
- ret_value += sizeof(tprop->size) + /*size of data size */
- tprop->size; /*the data */
-
- /* Go to next registered property in class */
- tprop = tprop->next;
- }
- }
+ /* Get the next property node in the TBBT */
+ curr_node=H5TB_next(curr_node);
+ } /* end while */
+ } /* end if */
done:
FUNC_LEAVE(ret_value);
@@ -513,8 +487,7 @@ H5O_plist_debug(H5F_t UNUSED *f, const void *mesg, FILE *stream,
int indent, int fwidth)
{
const H5P_genplist_t *plist = (const H5P_genplist_t *)mesg;
- herr_t ret_value = SUCCEED;
- unsigned int i;
+ herr_t ret_value=SUCCEED;
FUNC_ENTER_NOAPI(H5O_plist_debug, FAIL);
@@ -531,27 +504,30 @@ H5O_plist_debug(H5F_t UNUSED *f, const void *mesg, FILE *stream,
HDfprintf(stream, "%*sProperties {\n", indent, "");
indent += 2;
- for (i = 0; i < plist->pclass->hashsize; ++i) {
- H5P_genprop_t *tprop = plist->props[i];
+ /* Calculate the size of the properties for this property list */
+ if(plist->nprops>0) {
+ H5TB_NODE *curr_node; /* Current node in TBBT */
+ H5P_genprop_t *tprop; /* Pointer to property */
- /* Walk through the list of properties at each hash location */
- while (tprop) {
+ /* Walk through the properties in the old class */
+ curr_node=H5TB_first(plist->props->root);
+ while(curr_node!=NULL) {
register unsigned int j;
+ /* Get a pointer to the property from the node */
+ tprop=curr_node->data;
+
HDfprintf(stream, "%*sProperty {\n", indent, "");
indent += 2;
/*
- * Copy the meat of the generic property:
+ * Print the meat of the generic property:
*
* 1. The name of the property
- * 2. The XORed version of the name
- * 3. The size of the property value
- * 4. The property value
+ * 2. The size of the property value
+ * 3. The property value
*/
- HDfprintf(stream, "%*sName: ", indent, "");
- HDfprintf(stream, "%s\n", tprop->name ? tprop->name : "(null)");
- HDfprintf(stream, "%*sXOR Value: %d\n", indent, "", tprop->xor_val);
+ HDfprintf(stream, "%*sName: %s\n", indent, "", tprop->name);
HDfprintf(stream, "%*sValue Size: %d\n", indent, "", tprop->size);
HDfprintf(stream, "%*sValue: ", indent, "");
@@ -561,10 +537,10 @@ H5O_plist_debug(H5F_t UNUSED *f, const void *mesg, FILE *stream,
indent -= 2;
HDfprintf(stream, "\n%*s}\n", indent, "");
- /* Go to next registered property in class */
- tprop = tprop->next;
- }
- }
+ /* Get the next property node in the TBBT */
+ curr_node=H5TB_next(curr_node);
+ } /* end while */
+ } /* end if */
indent -= 2;
HDfprintf(stream, "%*s}\n", indent, "");