From 461b896779cb585cf47236cdcfc271a98d3ca080 Mon Sep 17 00:00:00 2001 From: Peter Cao Date: Wed, 30 May 2007 16:35:57 -0500 Subject: [svn-r13821] Fixed a bug at copying shared reg_ref attribute. The ref values of an attribute was not writen in file. The post_copy_file() at H5Oattr.c only updates the value in memory. To fix the problem, we added H5O_shared_post_copy_file(), which delete the attribute in file (with the incorrect value) and create an new attribute with the correct values. I added the following functions: H5Oshared.c:H5O_shared_post_copy_file(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *mesg); H5Oshared.h: H5O_SHARED_POST_COPY_FILE and modified the following files to include shared_post_copy_file() H5Oattr.c H5Odtype.c H5Ofill.c H5Opline.c H5Osdspace.c --- src/H5Oattr.c | 5 ++++- src/H5Ocopy.c | 3 +++ src/H5Odtype.c | 2 ++ src/H5Ofill.c | 4 ++++ src/H5Opkg.h | 1 + src/H5Opline.c | 2 ++ src/H5Oprivate.h | 7 ++++--- src/H5Osdspace.c | 2 ++ src/H5Oshared.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/H5Oshared.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 131 insertions(+), 4 deletions(-) diff --git a/src/H5Oattr.c b/src/H5Oattr.c index 9c6daee..29c4abd 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -61,6 +61,8 @@ static herr_t H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, #define H5O_SHARED_LINK_REAL H5O_attr_link #define H5O_SHARED_COPY_FILE H5O_attr_shared_copy_file #define H5O_SHARED_COPY_FILE_REAL H5O_attr_copy_file +#define H5O_SHARED_POST_COPY_FILE H5O_attr_shared_post_copy_file +#define H5O_SHARED_POST_COPY_FILE_REAL H5O_attr_post_copy_file #define H5O_SHARED_DEBUG H5O_attr_shared_debug #define H5O_SHARED_DEBUG_REAL H5O_attr_debug #include "H5Oshared.h" /* Shared Object Header Message Callbacks */ @@ -83,7 +85,7 @@ const H5O_msg_class_t H5O_MSG_ATTR[1] = {{ NULL, /*can share method */ H5O_attr_pre_copy_file, /* pre copy native value to file */ H5O_attr_shared_copy_file, /* copy native value to file */ - H5O_attr_post_copy_file, /* post copy native value to file */ + H5O_attr_shared_post_copy_file, /* post copy native value to file */ H5O_attr_get_crt_index, /* get creation index */ H5O_attr_set_crt_index, /* set creation index */ H5O_attr_shared_debug /* debug the message */ @@ -958,6 +960,7 @@ H5O_attr_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, HDassert(attr_dst); HDassert(file_dst); + /* Only need to fix reference attribute with real data being copied to * another file. */ diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index ebb1303..36d7485 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -699,6 +699,9 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, HDassert(mesg_dst->type == mesg_src->type); HDassert(mesg_dst->native); + /* the object header is needed in the post copy for shared message */ + cpy_info->oh_dst = &oh_dst; + /* Perform "post copy" operation on message */ if((copy_type->post_copy_file)(oloc_src, mesg_src->native, oloc_dst, mesg_dst->native, dxpl_id, cpy_info) < 0) diff --git a/src/H5Odtype.c b/src/H5Odtype.c index 742d00b..2bfaccf 100644 --- a/src/H5Odtype.c +++ b/src/H5Odtype.c @@ -59,6 +59,8 @@ static herr_t H5O_dtype_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, #undef H5O_SHARED_LINK_REAL #define H5O_SHARED_COPY_FILE H5O_dtype_shared_copy_file #define H5O_SHARED_COPY_FILE_REAL H5O_dtype_copy_file +#define H5O_SHARED_POST_COPY_FILE H5O_dtype_shared_post_copy_file +#undef H5O_SHARED_POST_COPY_FILE_REAL #define H5O_SHARED_DEBUG H5O_dtype_shared_debug #define H5O_SHARED_DEBUG_REAL H5O_dtype_debug #include "H5Oshared.h" /* Shared Object Header Message Callbacks */ diff --git a/src/H5Ofill.c b/src/H5Ofill.c index d81b769..93d8ab1 100644 --- a/src/H5Ofill.c +++ b/src/H5Ofill.c @@ -57,6 +57,8 @@ static herr_t H5O_fill_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *s #undef H5O_SHARED_LINK_REAL #define H5O_SHARED_COPY_FILE H5O_fill_shared_copy_file #undef H5O_SHARED_COPY_FILE_REAL +#define H5O_SHARED_POST_COPY_FILE H5O_fill_shared_post_copy_file +#undef H5O_SHARED_POST_COPY_FILE_REAL #define H5O_SHARED_DEBUG H5O_fill_shared_debug #define H5O_SHARED_DEBUG_REAL H5O_fill_debug #include "H5Oshared.h" /* Shared Object Header Message Callbacks */ @@ -86,6 +88,8 @@ static herr_t H5O_fill_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *s #undef H5O_SHARED_COPY_FILE #define H5O_SHARED_COPY_FILE H5O_fill_new_shared_copy_file #undef H5O_SHARED_COPY_FILE_REAL +#define H5O_SHARED_POST_COPY_FILE H5O_fill_new_shared_post_copy_file +#undef H5O_SHARED_POST_COPY_FILE_REAL #undef H5O_SHARED_DEBUG #define H5O_SHARED_DEBUG H5O_fill_new_shared_debug #undef H5O_SHARED_DEBUG_REAL diff --git a/src/H5Opkg.h b/src/H5Opkg.h index 83dc647..fb17c0c 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -498,6 +498,7 @@ H5_DLL herr_t H5O_shared_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5_DLL herr_t H5O_shared_copy_file(H5F_t *file_src, H5F_t *file_dst, const H5O_msg_class_t *mesg_type, const void *_native_src, void *_native_dst, hbool_t *recompute_size, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id); +H5_DLL herr_t H5O_shared_post_copy_file (H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *mesg); H5_DLL herr_t H5O_shared_debug(const H5O_shared_t *mesg, FILE *stream, int indent, int fwidth); diff --git a/src/H5Opline.c b/src/H5Opline.c index 09b52cc..407c1fc 100644 --- a/src/H5Opline.c +++ b/src/H5Opline.c @@ -55,6 +55,8 @@ static herr_t H5O_pline_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, #undef H5O_SHARED_LINK_REAL #define H5O_SHARED_COPY_FILE H5O_pline_shared_copy_file #undef H5O_SHARED_COPY_FILE_REAL +#define H5O_SHARED_POST_COPY_FILE H5O_pline_shared_post_copy_file +#undef H5O_SHARED_POST_COPY_FILE_REAL #define H5O_SHARED_DEBUG H5O_pline_shared_debug #define H5O_SHARED_DEBUG_REAL H5O_pline_debug #include "H5Oshared.h" /* Shared Object Header Message Callbacks */ diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index c4d2a1f..2376113 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -130,9 +130,10 @@ typedef struct H5O_copy_t { hbool_t expand_ref; /* Flag to expand object references */ hbool_t copy_without_attr; /* Flag to not copy attributes */ hbool_t preserve_null; /* Flag to not delete NULL messages */ - int curr_depth; /* Current depth in hierarchy copied */ - int max_depth; /* Maximum depth in hierarchy to copy */ - H5SL_t *map_list; /* Skip list to hold address mappings */ + int curr_depth; /* Current depth in hierarchy copied */ + int max_depth; /* Maximum depth in hierarchy to copy */ + H5SL_t *map_list; /* Skip list to hold address mappings */ + H5O_t *oh_dst; /* The destination object header */ } H5O_copy_t; /* Header message IDs */ diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c index 348f894..bb3e349 100644 --- a/src/H5Osdspace.c +++ b/src/H5Osdspace.c @@ -51,6 +51,8 @@ static herr_t H5O_sdspace_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, #undef H5O_SHARED_LINK_REAL #define H5O_SHARED_COPY_FILE H5O_sdspace_shared_copy_file #undef H5O_SHARED_COPY_FILE_REAL +#define H5O_SHARED_POST_COPY_FILE H5O_sdspace_shared_post_copy_file +#undef H5O_SHARED_POST_COPY_FILE_REAL #define H5O_SHARED_DEBUG H5O_sdspace_shared_debug #define H5O_SHARED_DEBUG_REAL H5O_sdspace_debug #include "H5Oshared.h" /* Shared Object Header Message Callbacks */ diff --git a/src/H5Oshared.c b/src/H5Oshared.c index 44b0992..e78a1d3 100644 --- a/src/H5Oshared.c +++ b/src/H5Oshared.c @@ -578,6 +578,60 @@ done: /*------------------------------------------------------------------------- + * Function: H5O_shared_post_copy_file + * + * Purpose: Delate a shared message and replace with a new one. + * The function is needed at cases such as coping a shared reg_ref attribute. + * When a shared reg_ref attribute is copied from one file to + * another, the values in file need to be replaced. The only way + * to complish that is to delete the old message and write the + * new message with the correct values. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Peter Cao + * xcao@hdfgroup.org + * May 24 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5O_shared_post_copy_file(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *mesg) +{ + H5O_shared_t *old_sh_mesg; + htri_t shared_mesg; /* Whether the message should be shared */ + unsigned msg_type_id; /* Message's type ID */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_shared_post_copy_file) + + /* check args */ + HDassert(f); + HDassert(mesg); + + /* the old shared message */ + old_sh_mesg = (H5O_shared_t *) mesg; + + /* save the type id for later use */ + msg_type_id = old_sh_mesg->msg_type_id; + + /* Remove the old message from the SOHM storage */ + if(H5SM_delete(f, dxpl_id, oh, old_sh_mesg) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to find attribute information for object") + + /* Add the new message */ + if((shared_mesg = H5SM_try_share(f, dxpl_id, oh, msg_type_id, mesg, NULL)) == 0) + HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "message changed sharing status") + else if(shared_mesg < 0) + HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't share message") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_shared_post_copy_file() */ + + + +/*------------------------------------------------------------------------- * Function: H5O_shared_debug * * Purpose: Prints debugging info for the message diff --git a/src/H5Oshared.h b/src/H5Oshared.h index 27d2ac3..539577f 100644 --- a/src/H5Oshared.h +++ b/src/H5Oshared.h @@ -356,6 +356,61 @@ done: /*------------------------------------------------------------------------- + * Function: H5O_SHARED_POST_COPY_FILE + * + * Purpose: Copies a message from _SRC to _DEST in file + * + * Note: The actual name of this routine can be different in each source + * file that this header file is included in, and must be defined + * prior to including this header file. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Peter Cao + * May 25, 2007 + * + *------------------------------------------------------------------------- + */ +static H5_inline herr_t +H5O_SHARED_POST_COPY_FILE(H5O_loc_t *oloc_src, void *mesg_src, H5O_loc_t *oloc_dst, + void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info) +{ + const H5O_shared_t *shared_dst = (const H5O_shared_t *)mesg_dst; /* Alias to shared info in native source */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_SHARED_POST_COPY_FILE) + + HDassert(oloc_src->file); + HDassert(oloc_dst->file); + HDassert(mesg_src); + HDassert(mesg_dst); + +#ifndef H5O_SHARED_TYPE +#error "Need to define H5O_SHARED_TYPE macro!" +#endif /* H5O_SHARED_TYPE */ +#ifndef H5O_SHARED_POST_COPY_FILE +#error "Need to define H5O_SHARED_POST_COPY_FILE macro!" +#endif /* H5O_SHARED_POST_COPY_FILE */ + +#ifdef H5O_SHARED_POST_COPY_FILE_REAL + /* Call native message's copy file callback to copy the message */ + if(H5O_SHARED_POST_COPY_FILE_REAL(oloc_src, mesg_src, oloc_dst, mesg_dst, dxpl_id, cpy_info) <0 ) + HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy native message to another file") +#endif /* H5O_SHARED_POST_COPY_FILE_REAL */ + + /* update only shared message after the post copy */ + if(H5O_msg_is_shared(shared_dst->msg_type_id, mesg_dst)) { + if(H5O_shared_post_copy_file(oloc_dst->file, dxpl_id, cpy_info->oh_dst, mesg_dst) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to fix shared message in post copy") + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_SHARED_POST_COPY_FILE() */ + + +/*------------------------------------------------------------------------- * Function: H5O_SHARED_DEBUG * * Purpose: Prints debugging info for a potentially shared message. -- cgit v0.12