summaryrefslogtreecommitdiffstats
path: root/src/H5Olinfo.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-10-02 10:24:03 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-10-02 10:24:03 (GMT)
commita6f6462541cc57364586f770131e2ea074d63492 (patch)
tree0debf502fb7d66f9f470edb935a62223945960d4 /src/H5Olinfo.c
parent9bc29ea538b9ce2013a8cde5be230c18cf052009 (diff)
downloadhdf5-a6f6462541cc57364586f770131e2ea074d63492.zip
hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.gz
hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.bz2
[svn-r12700] Alert:
File format is not stable, don't keep files produced! Description: First stage of checkins modifying the format of groups to support creation order. Implement "dense" storage for links in groups. Try to clarify some of the symbols for the H5L API. Add the H5Pset_latest_format() flag for FAPLs, to choose to use the newest file format options (including "dense" link storage in groups) Add the H5Pset_track_creation_order() flag for GCPLs, to enable creation order tracking in groups (although no index on creation order yet). Remove --enable-group-revision configure flag, as file format issues are now handled in a backwardly/forwardly compatible way. Clean up lots of compiler warnings and other minor formatting issues. Tested on: FreeBSD/32 4.11 (sleipnir) w/threadsafe Linux/32 2.4 (heping) w/FORTRAN & C++ Linux/64 2.4 (mir) w/enable-v1.6 compa Mac OSX/32 10.4.8 (amazon) AIX 5.3 (copper) w/parallel & FORTRAN
Diffstat (limited to 'src/H5Olinfo.c')
-rw-r--r--src/H5Olinfo.c237
1 files changed, 224 insertions, 13 deletions
diff --git a/src/H5Olinfo.c b/src/H5Olinfo.c
index 8017002..57a230f 100644
--- a/src/H5Olinfo.c
+++ b/src/H5Olinfo.c
@@ -25,23 +25,27 @@
*-------------------------------------------------------------------------
*/
+#define H5G_PACKAGE /*suppress error about including H5Gpkg */
#define H5O_PACKAGE /*suppress error about including H5Opkg */
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
+#include "H5Gpkg.h" /* Groups */
#include "H5Opkg.h" /* Object headers */
-#ifdef H5_GROUP_REVISION
/* PRIVATE PROTOTYPES */
static void *H5O_linfo_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p);
static herr_t H5O_linfo_encode(H5F_t *f, uint8_t *p, const void *_mesg);
static void *H5O_linfo_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_linfo_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_linfo_free(void *_mesg);
+static herr_t H5O_linfo_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link);
static void *H5O_linfo_copy_file(H5F_t *file_src, void *native_src,
H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata);
+static herr_t H5O_linfo_post_copy_file(const H5O_loc_t *parent_src_oloc, const void *mesg_src, H5O_loc_t *dst_oloc,
+ void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
static herr_t H5O_linfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
FILE * stream, int indent, int fwidth);
@@ -56,19 +60,28 @@ const H5O_msg_class_t H5O_MSG_LINFO[1] = {{
H5O_linfo_size, /*size of symbol table entry */
NULL, /*default reset method */
H5O_linfo_free, /* free method */
- NULL, /* file delete method */
+ H5O_linfo_delete, /* file delete method */
NULL, /* link method */
NULL, /*get share method */
NULL, /*set share method */
NULL, /* pre copy native value to file */
H5O_linfo_copy_file, /* copy native value to file */
- NULL, /* post copy native value to file */
+ H5O_linfo_post_copy_file, /* post copy native value to file */
H5O_linfo_debug /*debug the message */
}};
/* Current version of link info information */
#define H5O_LINFO_VERSION 1
+/* Data exchange structure to use when copying links from src to dst */
+typedef struct {
+ const H5O_loc_t *src_oloc; /* Source object location */
+ H5O_loc_t *dst_oloc; /* Destination object location */
+ H5O_linfo_t *dst_linfo; /* Destination object's link info message */
+ hid_t dxpl_id; /* DXPL for operation */
+ H5O_copy_t *cpy_info; /* Information for copy operation */
+} H5O_linfo_postcopy_ud_t;
+
/* Declare a free list to manage the hsize_t struct */
H5FL_DEFINE_STATIC(H5O_linfo_t);
@@ -111,9 +124,22 @@ H5O_linfo_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
if (NULL == (linfo = H5FL_MALLOC(H5O_linfo_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
- /* Get the number of links in the group */
+ /* Number of links in the group */
H5F_DECODE_LENGTH(f, p, linfo->nlinks)
+ /* Min. & max creation order value for the group */
+ INT64DECODE(p, linfo->min_corder)
+ INT64DECODE(p, linfo->max_corder)
+
+ /* Address of fractal heap to store "dense" links */
+ H5F_addr_decode(f, &p, &(linfo->link_fheap_addr));
+
+ /* Address of v2 B-tree to index names of links */
+ H5F_addr_decode(f, &p, &(linfo->name_bt2_addr));
+
+ /* Address of v2 B-tree to index creation order of links */
+ H5F_addr_decode(f, &p, &(linfo->corder_bt2_addr));
+
/* Set return value */
ret_value = linfo;
@@ -156,9 +182,22 @@ H5O_linfo_encode(H5F_t *f, uint8_t *p, const void *_mesg)
/* encode */
*p++ = H5O_LINFO_VERSION;
- /* Store the number of links in the group */
+ /* Number of links in the group */
H5F_ENCODE_LENGTH(f, p, linfo->nlinks)
+ /* Min. & max creation order value for the group */
+ INT64ENCODE(p, linfo->min_corder)
+ INT64ENCODE(p, linfo->max_corder)
+
+ /* Address of fractal heap to store "dense" links */
+ H5F_addr_encode(f, &p, linfo->link_fheap_addr);
+
+ /* Address of v2 B-tree to index names of links */
+ H5F_addr_encode(f, &p, linfo->name_bt2_addr);
+
+ /* Address of v2 B-tree to index creation order of links */
+ H5F_addr_encode(f, &p, linfo->corder_bt2_addr);
+
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5O_linfo_encode() */
@@ -199,7 +238,7 @@ H5O_linfo_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
*dest = *linfo;
/* Set return value */
- ret_value=dest;
+ ret_value = dest;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -233,8 +272,13 @@ H5O_linfo_size(const H5F_t *f, const void UNUSED *_mesg)
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_linfo_size)
/* Set return value */
- ret_value = 1 + /* Version */
- H5F_SIZEOF_SIZE(f); /* Number of links */
+ ret_value = 1 /* Version */
+ + H5F_SIZEOF_SIZE(f) /* Number of links */
+ + 8 /* Min. creation order value */
+ + 8 /* Max. creation order value */
+ + H5F_SIZEOF_ADDR(f) /* Address of fractal heap to store "dense" links */
+ + H5F_SIZEOF_ADDR(f) /* Address of v2 B-tree for indexing names of links */
+ + H5F_SIZEOF_ADDR(f); /* Address of v2 B-tree for indexing creation order values of links */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_linfo_size() */
@@ -268,6 +312,40 @@ H5O_linfo_free(void *mesg)
/*-------------------------------------------------------------------------
+ * Function: H5O_linfo_delete
+ *
+ * Purpose: Free file space referenced by message
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Saturday, September 16, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
+{
+ const H5O_linfo_t *linfo = (const H5O_linfo_t *)_mesg;
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_linfo_delete)
+
+ /* check args */
+ HDassert(f);
+ HDassert(linfo);
+
+ /* If the group is using "dense" link storage, delete it */
+ if(H5F_addr_defined(linfo->link_fheap_addr))
+ if(H5G_dense_delete(f, dxpl_id, (H5O_linfo_t *)linfo, adj_link) < 0) /* Casting away const OK - QAK */
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free dense link storage")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_delete() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5O_linfo_copy_file
*
* Purpose: Copies a message from _MESG to _DEST in file
@@ -282,8 +360,8 @@ H5O_linfo_free(void *mesg)
*-------------------------------------------------------------------------
*/
static void *
-H5O_linfo_copy_file(H5F_t UNUSED *file_src, void *native_src, H5F_t UNUSED *file_dst,
- hid_t UNUSED dxpl_id, H5O_copy_t *cpy_info, void UNUSED *udata)
+H5O_linfo_copy_file(H5F_t UNUSED *file_src, void *native_src, H5F_t *file_dst,
+ hid_t dxpl_id, H5O_copy_t *cpy_info, void UNUSED *udata)
{
H5O_linfo_t *linfo_src = (H5O_linfo_t *) native_src;
H5O_linfo_t *linfo_dst = NULL;
@@ -300,11 +378,26 @@ H5O_linfo_copy_file(H5F_t UNUSED *file_src, void *native_src, H5F_t UNUSED *file
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "memory allocation failed")
/* If we are performing a 'shallow hierarchy' copy, and the links in this
- * group won't be included in the destination, reset the link count for
+ * group won't be included in the destination, reset the link info for
* this group.
*/
- if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
+ if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth) {
linfo_dst->nlinks = 0;
+ linfo_dst->min_corder = linfo_dst->max_corder = 0;
+ linfo_dst->link_fheap_addr = HADDR_UNDEF;
+ linfo_dst->name_bt2_addr = HADDR_UNDEF;
+ linfo_dst->corder_bt2_addr = HADDR_UNDEF;
+ } /* end if */
+ else {
+ /* Create the components of the dense link storage for the destination group */
+ /* (XXX: should probably get the "creation" parameters for the source group's
+ * dense link storage components and use those - QAK)
+ */
+ if(H5F_addr_defined(linfo_src->link_fheap_addr)) {
+ if(H5G_dense_create(file_dst, dxpl_id, linfo_dst) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "unable to create 'dense' form of new format group")
+ } /* end if */
+ } /* end else */
/* Set return value */
ret_value = linfo_dst;
@@ -319,6 +412,114 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5O_linfo_post_copy_file_cb
+ *
+ * Purpose: Callback routine for copying links from src to dst file
+ * during "post copy" routine
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * koziol@hdfgroup.org
+ * Sept 26 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_post_copy_file_cb(const H5O_link_t *src_lnk, void *_udata)
+{
+ H5O_linfo_postcopy_ud_t *udata = (H5O_linfo_postcopy_ud_t *)_udata; /* 'User data' passed in */
+ H5O_link_t dst_lnk; /* Destination link to insert */
+ hbool_t dst_lnk_init = FALSE; /* Whether the destination link is initialized */
+ herr_t ret_value = H5B2_ITER_CONT; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_linfo_post_copy_file_cb)
+
+ /* Check arguments */
+ HDassert(src_lnk);
+ HDassert(udata);
+
+ /* Copy the link (and the object it points to) */
+ if(H5G_link_copy_file(udata->dst_oloc->file, udata->dxpl_id, src_lnk,
+ udata->src_oloc, &dst_lnk, udata->cpy_info) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, H5B2_ITER_ERROR, "unable to copy link")
+ dst_lnk_init = TRUE;
+
+ /* Insert the new object in the destination file's group */
+ /* (Doesn't increment the link count - that's already been taken care of for hard links) */
+ if(H5G_dense_insert(udata->dst_oloc->file, udata->dxpl_id, udata->dst_linfo, &dst_lnk) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5B2_ITER_ERROR, "unable to insert destination link")
+
+done:
+ /* Check if the destination link has been initialized */
+ if(dst_lnk_init)
+ H5O_reset(H5O_LINK_ID, &dst_lnk);
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_linfo_post_copy_file_cb() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_linfo_post_copy_file
+ *
+ * Purpose: Finish copying a message from between files
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * September 26, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_linfo_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+ H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info)
+{
+ const H5O_linfo_t *linfo_src = (const H5O_linfo_t *)mesg_src;
+ H5O_linfo_t *linfo_dst = (H5O_linfo_t *)mesg_dst;
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_linfo_post_copy_file)
+
+ /* check args */
+ HDassert(src_oloc && src_oloc->file);
+ HDassert(linfo_src);
+ HDassert(dst_oloc && dst_oloc->file);
+ HDassert(H5F_addr_defined(dst_oloc->addr));
+ HDassert(linfo_dst);
+ HDassert(cpy_info);
+
+ /* If we are performing a 'shallow hierarchy' copy, get out now */
+ if(cpy_info->max_depth >= 0 && cpy_info->curr_depth >= cpy_info->max_depth)
+ HGOTO_DONE(SUCCEED)
+
+ /* Check for copying dense link storage */
+ if(H5F_addr_defined(linfo_src->link_fheap_addr)) {
+ H5O_linfo_postcopy_ud_t udata; /* User data for iteration callback */
+ H5G_link_iterate_t lnk_op; /* Link operator */
+
+ /* Set up dense link iteration user data */
+ udata.src_oloc = src_oloc;
+ udata.dst_oloc = dst_oloc;
+ udata.dst_linfo = linfo_dst;
+ udata.dxpl_id = dxpl_id;
+ udata.cpy_info = cpy_info;
+
+ /* Build iterator operator */
+ lnk_op.lib_op = H5O_linfo_post_copy_file_cb;
+
+ /* Iterate over the links in the group, building a table of the link messages */
+ if(H5G_dense_iterate(src_oloc->file, dxpl_id, H5_ITER_NATIVE, 0, linfo_src, TRUE, 0, NULL, lnk_op, &udata) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over links")
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_linfo_post_copy_file() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5O_linfo_debug
*
* Purpose: Prints debugging info for a message.
@@ -350,8 +551,18 @@ H5O_linfo_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE *
HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
"Number of links:", linfo->nlinks);
+ HDfprintf(stream, "%*s%-*s %Hd\n", indent, "", fwidth,
+ "Min. creation order value:", linfo->min_corder);
+ HDfprintf(stream, "%*s%-*s %Hd\n", indent, "", fwidth,
+ "Max. creation order value:", linfo->max_corder);
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+ "'Dense' link storage fractal heap address:", linfo->link_fheap_addr);
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+ "'Dense' link storage name index v2 B-tree address:", linfo->name_bt2_addr);
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+ "'Dense' link storage creation order index v2 B-tree address:", linfo->corder_bt2_addr);
+
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5O_linfo_debug() */
-#endif /* H5_GROUP_REVISION */