diff options
Diffstat (limited to 'src/H5Oshared.c')
-rw-r--r-- | src/H5Oshared.c | 618 |
1 files changed, 52 insertions, 566 deletions
diff --git a/src/H5Oshared.c b/src/H5Oshared.c index 8a77744..dafe3d2 100644 --- a/src/H5Oshared.c +++ b/src/H5Oshared.c @@ -39,44 +39,6 @@ #include "H5Opkg.h" /* Object headers */ #include "H5SMprivate.h" /* Shared object header messages */ -static void *H5O_shared_decode(H5F_t*, hid_t dxpl_id, unsigned mesg_flags, const uint8_t*); -static herr_t H5O_shared_encode(H5F_t*, uint8_t*, const void*); -static void *H5O_shared_copy(const void *_mesg, void *_dest); -static size_t H5O_shared_size(const H5F_t*, const void *_mesg); -static herr_t H5O_shared_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, - hbool_t adj_link); -static herr_t H5O_shared_link(H5F_t *f, hid_t dxpl_id, const void *_mesg); -static herr_t H5O_shared_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *type, - const void *mesg_src, hbool_t *deleted, const H5O_copy_t *cpy_info, void *_udata); -static void *H5O_shared_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_type, - void *native_src, H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata); -static herr_t H5O_shared_debug(H5F_t*, hid_t dxpl_id, const void*, FILE*, int, int); - -/* This message derives from H5O message class */ -const H5O_msg_class_t H5O_MSG_SHARED[1] = {{ - H5O_SHARED_ID, /*message id number */ - "shared", /*message name for debugging */ - sizeof(H5O_shared_t), /*native message size */ - H5O_shared_decode, /*decode method */ - H5O_shared_encode, /*encode method */ - H5O_shared_copy, /*copy the native value */ - H5O_shared_size, /*size method */ - NULL, /*no reset method */ - NULL, /*no free method */ - H5O_shared_delete, /*file delete method */ - H5O_shared_link, /*link method */ - NULL, /*get share method */ - NULL, /*set share method */ - NULL, /*can share method */ - NULL, /*is shared method */ - H5O_shared_pre_copy_file, /* pre copy native value to file */ - H5O_shared_copy_file, /* copy native value to file */ - NULL, /* post copy native value to file */ - NULL, /* get creation index */ - NULL, /* set creation index */ - H5O_shared_debug /*debug method */ -}}; - /* First version, with full symbol table entry as link for object header sharing */ #define H5O_SHARED_VERSION_1 1 @@ -113,14 +75,13 @@ H5FL_BLK_DEFINE(ser_mesg); * *------------------------------------------------------------------------- */ -void * +static void * H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, - const H5O_msg_class_t *type, void *mesg) + const H5O_msg_class_t *type) { H5HF_t *fheap = NULL; 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 */ FUNC_ENTER_NOAPI_NOINIT(H5O_shared_read) @@ -166,39 +127,25 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, 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))) + if(NULL == (ret_value = H5O_msg_decode(f, dxpl_id, type->id, buf))) HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode shared message.") - - /* Check if there is a user buffer to fill */ - if(mesg) { - /* Copy this message to the user's buffer */ - if(NULL == (ret_value = (type->copy)(native_mesg, mesg))) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy message to user space") - } /* end if */ - else { - /* Otherwise, take ownership of the decoded native message */ - ret_value = native_mesg; - native_mesg = NULL; - } /* end else */ } /* end if */ else { HDassert(shared->flags & H5O_COMMITTED_FLAG); /* Get the shared message from an object header */ - if(NULL == (ret_value = H5O_msg_read(&(shared->u.oloc), type->id, 0, mesg, dxpl_id))) + if(NULL == (ret_value = H5O_msg_read(&(shared->u.oloc), type->id, 0, NULL, dxpl_id))) HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read message") } /* end else */ /* Mark the message as shared */ - if(type->set_share && (type->set_share)(ret_value, shared) < 0) + if((type->set_share)(ret_value, shared) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to set sharing information") done: /* Release resources */ if(buf && buf != mesg_buf) 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") @@ -207,7 +154,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5O_shared_link_adj_new + * Function: H5O_shared_link_adj * * Purpose: Changes the link count for the object referenced by a shared * message. @@ -228,12 +175,12 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5O_shared_link_adj_new(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, +H5O_shared_link_adj(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, const H5O_msg_class_t *type, int adjust) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_link_adj_new) + FUNC_ENTER_NOAPI_NOINIT(H5O_shared_link_adj) /* check args */ HDassert(f); @@ -270,70 +217,11 @@ H5O_shared_link_adj_new(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_link_adj_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_link_adj - * - * Purpose: Changes the link count for the object referenced by a shared - * message. - * - * This function changes the object header link count and is - * only relevant for committed messages. Messages shared in - * the heap are re-shared each time they're written, so their - * reference count is stored in the file-wide shared message - * index and is changed in a different place in the code. - * - * Return: Success: New link count, or 1 for messages in heap - * Failure: Negative - * - * Programmer: Quincey Koziol - * koziol@ncsa.uiuc.edu - * Sep 26 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static int -H5O_shared_link_adj(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared, int adjust) -{ - int ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_link_adj) - - /* check args */ - HDassert(f); - HDassert(shared); - - /* - * The shared message is stored in some other object header. - * The other object header must be in the same file as the - * new object header. Adjust the reference count on that - * object header. - */ - if(shared->flags & H5O_COMMITTED_FLAG) { - if(shared->u.oloc.file->shared != f->shared) - HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "interfile hard links are not allowed") - if((ret_value = H5O_link(&(shared->u.oloc), adjust, dxpl_id)) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count") - } /* end if */ - else { - /* Messages in the heap don't have file object ref counts; they - * return 1 as a dummy value. - */ - HDassert(shared->flags & H5O_SHARED_IN_HEAP_FLAG); - ret_value = 1; - } /* end else */ - -done: - FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_shared_link_adj() */ /*------------------------------------------------------------------------- - * Function: H5O_shared_decode_new + * Function: H5O_shared_decode * * Purpose: Decodes a shared object message * @@ -345,13 +233,13 @@ done: *------------------------------------------------------------------------- */ void * -H5O_shared_decode_new(H5F_t *f, hid_t dxpl_id, const uint8_t *buf, const H5O_msg_class_t *type) +H5O_shared_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *buf, const H5O_msg_class_t *type) { H5O_shared_t sh_mesg; /* Shared message info */ unsigned version; /* Shared message version */ void *ret_value; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_decode_new) + FUNC_ENTER_NOAPI_NOINIT(H5O_shared_decode) /* Check args */ HDassert(f); @@ -404,104 +292,16 @@ H5O_shared_decode_new(H5F_t *f, hid_t dxpl_id, const uint8_t *buf, const H5O_msg } /* end else if */ /* Retrieve actual message, through decoded shared message info */ - if(NULL == (ret_value = H5O_shared_read(f, dxpl_id, &sh_mesg, type, NULL))) + if(NULL == (ret_value = H5O_shared_read(f, dxpl_id, &sh_mesg, type))) HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to retrieve native message") done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_decode_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_decode - * - * Purpose: Decodes a shared object message and returns it. - * - * Return: Success: Ptr to a new shared object message. - * - * Failure: NULL - * - * Programmer: Robb Matzke - * Thursday, April 2, 1998 - * - *------------------------------------------------------------------------- - */ -static void * -H5O_shared_decode(H5F_t *f, hid_t UNUSED dxpl_id, unsigned UNUSED mesg_flags, - const uint8_t *buf) -{ - H5O_shared_t *mesg = NULL; - unsigned version; - void *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_decode) - - /* Check args */ - HDassert(f); - HDassert(buf); - - /* Decode */ - if(NULL == (mesg = (H5O_shared_t *)H5MM_calloc(sizeof(H5O_shared_t)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - - /* Version */ - version = *buf++; - if(version < H5O_SHARED_VERSION_1 || version > H5O_SHARED_VERSION_LATEST) - HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for shared object message") - - /* Get the shared information flags - * Flags are unused before version 3. - */ - if(version >= H5O_SHARED_VERSION_2) - mesg->flags = *buf++; - else { - mesg->flags = H5O_COMMITTED_FLAG; - buf++; - } /* end else */ - - /* Skip reserved bytes (for version 1) */ - if(version == H5O_SHARED_VERSION_1) - buf += 6; - - /* Body */ - if(version == H5O_SHARED_VERSION_1) - H5G_obj_ent_decode(f, &buf, &(mesg->u.oloc)); - else if (version >= H5O_SHARED_VERSION_2) { - /* If this message is in the heap, copy a heap ID. - * Otherwise, it is a named datatype, so copy an H5O_loc_t. - */ - if(mesg->flags & H5O_SHARED_IN_HEAP_FLAG) { - HDassert(version >= H5O_SHARED_VERSION_3 ); - HDmemcpy(&(mesg->u.heap_id), buf, sizeof(mesg->u.heap_id)); - } - else { - /* The H5O_COMMITTED_FLAG should be set if this message - * is from an older version before the flag existed. - */ - if(version < H5O_SHARED_VERSION_3) - mesg->flags = H5O_COMMITTED_FLAG; - - HDassert(mesg->flags & H5O_COMMITTED_FLAG); - - H5F_addr_decode(f, &buf, &(mesg->u.oloc.addr)); - mesg->u.oloc.file = f; - } /* end else */ - } /* end else if */ - - /* Set return value */ - ret_value = mesg; - -done: - if(ret_value == NULL) - if(mesg != NULL) - H5MM_xfree(mesg); - - FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_shared_decode() */ /*------------------------------------------------------------------------- - * Function: H5O_shared_encode_new + * Function: H5O_shared_encode * * Purpose: Encodes message _MESG into buffer BUF. * @@ -513,11 +313,11 @@ done: *------------------------------------------------------------------------- */ herr_t -H5O_shared_encode_new(const H5F_t *f, uint8_t *buf/*out*/, const H5O_shared_t *sh_mesg) +H5O_shared_encode(const H5F_t *f, uint8_t *buf/*out*/, const H5O_shared_t *sh_mesg) { unsigned version; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_encode_new) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_encode) /* Check args */ HDassert(f); @@ -546,60 +346,6 @@ H5O_shared_encode_new(const H5F_t *f, uint8_t *buf/*out*/, const H5O_shared_t *s H5F_addr_encode(f, &buf, sh_mesg->u.oloc.addr); FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5O_shared_encode_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_encode - * - * Purpose: Encodes message _MESG into buffer BUF. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Thursday, April 2, 1998 - * - * Modifications: - * Robb Matzke, 1998-07-20 - * Added a version number to the beginning of the message. - * - *------------------------------------------------------------------------- - */ -static herr_t -H5O_shared_encode(H5F_t *f, uint8_t *buf/*out*/, const void *_mesg) -{ - const H5O_shared_t *mesg = (const H5O_shared_t *)_mesg; - unsigned version; - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_encode) - - /* Check args */ - HDassert(f); - HDassert(buf); - HDassert(mesg); - - /* If this message is shared in the heap, we need to use version 3 of the - * encoding and encode the SHARED_IN_HEAP flag. - */ - if(mesg->flags & H5O_SHARED_IN_HEAP_FLAG || H5F_USE_LATEST_FORMAT(f)) - version = H5O_SHARED_VERSION_LATEST; - else { - HDassert(mesg->flags & H5O_COMMITTED_FLAG); - version = H5O_SHARED_VERSION_2; /* version 1 is no longer used */ - } /* end else */ - - *buf++ = version; - *buf++ = (unsigned)mesg->flags; - - /* Encode either the heap ID of the message or the address of the - * object header that holds it. - */ - if(mesg->flags & H5O_SHARED_IN_HEAP_FLAG) - HDmemcpy(buf, &(mesg->u.heap_id), sizeof(mesg->u.heap_id)); - else - H5F_addr_encode(f, &buf, mesg->u.oloc.addr); - - FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_shared_encode() */ @@ -619,40 +365,33 @@ H5O_shared_encode(H5F_t *f, uint8_t *buf/*out*/, const void *_mesg) * *------------------------------------------------------------------------- */ -static void * -H5O_shared_copy(const void *_mesg, void *_dest) +herr_t +H5O_shared_copy(void *_dst, const H5O_shared_t *src) { - const H5O_shared_t *mesg = (const H5O_shared_t *) _mesg; - H5O_shared_t *dest = (H5O_shared_t *) _dest; - void *ret_value; /* Return value */ + H5O_shared_t *dst = (H5O_shared_t *)_dst; - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_copy) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_copy) /* check args */ - HDassert(mesg); - if(!dest && NULL == (dest = (H5O_shared_t *)H5MM_malloc(sizeof(H5O_shared_t)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + HDassert(dst); + HDassert(src); /* copy */ - dest->flags = mesg->flags; - if(mesg->flags & H5O_COMMITTED_FLAG) - H5O_loc_copy(&(dest->u.oloc), &(mesg->u.oloc), H5_COPY_DEEP); - else if(mesg->flags & H5O_SHARED_IN_HEAP_FLAG) - dest->u.heap_id = mesg->u.heap_id; + dst->flags = src->flags; + if(src->flags & H5O_COMMITTED_FLAG) + H5O_loc_copy(&(dst->u.oloc), &(src->u.oloc), H5_COPY_DEEP); + else if(src->flags & H5O_SHARED_IN_HEAP_FLAG) + dst->u.heap_id = src->u.heap_id; else /* This message's sharing information is being reset */ - HDassert(mesg->flags == H5O_NOT_SHARED); - - /* Set return value */ - ret_value = dest; + HDassert(src->flags == H5O_NOT_SHARED); -done: - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_shared_copy() */ /*------------------------------------------------------------------------- - * Function: H5O_shared_size_new + * Function: H5O_shared_size * * Purpose: Returns the length of a shared object message. * @@ -665,11 +404,11 @@ done: *------------------------------------------------------------------------- */ size_t -H5O_shared_size_new(const H5F_t *f, const H5O_shared_t *sh_mesg) +H5O_shared_size(const H5F_t *f, const H5O_shared_t *sh_mesg) { size_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_size_new) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_size) if(sh_mesg->flags & H5O_COMMITTED_FLAG) { ret_value = 1 + /*version */ @@ -684,49 +423,11 @@ H5O_shared_size_new(const H5F_t *f, const H5O_shared_t *sh_mesg) } /* end else */ FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_size_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_size - * - * Purpose: Returns the length of a shared object message. - * - * Return: Success: Length - * - * Failure: 0 - * - * Programmer: Robb Matzke - * Thursday, April 2, 1998 - * - *------------------------------------------------------------------------- - */ -static size_t -H5O_shared_size(const H5F_t *f, const void *_mesg) -{ - const H5O_shared_t *shared = (const H5O_shared_t *)_mesg; - size_t ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_size) - - if(shared->flags & H5O_COMMITTED_FLAG) { - ret_value = 1 + /*version */ - 1 + /*the flags field */ - H5F_SIZEOF_ADDR(f); /*sharing by another obj hdr */ - } /* end if */ - else { - HDassert(shared->flags & H5O_SHARED_IN_HEAP_FLAG); - ret_value = 1 + /*version */ - 1 + /*the flags field */ - H5O_FHEAP_ID_LEN; /* Shared in the heap */ - } /* end else */ - - FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_shared_size() */ /*------------------------------------------------------------------------- - * Function: H5O_shared_delete_new + * Function: H5O_shared_delete * * Purpose: Free file space referenced by message * @@ -738,61 +439,16 @@ H5O_shared_size(const H5F_t *f, const void *_mesg) *------------------------------------------------------------------------- */ herr_t -H5O_shared_delete_new(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *sh_mesg, +H5O_shared_delete(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *sh_mesg, const H5O_msg_class_t *type, hbool_t adj_link) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_delete_new) - - /* check args */ - HDassert(f); - HDassert(sh_mesg); - - /* - * Committed datatypes increment the OH of the original message when they - * are written (in H5O_shared_link) and decrement it here. - * SOHMs in the heap behave differently; their refcount is incremented - * during H5SM_share when they are going to be written (in H5O_msg_append - * or H5O_msg_write). Their refcount in the SOHM indexes still needs to - * be decremented when they're deleted (in H5O_shared_link_adj). - */ - - /* Decrement the reference count on the shared object, if requested */ - if(adj_link) - if(H5O_shared_link_adj_new(f, dxpl_id, sh_mesg, type, -1) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count") - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_delete_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_delete - * - * Purpose: Free file space referenced by message - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Friday, September 26, 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static herr_t -H5O_shared_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link) -{ - const H5O_shared_t *shared = (const H5O_shared_t *) _mesg; - herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_delete) /* check args */ HDassert(f); - HDassert(shared); + HDassert(sh_mesg); /* * Committed datatypes increment the OH of the original message when they @@ -805,7 +461,7 @@ H5O_shared_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link) /* Decrement the reference count on the shared object, if requested */ if(adj_link) - if(H5O_shared_link_adj(f, dxpl_id, shared, -1) < 0) + if(H5O_shared_link_adj(f, dxpl_id, sh_mesg, type, -1) < 0) HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count") done: @@ -814,7 +470,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5O_shared_link_new + * Function: H5O_shared_link * * Purpose: Increment reference count on any objects referenced by * message @@ -827,53 +483,19 @@ done: *------------------------------------------------------------------------- */ herr_t -H5O_shared_link_new(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *sh_mesg, +H5O_shared_link(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *sh_mesg, const H5O_msg_class_t *type) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_link_new) - - /* check args */ - HDassert(f); - HDassert(sh_mesg); - - /* Increment the reference count on the shared object */ - if(H5O_shared_link_adj_new(f, dxpl_id, sh_mesg, type, 1) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count") - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_link_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_link - * - * Purpose: Increment reference count on any objects referenced by - * message - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Friday, September 26, 2003 - * - *------------------------------------------------------------------------- - */ -static herr_t -H5O_shared_link(H5F_t *f, hid_t dxpl_id, const void *_mesg) -{ - const H5O_shared_t *shared = (const H5O_shared_t *) _mesg; - herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_link) /* check args */ HDassert(f); - HDassert(shared); + HDassert(sh_mesg); /* Increment the reference count on the shared object */ - if(H5O_shared_link_adj(f, dxpl_id, shared, 1) < 0) + if(H5O_shared_link_adj(f, dxpl_id, sh_mesg, type, 1) < 0) HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "unable to adjust shared object link count") done: @@ -882,55 +504,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5O_shared_pre_copy_file - * - * Purpose: Perform any necessary actions before copying message between - * files for shared messages. - * - * Return: Success: Non-negative - * - * Failure: Negative - * - * Programmer: Peter Cao - * Saturday, February 11, 2006 - * - *------------------------------------------------------------------------- - */ -static herr_t -H5O_shared_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *type, - const void *native_src, hbool_t *deleted, const H5O_copy_t *cpy_info, - void *udata) -{ - const H5O_shared_t *shared_src = (const H5O_shared_t *)native_src; - void *mesg_native = NULL; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_pre_copy_file) - - /* check args */ - HDassert(file_src); - HDassert(type); - - if(type->pre_copy_file) { - /* Go get the actual shared message */ - if(NULL == (mesg_native = H5O_shared_read(file_src, H5AC_dxpl_id, shared_src, type, NULL))) - HGOTO_ERROR(H5E_OHDR, H5E_READERROR, FAIL, "unable to load object header") - - /* Perform "pre copy" operation on messge */ - if((type->pre_copy_file)(file_src, type, mesg_native, deleted, cpy_info, udata) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to perform 'pre copy' operation on message") - } /* end of if */ - -done: - if(mesg_native) - H5O_msg_free_real(type, mesg_native); - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5O_shared_pre_copy_file() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_copy_file_new + * Function: H5O_shared_copy_file * * Purpose: Copies a message from _MESG to _DEST in file * @@ -943,7 +517,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5O_shared_copy_file_new(H5F_t *file_src, H5F_t *file_dst, hid_t dxpl_id, +H5O_shared_copy_file(H5F_t *file_src, H5F_t *file_dst, hid_t dxpl_id, const H5O_msg_class_t *mesg_type, const void *_native_src, void *_native_dst, H5O_copy_t *cpy_info, void UNUSED *udata) { @@ -951,7 +525,7 @@ H5O_shared_copy_file_new(H5F_t *file_src, H5F_t *file_dst, hid_t dxpl_id, H5O_shared_t *shared_dst = (H5O_shared_t *)_native_dst; /* Alias to shared info in native destination message */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_copy_file_new) + FUNC_ENTER_NOAPI_NOINIT(H5O_shared_copy_file) /* check args */ HDassert(file_src); @@ -983,90 +557,6 @@ H5O_shared_copy_file_new(H5F_t *file_src, H5F_t *file_dst, hid_t dxpl_id, done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5O_shared_copy_file_new() */ - - -/*------------------------------------------------------------------------- - * Function: H5O_shared_copy_file - * - * Purpose: Copies a message from _MESG to _DEST in file - * - * Return: Success: Ptr to _DEST - * - * Failure: NULL - * - * Programmer: Quincey Koziol - * November 1, 2005 - * - *------------------------------------------------------------------------- - */ -static void * -H5O_shared_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_type, - void *native_src, H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, - void *udata) -{ - H5O_shared_t *shared_src = (H5O_shared_t *)native_src; - H5O_shared_t *shared_dst = NULL; /* The destination message if - * it is a shared message */ - void *dst_mesg = NULL; /* The destination message if - * it's an unshared message */ - void *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5O_shared_copy_file) - - /* check args */ - HDassert(shared_src); - HDassert(file_dst); - HDassert(cpy_info); - - /* Committed shared messages create a shared message at the destination - * and also copy the committed object that they point to. - * SOHMs actually write a non-shared message at the destination. - */ - if(shared_src->flags & H5O_COMMITTED_FLAG) { - /* Allocate space for the destination message */ - if(NULL == (shared_dst = (H5O_shared_t *)H5MM_malloc(sizeof(H5O_shared_t)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - - /* Reset group entry for new object */ - H5O_loc_reset(&(shared_dst->u.oloc)); - shared_dst->u.oloc.file = file_dst; - - /* Set flags for new shared object */ - shared_dst->flags = shared_src->flags; - - /* Copy the shared object from source to destination */ - if(H5O_copy_header_map(&(shared_src->u.oloc), &(shared_dst->u.oloc), dxpl_id, cpy_info, FALSE) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy object") - - /* Set return value */ - ret_value = shared_dst; - } /* end if */ - else { - HDassert(shared_src->flags & H5O_SHARED_IN_HEAP_FLAG); - - /* Read the shared message to get the original message */ - if(NULL == (dst_mesg = H5O_shared_read(file_src, dxpl_id, shared_src, mesg_type, NULL))) - HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, NULL, "unable to read shared message") - - if(mesg_type->copy_file) { - /* Copy the original, un-shared message and return it */ - ret_value = (mesg_type->copy_file)(file_src, mesg_type, dst_mesg, file_dst, dxpl_id, cpy_info, udata); - H5O_msg_free(mesg_type->id, dst_mesg); - } /* end else */ - else - ret_value = dst_mesg; - } /* end else */ - -done: - if(!ret_value) { - if(shared_dst) - H5O_msg_free(H5O_SHARED_ID, shared_dst); - if(dst_mesg) - H5O_msg_free(mesg_type->id, dst_mesg); - } /* end if */ - - FUNC_LEAVE_NOAPI(ret_value) } /* H5O_shared_copy_file() */ @@ -1080,43 +570,39 @@ done: * Programmer: Robb Matzke * Thursday, April 2, 1998 * - * Modifications: - * *------------------------------------------------------------------------- */ -static herr_t -H5O_shared_debug (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, - FILE *stream, int indent, int fwidth) +herr_t +H5O_shared_debug(const H5O_shared_t *mesg, FILE *stream, int indent, int fwidth) { - const H5O_shared_t *mesg = (const H5O_shared_t *)_mesg; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shared_debug) /* Check args */ - HDassert(f); HDassert(mesg); HDassert(stream); HDassert(indent >= 0); HDassert(fwidth >= 0); - if(mesg->flags & H5O_COMMITTED_FLAG) - { + HDfprintf(stream, "%*s%-*s %x\n", indent, "", fwidth, + "Shared Message Flags:", + mesg->flags); + if(mesg->flags & H5O_COMMITTED_FLAG) { HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Sharing method:", "Obj Hdr"); HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Object address:", mesg->u.oloc.addr); - } - else - { + } /* end if */ + else { + HDassert(mesg->flags & H5O_SHARED_IN_HEAP_FLAG); HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Sharing method:", "SOHM Heap"); HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Heap ID:", mesg->u.heap_id); - } + } /* end else */ FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5O_shared_debug() */ |