diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2004-11-17 16:53:38 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2004-11-17 16:53:38 (GMT) |
commit | 1878ad9c2cc038e1739887b12a26512daf76eefc (patch) | |
tree | 948052b3e450ede9f30c2c4db7ba6e6f0657bc53 /src | |
parent | 94b852d15a0e2a52251071929e451ea7af414108 (diff) | |
download | hdf5-1878ad9c2cc038e1739887b12a26512daf76eefc.zip hdf5-1878ad9c2cc038e1739887b12a26512daf76eefc.tar.gz hdf5-1878ad9c2cc038e1739887b12a26512daf76eefc.tar.bz2 |
[svn-r9537] Purpose:
Code cleanup & optimizations
Description:
Clean up some of the code in attributes to avoid allocating memory and
performing type conversions when the conversion is a noop.
Avoid memory allocations of attribute data structures by switching to use
library's free list memory allocator routines.
Avoid memory allocations of object header continuation data structures by
switching to use library's free list memory allocator routines.
Rearrange threaded, balanced binary tree macros slightly to avoid some
overhead.
Platforms tested:
FreeBSD 4.10 (sleipnir) w/parallel
Solaris 2.7 (arabica)
Too minor to require h5committest
Diffstat (limited to 'src')
-rw-r--r-- | src/H5A.c | 189 | ||||
-rw-r--r-- | src/H5Apkg.h | 3 | ||||
-rw-r--r-- | src/H5O.c | 5 | ||||
-rw-r--r-- | src/H5Oattr.c | 25 | ||||
-rw-r--r-- | src/H5Ocont.c | 37 | ||||
-rw-r--r-- | src/H5TBprivate.h | 5 |
6 files changed, 177 insertions, 87 deletions
@@ -26,6 +26,7 @@ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ #include "H5Eprivate.h" /* Error handling */ +#include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Spkg.h" /* Dataspace functions */ @@ -43,6 +44,9 @@ static herr_t H5A_rename(H5G_entry_t *ent, const char *old_name, const char *new /* The number of reserved IDs in dataset ID group */ #define H5A_RESERVED_ATOMS 0 +/* Declare the free lists for H5A_t's */ +H5FL_DEFINE(H5A_t); + /*-------------------------------------------------------------------------- NAME @@ -229,7 +233,7 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set") /* Build the attribute information */ - if((attr = H5MM_calloc(sizeof(H5A_t)))==NULL) + if((attr = H5FL_CALLOC(H5A_t))==NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for attribute info") /* Copy the attribute name */ @@ -509,7 +513,7 @@ static hid_t H5A_open(H5G_entry_t *ent, unsigned idx, hid_t dxpl_id) { H5A_t *attr = NULL; - hid_t ret_value = FAIL; + hid_t ret_value; FUNC_ENTER_NOAPI_NOINIT(H5A_open) @@ -527,9 +531,8 @@ H5A_open(H5G_entry_t *ent, unsigned idx, hid_t dxpl_id) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to copy entry") /* Hold the symbol table entry (and file) open */ - if (H5O_open(&(attr->ent)) < 0) { + if (H5O_open(&(attr->ent)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open") - } attr->ent_opened=1; /* Register the new attribute and get an ID for it */ @@ -622,7 +625,7 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) size_t dst_type_size; /* size of destination type*/ size_t buf_size; /* desired buffer size */ int idx; /* index of attribute in object header */ - herr_t ret_value = FAIL; + herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT(H5A_write) @@ -635,44 +638,59 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) HGOTO_ERROR (H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts,snelmts,hssize_t,size_t); - /* Check for null dataspace */ if(nelmts>0) { /* Get the memory and file datatype sizes */ src_type_size = H5T_get_size(mem_type); dst_type_size = H5T_get_size(attr->dt); - /* Get the maximum buffer size needed and allocate it */ - buf_size=nelmts*MAX(src_type_size,dst_type_size); - if (NULL==(tconv_buf = H5MM_malloc (buf_size)) || NULL==(bkg_buf = H5MM_calloc(buf_size))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - - /* Copy the user's data into the buffer for conversion */ - HDmemcpy(tconv_buf,buf,(src_type_size*nelmts)); - /* Convert memory buffer into disk buffer */ /* Set up type conversion function */ - if (NULL == (tpath = H5T_path_find(mem_type, attr->dt, NULL, NULL, dxpl_id))) { + if (NULL == (tpath = H5T_path_find(mem_type, attr->dt, NULL, NULL, dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types") - } else if (!H5T_path_noop(tpath)) { + + /* Check for type conversion required */ + if (!H5T_path_noop(tpath)) { if ((src_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL)))<0 || (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL)))<0) HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion") - } - /* Perform data type conversion */ - if (H5T_convert(tpath, src_id, dst_id, nelmts, 0, 0, tconv_buf, bkg_buf, dxpl_id)<0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "data type conversion failed") + /* Get the maximum buffer size needed and allocate it */ + buf_size=nelmts*MAX(src_type_size,dst_type_size); + if (NULL==(tconv_buf = H5MM_malloc (buf_size)) || NULL==(bkg_buf = H5MM_calloc(buf_size))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + + /* Copy the user's data into the buffer for conversion */ + HDmemcpy(tconv_buf,buf,(src_type_size*nelmts)); + + /* Perform data type conversion */ + if (H5T_convert(tpath, src_id, dst_id, nelmts, 0, 0, tconv_buf, bkg_buf, dxpl_id)<0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "data type conversion failed") + + /* Free the previous attribute data buffer, if there is one */ + if(attr->data) + H5MM_xfree(attr->data); - /* Free the previous attribute data buffer, if there is one */ - if(attr->data) - H5MM_xfree(attr->data); + /* Set the pointer to the attribute data to the converted information */ + attr->data=tconv_buf; + } /* end if */ + /* No type conversion necessary */ + else { + HDassert(dst_type_size==src_type_size); + + /* Allocate the attribute buffer, if there isn't one */ + if(attr->data==NULL) + if (NULL==(attr->data = H5MM_malloc (dst_type_size*nelmts))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + + /* Copy the attribute data into the user's buffer */ + HDmemcpy(attr->data,buf,(dst_type_size*nelmts)); + } /* end else */ /* Look up the attribute for the object */ if((idx=H5A_get_index(&(attr->ent),attr->name,dxpl_id))<0) HGOTO_ERROR(H5E_ATTR, H5E_BADVALUE, FAIL, "attribute not found") /* Modify the attribute data */ - attr->data=tconv_buf; /* Set the data pointer temporarily */ if (H5O_modify(&(attr->ent), H5O_ATTR_ID, idx, 0, 1, attr, dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to update attribute header messages") } /* end if */ @@ -680,8 +698,6 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id) /* Indicate the the attribute doesn't need fill-values */ attr->initialized=TRUE; - ret_value=SUCCEED; - done: /* Release resources */ if (src_id >= 0) @@ -770,7 +786,7 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) size_t src_type_size; /* size of source type */ size_t dst_type_size; /* size of destination type */ size_t buf_size; /* desired buffer size */ - herr_t ret_value = FAIL; + herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT(H5A_read) @@ -783,7 +799,6 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) HGOTO_ERROR (H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid") H5_ASSIGN_OVERFLOW(nelmts,snelmts,hssize_t,size_t); - /* Check for null dataspace */ if(nelmts>0) { /* Get the memory and file datatype sizes */ src_type_size = H5T_get_size(attr->dt); @@ -794,35 +809,42 @@ H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id) HDmemset(buf,0,(dst_type_size*nelmts)); } /* end if */ else { /* Attribute exists and has a value */ - /* Get the maximum buffer size needed and allocate it */ - buf_size=nelmts*MAX(src_type_size,dst_type_size); - if (NULL==(tconv_buf = H5MM_malloc (buf_size)) || NULL==(bkg_buf = H5MM_calloc(buf_size))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - - /* Copy the attribute data into the buffer for conversion */ - HDmemcpy(tconv_buf,attr->data,(src_type_size*nelmts)); - /* Convert memory buffer into disk buffer */ /* Set up type conversion function */ - if (NULL == (tpath = H5T_path_find(attr->dt, mem_type, NULL, NULL, dxpl_id))) { + if (NULL == (tpath = H5T_path_find(attr->dt, mem_type, NULL, NULL, dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types") - } else if (!H5T_path_noop(tpath)) { + + /* Check for type conversion required */ + if (!H5T_path_noop(tpath)) { if ((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->dt, H5T_COPY_ALL)))<0 || (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL)))<0) HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion") - } - /* Perform data type conversion. */ - if (H5T_convert(tpath, src_id, dst_id, nelmts, 0, 0, tconv_buf, bkg_buf, dxpl_id)<0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "data type conversion failed") + /* Get the maximum buffer size needed and allocate it */ + buf_size=nelmts*MAX(src_type_size,dst_type_size); + if (NULL==(tconv_buf = H5MM_malloc (buf_size)) || NULL==(bkg_buf = H5MM_calloc(buf_size))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + + /* Copy the attribute data into the buffer for conversion */ + HDmemcpy(tconv_buf,attr->data,(src_type_size*nelmts)); + + /* Perform data type conversion. */ + if (H5T_convert(tpath, src_id, dst_id, nelmts, 0, 0, tconv_buf, bkg_buf, dxpl_id)<0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "data type conversion failed") - /* Copy the converted data into the user's buffer */ - HDmemcpy(buf,tconv_buf,(dst_type_size*nelmts)); + /* Copy the converted data into the user's buffer */ + HDmemcpy(buf,tconv_buf,(dst_type_size*nelmts)); + } /* end if */ + /* No type conversion necessary */ + else { + HDassert(dst_type_size==src_type_size); + + /* Copy the attribute data into the user's buffer */ + HDmemcpy(buf,attr->data,(dst_type_size*nelmts)); + } /* end else */ } /* end else */ } /* end if */ - ret_value=SUCCEED; - done: /* Release resources */ if (src_id >= 0) @@ -1217,7 +1239,7 @@ H5A_rename(H5G_entry_t *ent, const char *old_name, const char *new_name, hid_t d assert(new_name); /* Build the attribute information */ - if((found_attr = HDcalloc(1, sizeof(H5A_t)))==NULL) + if((found_attr = H5FL_CALLOC(H5A_t))==NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for attribute info") /* Read in the existing attributes to check for duplicates */ @@ -1489,9 +1511,10 @@ done: *------------------------------------------------------------------------- */ H5A_t * -H5A_copy(const H5A_t *old_attr) +H5A_copy(H5A_t *_new_attr, const H5A_t *old_attr) { H5A_t *new_attr=NULL; + hbool_t allocated_attr=FALSE; /* Whether the attribute was allocated */ H5A_t *ret_value=NULL; /* Return value */ FUNC_ENTER_NOAPI(H5A_copy, NULL) @@ -1500,8 +1523,13 @@ H5A_copy(const H5A_t *old_attr) assert(old_attr); /* get space */ - if (NULL==(new_attr = H5MM_calloc(sizeof(H5A_t)))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + if(_new_attr==NULL) { + if (NULL==(new_attr = H5FL_MALLOC(H5A_t))) + HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + allocated_attr=TRUE; + } /* end if */ + else + new_attr=_new_attr; /* Copy the top level of the attribute */ *new_attr = *old_attr; @@ -1524,7 +1552,7 @@ H5A_copy(const H5A_t *old_attr) done: if(ret_value==NULL) { - if(new_attr!=NULL) + if(new_attr!=NULL && allocated_attr) (void)H5A_close(new_attr); } /* end if */ @@ -1533,6 +1561,47 @@ done: /*------------------------------------------------------------------------- + * Function: H5A_free + * + * Purpose: Frees all memory associated with an attribute, but does not + * free the H5A_t structure (which should be done in H5T_close). + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Monday, November 15, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5A_free(H5A_t *attr) +{ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5A_free, FAIL) + + assert(attr); + + /* Free dynamicly allocated items */ + if(attr->name) + H5MM_xfree(attr->name); + if(attr->dt) + if(H5T_close(attr->dt)<0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info") + if(attr->ds) + if(H5S_close(attr->ds)<0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info") + if(attr->data) + H5MM_xfree(attr->data); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5A_free() */ + + +/*------------------------------------------------------------------------- * Function: H5A_close * * Purpose: Frees an attribute and all associated memory. @@ -1556,7 +1625,7 @@ H5A_close(H5A_t *attr) assert(attr); /* Check if the attribute has any data yet, if not, fill with zeroes */ - if(attr->ent_opened && !attr->initialized && attr->data_size) { + if(attr->ent_opened && !attr->initialized) { uint8_t *tmp_buf=H5MM_calloc(attr->data_size); if (NULL == tmp_buf) HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed for attribute fill-value") @@ -1570,27 +1639,19 @@ H5A_close(H5A_t *attr) } /* end if */ /* Free dynamicly allocated items */ - if(attr->name) - H5MM_xfree(attr->name); - if(attr->dt) - if(H5T_close(attr->dt)<0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info") - if(attr->ds) - if(H5S_close(attr->ds)<0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info") - if(attr->data) - H5MM_xfree(attr->data); + if(H5A_free(attr)<0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info") /* Close the object's symbol-table entry */ if(attr->ent_opened) if(H5O_close(&(attr->ent))<0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release object header info") - H5MM_xfree(attr); + H5FL_FREE(H5A_t, attr); done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5A_close() */ /*------------------------------------------------------------------------- diff --git a/src/H5Apkg.h b/src/H5Apkg.h index 9c837ab..a354a48 100644 --- a/src/H5Apkg.h +++ b/src/H5Apkg.h @@ -55,7 +55,8 @@ struct H5A_t { }; /* Function prototypes for H5A package scope */ -H5_DLL H5A_t *H5A_copy(const H5A_t *old_attr); +H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr); +H5_DLL herr_t H5A_free(H5A_t *attr); H5_DLL herr_t H5A_close(H5A_t *attr); #endif @@ -154,6 +154,9 @@ H5FL_BLK_DEFINE_STATIC(chunk_image); /* Declare external the free list for time_t's */ H5FL_EXTERN(time_t); +/* Declare extern the free list for H5O_cont_t's */ +H5FL_EXTERN(H5O_cont_t); + /*------------------------------------------------------------------------- * Function: H5O_init_interface @@ -2918,7 +2921,7 @@ H5O_alloc_new_chunk(H5F_t *f, H5O_t *oh, size_t size) */ oh->mesg[found_null].type = H5O_CONT; oh->mesg[found_null].dirty = TRUE; - if (NULL==(cont = H5MM_calloc(sizeof(H5O_cont_t)))) + if (NULL==(cont = H5FL_MALLOC(H5O_cont_t))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, UFAIL, "memory allocation failed"); cont->addr = HADDR_UNDEF; cont->size = 0; diff --git a/src/H5Oattr.c b/src/H5Oattr.c index 1493403..79262b4 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -67,6 +67,9 @@ const H5O_class_t H5O_ATTR[1] = {{ /* Flags for attribute flag encoding */ #define H5O_ATTR_FLAG_TYPE_SHARED 0x01 +/* Declare extern the free list for H5A_t's */ +H5FL_EXTERN(H5A_t); + /* Declare external the free list for H5S_t's */ H5FL_EXTERN(H5S_t); @@ -118,7 +121,7 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t UNUSED * assert(f); assert(p); - if (NULL==(attr = H5MM_calloc(sizeof(H5A_t)))) + if (NULL==(attr = H5FL_CALLOC(H5A_t))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); /* Version number */ @@ -141,9 +144,8 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t UNUSED * UINT16DECODE(p, attr->ds_size); /* Decode and store the name */ - if (NULL==(attr->name=H5MM_malloc(name_len))) + if (NULL==(attr->name=H5MM_strdup((const char *)p))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDmemcpy(attr->name,p,name_len); if(version < H5O_ATTR_VERSION_NEW) p += H5O_ALIGN(name_len); /* advance the memory pointer */ else @@ -378,14 +380,8 @@ H5O_attr_copy(const void *_src, void *_dst) assert(src); /* copy */ - if (NULL == (dst = H5A_copy(src))) + if (NULL == (dst = H5A_copy(_dst,src))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "can't copy attribute"); - /* was result already allocated? */ - if (_dst) { - *((H5A_t *) _dst) = *dst; - H5MM_xfree(dst); - dst = (H5A_t *) _dst; - } /* Set return value */ ret_value=dst; @@ -491,13 +487,8 @@ H5O_attr_reset(void *_mesg) FUNC_ENTER_NOAPI_NOINIT(H5O_attr_reset); - if (attr) { - if (NULL==(tmp = H5MM_malloc(sizeof(H5A_t)))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - HDmemcpy(tmp,attr,sizeof(H5A_t)); - H5A_close(tmp); - HDmemset(attr, 0, sizeof(H5A_t)); - } + if (attr) + H5A_free(attr); done: FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5Ocont.c b/src/H5Ocont.c index 12e5ee7..79da2f7 100644 --- a/src/H5Ocont.c +++ b/src/H5Ocont.c @@ -32,6 +32,7 @@ #include "H5private.h" #include "H5Eprivate.h" +#include "H5FLprivate.h" /* Free Lists */ #include "H5MMprivate.h" #include "H5Opkg.h" /* Object header functions */ @@ -40,6 +41,7 @@ /* PRIVATE PROTOTYPES */ static void *H5O_cont_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p, H5O_shared_t *sh); static herr_t H5O_cont_encode(H5F_t *f, uint8_t *p, const void *_mesg); +static herr_t H5O_cont_free (void *mesg); static herr_t H5O_cont_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int indent, int fwidth); @@ -53,7 +55,7 @@ const H5O_class_t H5O_CONT[1] = {{ NULL, /*no copy method */ NULL, /*no size method */ NULL, /*reset method */ - NULL, /* free method */ + H5O_cont_free, /* free method */ NULL, /* file delete method */ NULL, /* link method */ NULL, /*get share method */ @@ -61,6 +63,9 @@ const H5O_class_t H5O_CONT[1] = {{ H5O_cont_debug, /*debugging */ }}; +/* Declare the free list for H5O_cont_t's */ +H5FL_DEFINE(H5O_cont_t); + /*------------------------------------------------------------------------- * Function: H5O_cont_decode @@ -93,10 +98,11 @@ H5O_cont_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p, H5O_shared_t U assert (!sh); /* decode */ - if (NULL==(cont = H5MM_calloc(sizeof(H5O_cont_t)))) + if (NULL==(cont = H5FL_MALLOC(H5O_cont_t))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); H5F_addr_decode(f, &p, &(cont->addr)); H5F_DECODE_LENGTH(f, p, cont->size); + cont->chunkno=0; /* Set return value */ ret_value=cont; @@ -142,6 +148,33 @@ H5O_cont_encode(H5F_t *f, uint8_t *p, const void *_mesg) /*------------------------------------------------------------------------- + * Function: H5O_cont_free + * + * Purpose: Free's the message + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Monday, November 15, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_cont_free (void *mesg) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_cont_free); + + assert (mesg); + + H5FL_FREE(H5O_cont_t,mesg); + + FUNC_LEAVE_NOAPI(SUCCEED); +} /* end H5O_cont_free() */ + + +/*------------------------------------------------------------------------- * Function: H5O_cont_debug * * Purpose: Prints debugging info. diff --git a/src/H5TBprivate.h b/src/H5TBprivate.h index f66d87c..0e374e3 100644 --- a/src/H5TBprivate.h +++ b/src/H5TBprivate.h @@ -62,10 +62,11 @@ typedef int (*H5TB_cmp_t)(const void *k1, const void *k2, int cmparg); # define Intern(n) ( LeftCnt(n) && RightCnt(n) ) # define UnBal(n) ( LeftCnt(n)>RightCnt(n) ? LEFT : \ LeftCnt(n)==RightCnt(n) ? 0 : RIGHT) +# define UnBalanced(n) ( LeftCnt(n)!=RightCnt(n) ? 1 : 0) # define Double(n) ( H5TB_DOUBLE & (n)->flags ) # define Other(side) ( LEFT + RIGHT - (side) ) -# define Delta(n,s) ( ( Heavy(n,s) ? 1 : -1 ) \ - * ( Double(n) ? 2 : UnBal(n) ? 1 : 0 ) ) +# define Weight(n) ( Double(n) ? 2 : UnBalanced(n) ) +# define Delta(n,s) ( Heavy(n,s) ? Weight(n) : -Weight(n) ) # define SetFlags(n,s,b,i) ( ( -2<(b) && (b)<2 ? 0 : H5TB_DOUBLE ) \ | ( 0>(b) ? H5TB_HEAVY(s) : (b)>0 ? H5TB_HEAVY(Other(s)) : 0 ) \ | ( (i) ? H5TB_INTERN : 0 ) ) |