summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5Adense.c8
-rw-r--r--src/H5Oattr.c70
-rw-r--r--src/H5Odtype.c16
-rw-r--r--src/H5Ofill.c10
-rw-r--r--src/H5Opline.c10
-rw-r--r--src/H5Oprivate.h2
-rw-r--r--src/H5Osdspace.c12
-rw-r--r--src/H5Oshared.c35
8 files changed, 74 insertions, 89 deletions
diff --git a/src/H5Adense.c b/src/H5Adense.c
index e2a3d76..3258019 100644
--- a/src/H5Adense.c
+++ b/src/H5Adense.c
@@ -66,8 +66,8 @@
#define H5A_CORDER_BT2_MERGE_PERC 40
#define H5A_CORDER_BT2_SPLIT_PERC 100
-/* Size of stack buffer for serialized messages */
-#define H5A_MESG_BUF_SIZE 128
+/* Size of stack buffer for serialized attributes */
+#define H5A_ATTR_BUF_SIZE 128
/******************/
@@ -620,7 +620,7 @@ H5A_dense_insert(H5F_t *f, hid_t dxpl_id, const H5O_t *oh, unsigned mesg_flags,
H5HF_t *shared_fheap = NULL; /* Fractal heap handle for shared header messages */
uint8_t id[H5A_DENSE_FHEAP_ID_LEN]; /* Heap ID of attribute to insert */
H5O_shared_t sh_mesg; /* Shared object header message */
- uint8_t attr_buf[H5A_MESG_BUF_SIZE]; /* Buffer for serializing message */
+ uint8_t attr_buf[H5A_ATTR_BUF_SIZE]; /* Buffer for serializing message */
void *attr_ptr = NULL; /* Pointer to serialized message */
htri_t attr_sharable; /* Flag indicating attributes are sharable */
herr_t ret_value = SUCCEED; /* Return value */
@@ -812,7 +812,7 @@ H5A_dense_write(H5F_t *f, hid_t dxpl_id, const H5O_t *oh, const H5A_t *attr)
H5HF_t *shared_fheap = NULL; /* Fractal heap handle for shared header messages */
H5HF_t *fheap = NULL; /* Fractal heap handle */
size_t attr_size; /* Size of serialized attribute in the heap */
- uint8_t attr_buf[H5A_MESG_BUF_SIZE]; /* Buffer for serializing attribute */
+ uint8_t attr_buf[H5A_ATTR_BUF_SIZE]; /* Buffer for serializing attribute */
void *attr_ptr = NULL; /* Pointer to serialized attribute */
htri_t attr_sharable; /* Flag indicating attributes are sharable */
herr_t ret_value = SUCCEED; /* Return value */
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 59a684e..bc2b81f 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -650,8 +650,6 @@ herr_t
H5O_attr_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
{
const H5A_t *attr = (const H5A_t *) _mesg;
- htri_t tri_ret;
- H5O_shared_t sh_mesg;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5O_attr_delete)
@@ -660,33 +658,37 @@ H5O_attr_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
HDassert(f);
HDassert(attr);
- /* Remove both the datatype and dataspace from the SOHM heap if they're
- * shared there.
- */
- if((tri_ret = H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't tell if datatype is shared")
- if(tri_ret > 0)
- {
- if(H5O_msg_get_share(H5O_DTYPE_ID, attr->dt, &sh_mesg) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't get shared message from datatype")
- if(H5SM_try_delete(f, H5AC_dxpl_id, H5O_DTYPE_ID, &sh_mesg) < 0)
- HGOTO_ERROR(H5E_SOHM, H5E_CANTREMOVE, FAIL, "can't remove datatype from SOHM heap")
- } /* end if */
-
- if((tri_ret = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't tell if dataspace is shared")
- if(tri_ret > 0)
- {
- if(H5O_msg_get_share(H5O_SDSPACE_ID, attr->ds, &sh_mesg) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't get shared message from dataspace")
- if(H5SM_try_delete(f, H5AC_dxpl_id, H5O_SDSPACE_ID, &sh_mesg) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_SOHM, FAIL, "can't remove dataspace from SOHM heap")
- } /* end if */
-
- /* Check whether datatype is shared */
- if(H5T_committed(attr->dt)) {
- /* Decrement the reference count on the shared datatype, if requested */
- if(adj_link)
+ /* Check if we are adjusting link count on components in the file */
+ if(adj_link) {
+ htri_t tri_ret;
+ H5O_shared_t sh_mesg;
+
+ /* Remove both the datatype and dataspace from the SOHM heap if they're
+ * shared there.
+ */
+ if((tri_ret = H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't tell if datatype is shared")
+ if(tri_ret > 0)
+ {
+ if(H5O_msg_get_share(H5O_DTYPE_ID, attr->dt, &sh_mesg) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't get shared message from datatype")
+ if(H5SM_try_delete(f, H5AC_dxpl_id, H5O_DTYPE_ID, &sh_mesg) < 0)
+ HGOTO_ERROR(H5E_SOHM, H5E_CANTREMOVE, FAIL, "can't remove datatype from SOHM heap")
+ } /* end if */
+
+ if((tri_ret = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't tell if dataspace is shared")
+ if(tri_ret > 0)
+ {
+ if(H5O_msg_get_share(H5O_SDSPACE_ID, attr->ds, &sh_mesg) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't get shared message from dataspace")
+ if(H5SM_try_delete(f, H5AC_dxpl_id, H5O_SDSPACE_ID, &sh_mesg) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_SOHM, FAIL, "can't remove dataspace from SOHM heap")
+ } /* end if */
+
+ /* Check whether datatype is shared */
+ if(H5T_committed(attr->dt))
+ /* Decrement the reference count on the shared datatype */
if(H5T_link(attr->dt, -1, dxpl_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared datatype link count")
} /* end if */
@@ -1117,7 +1119,6 @@ static htri_t
H5O_attr_is_shared(const void *_mesg)
{
const H5A_t *mesg = (const H5A_t *)_mesg;
- htri_t ret_value;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_attr_is_shared)
@@ -1127,13 +1128,8 @@ H5O_attr_is_shared(const void *_mesg)
* library read a "committed attribute" if we ever create one in
* the future.
*/
- if(mesg->sh_loc.flags & (H5O_COMMITTED_FLAG | H5O_SHARED_IN_HEAP_FLAG))
- ret_value = TRUE;
- else
- ret_value = FALSE;
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_attr_is_shared */
+ FUNC_LEAVE_NOAPI(H5O_IS_SHARED(mesg->sh_loc.flags))
+} /* end H5O_attr_is_shared() */
/*--------------------------------------------------------------------------
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index f42120f..73f8686 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -1359,22 +1359,16 @@ H5O_dtype_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
*-------------------------------------------------------------------------
*/
static htri_t
-H5O_dtype_is_shared (const void *_mesg)
+H5O_dtype_is_shared(const void *_mesg)
{
- const H5T_t *dt = (const H5T_t *)_mesg;
- htri_t ret_value;
+ const H5T_t *mesg = (const H5T_t *)_mesg;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_dtype_is_shared)
- HDassert(dt);
-
- if(dt->sh_loc.flags & (H5O_COMMITTED_FLAG | H5O_SHARED_IN_HEAP_FLAG))
- ret_value = TRUE;
- else
- ret_value = FALSE;
+ HDassert(mesg);
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_dtype_is_shared */
+ FUNC_LEAVE_NOAPI(H5O_IS_SHARED(mesg->sh_loc.flags))
+} /* end H5O_dtype_is_shared() */
/*-------------------------------------------------------------------------
diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index 213df3f..2c6158b 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -747,7 +747,6 @@ static htri_t
H5O_fill_new_is_shared(const void *_mesg)
{
const H5O_fill_new_t *mesg = (const H5O_fill_new_t *)_mesg;
- htri_t ret_value;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_fill_new_is_shared)
@@ -757,13 +756,8 @@ H5O_fill_new_is_shared(const void *_mesg)
* library read a "committed fill value" if we ever create one in
* the future.
*/
- if(mesg->sh_loc.flags & (H5O_COMMITTED_FLAG | H5O_SHARED_IN_HEAP_FLAG))
- ret_value = TRUE;
- else
- ret_value = FALSE;
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_fill_new_is_shared */
+ FUNC_LEAVE_NOAPI(H5O_IS_SHARED(mesg->sh_loc.flags))
+} /* end H5O_fill_new_is_shared() */
/*-------------------------------------------------------------------------
diff --git a/src/H5Opline.c b/src/H5Opline.c
index 5756aab..ccbddd0 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -675,7 +675,6 @@ static htri_t
H5O_pline_is_shared(const void *_mesg)
{
const H5O_pline_t *mesg = (const H5O_pline_t *)_mesg;
- htri_t ret_value;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_pline_is_shared)
@@ -685,13 +684,8 @@ H5O_pline_is_shared(const void *_mesg)
* library read a "committed I/O pipeline" if we ever create one in
* the future.
*/
- if(mesg->sh_loc.flags & (H5O_COMMITTED_FLAG | H5O_SHARED_IN_HEAP_FLAG))
- ret_value = TRUE;
- else
- ret_value = FALSE;
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_pline_is_shared */
+ FUNC_LEAVE_NOAPI(H5O_IS_SHARED(mesg->sh_loc.flags))
+} /* end H5O_pline_is_shared() */
/*-------------------------------------------------------------------------
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 5e84ff6..cd68ae5 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -139,6 +139,8 @@ typedef struct H5O_copy_t {
#define H5O_SHARED_IN_HEAP_FLAG 0x01
#define H5O_COMMITTED_FLAG 0x02
+#define H5O_IS_SHARED(F) (((F) & (H5O_SHARED_IN_HEAP_FLAG | H5O_COMMITTED_FLAG)) ? TRUE : FALSE)
+
/*
* Shared object message.
* This needs to go first because other messages can be shared and
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index d691ca5..9b4c473 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -523,10 +523,9 @@ H5O_sdspace_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
*-------------------------------------------------------------------------
*/
static htri_t
-H5O_sdspace_is_shared (const void *_mesg)
+H5O_sdspace_is_shared(const void *_mesg)
{
const H5S_extent_t *mesg = (const H5S_extent_t *)_mesg;
- htri_t ret_value;
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_sdspace_is_shared)
@@ -536,13 +535,8 @@ H5O_sdspace_is_shared (const void *_mesg)
* library read a "committed dataspace" if we ever create one in
* the future.
*/
- if(mesg->sh_loc.flags & (H5O_COMMITTED_FLAG | H5O_SHARED_IN_HEAP_FLAG))
- ret_value = TRUE;
- else
- ret_value = FALSE;
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_sdspace_is_shared */
+ FUNC_LEAVE_NOAPI(H5O_IS_SHARED(mesg->sh_loc.flags))
+} /* end H5O_sdspace_is_shared() */
/*-------------------------------------------------------------------------
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index 07e5489..963e8f4 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -32,6 +32,7 @@
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Fpkg.h" /* File access */
+#include "H5FLprivate.h" /* Free lists */
#include "H5Gprivate.h" /* Groups */
#include "H5HFprivate.h" /* Fractal heap */
#include "H5MMprivate.h" /* Memory management */
@@ -83,6 +84,12 @@ const H5O_msg_class_t H5O_MSG_SHARED[1] = {{
#define H5O_SHARED_VERSION_3 3
#define H5O_SHARED_VERSION H5O_SHARED_VERSION_3
+/* Size of stack buffer for serialized messages */
+#define H5O_MESG_BUF_SIZE 128
+
+/* Declare a free list to manage the serialized message information */
+H5FL_BLK_DEFINE(ser_mesg);
+
/*-------------------------------------------------------------------------
* Function: H5O_shared_read
@@ -108,7 +115,8 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared,
const H5O_msg_class_t *type, void *mesg)
{
H5HF_t *fheap = NULL;
- unsigned char *buf = NULL; /* Pointer to raw message in heap */
+ uint8_t mesg_buf[H5O_MESG_BUF_SIZE]; /* Buffer for deserializing messages */
+ uint8_t *buf = NULL; /* Pointer to raw message in heap */
void *native_mesg = NULL; /* Used for messages shared in heap */
void *ret_value = NULL; /* Return value */
@@ -132,23 +140,27 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared,
/* Retrieve the fractal heap address for shared messages */
if((fheap_addr = H5SM_get_fheap_addr(f, type->id, dxpl_id)) == HADDR_UNDEF)
- HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, NULL, "can't get fheap address for shared messages")
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "can't get fheap address for shared messages")
/* Open the fractal heap */
if(NULL == (fheap = H5HF_open(f, dxpl_id, fheap_addr)))
- HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, NULL, "unable to open fractal heap")
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open fractal heap")
/* Get the size of the message in the heap */
if(H5HF_get_obj_len(fheap, dxpl_id, &(shared->u.heap_id), &buf_size) < 0)
- HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, NULL, "can't get message size from fractal heap.")
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "can't get message size from fractal heap.")
- /* Allocate buffer */
- if(NULL == (buf = H5MM_malloc(buf_size)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ /* Allocate space for serialized message, if necessary */
+ if(buf_size > sizeof(mesg_buf)) {
+ if(NULL == (buf = H5FL_BLK_MALLOC(ser_mesg, buf_size)))
+ HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "memory allocation failed")
+ } /* end if */
+ else
+ buf = mesg_buf;
/* Retrieve the message from the heap */
if(H5HF_read(fheap, dxpl_id, &(shared->u.heap_id), buf) < 0)
- HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "can't read message from fractal heap.")
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "can't read message from fractal heap.")
/* Decode the message */
if(NULL == (native_mesg = H5O_msg_decode(f, dxpl_id, type->id, buf)))
@@ -171,12 +183,11 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared,
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to set sharing information")
done:
- if(buf)
- H5MM_xfree(buf);
-
+ /* Release resources */
+ if(buf && buf != mesg_buf)
+ H5FL_BLK_FREE(ser_mesg, buf);
if(native_mesg)
H5O_msg_free(type->id, native_mesg);
-
if(fheap && H5HF_close(fheap, dxpl_id) < 0)
HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "can't close fractal heap")