summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-12-04 14:34:10 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-12-04 14:34:10 (GMT)
commit06ba931a9500d52c3170ebda6a805da9b8f95378 (patch)
tree746f71dfc5b314e3c2c848f77af6c30af9b1b363
parent304accfb960d747cc4820ed189de2847e87570ff (diff)
downloadhdf5-06ba931a9500d52c3170ebda6a805da9b8f95378.zip
hdf5-06ba931a9500d52c3170ebda6a805da9b8f95378.tar.gz
hdf5-06ba931a9500d52c3170ebda6a805da9b8f95378.tar.bz2
[svn-r13016] Description:
Finish moving object header message routines into their own source code module, along with renaming them to have "H5O_msg_" prefix... Tested on: Mac OS X/32 10.4.8 (amazon) FreeBSD/32 4.11 (sleipnir) Linux/32 2.4 (heping) AIX/32 5.? (copper)
-rw-r--r--src/H5A.c26
-rw-r--r--src/H5Adeprec.c2
-rw-r--r--src/H5Dio.c2
-rw-r--r--src/H5Doh.c4
-rw-r--r--src/H5G.c8
-rw-r--r--src/H5Gbtree2.c2
-rw-r--r--src/H5Gcompact.c8
-rw-r--r--src/H5Gdense.c14
-rw-r--r--src/H5Gdeprec.c2
-rw-r--r--src/H5Gobj.c16
-rw-r--r--src/H5Goh.c4
-rw-r--r--src/H5Gtest.c28
-rw-r--r--src/H5HFcache.c4
-rw-r--r--src/H5HFhdr.c2
-rw-r--r--src/H5O.c1308
-rw-r--r--src/H5Oattr.c50
-rw-r--r--src/H5Ocopy.c2
-rw-r--r--src/H5Odtype.c10
-rw-r--r--src/H5Ofill.c16
-rw-r--r--src/H5Omessage.c1121
-rw-r--r--src/H5Opkg.h15
-rw-r--r--src/H5Opline.c14
-rw-r--r--src/H5Oprivate.h43
-rw-r--r--src/H5Osdspace.c20
-rw-r--r--src/H5Oshared.c14
-rw-r--r--src/H5S.c60
-rwxr-xr-xsrc/H5SM.c173
-rw-r--r--src/H5T.c6
-rw-r--r--src/H5Tcommit.c2
-rw-r--r--src/H5Toh.c2
-rw-r--r--test/ohdr.c4
31 files changed, 1429 insertions, 1553 deletions
diff --git a/src/H5A.c b/src/H5A.c
index 01ccb95..8eede77 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -302,12 +302,12 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
HDassert(space);
/* Reset shared message information */
- HDmemset(&sh_mesg,0,sizeof(H5O_shared_t));
+ HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
/* Iterate over the existing attributes to check for duplicates */
cb.name = name;
cb.idx = (-1);
- if((ret_value = H5O_iterate(loc->oloc, H5O_ATTR_ID, H5A_find_idx_by_name, &cb, dxpl_id)) < 0)
+ if((ret_value = H5O_msg_iterate(loc->oloc, H5O_ATTR_ID, H5A_find_idx_by_name, &cb, dxpl_id)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error iterating over attributes")
if(ret_value > 0)
HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, FAIL, "attribute already exists")
@@ -372,37 +372,37 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
* datatype and dataspace messages themselves, or the size of the "shared"
* messages if either or both of them are shared.
*/
- if((tri_ret = H5O_is_shared(H5O_DTYPE_ID, attr->dt)) == FALSE)
+ if((tri_ret = H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt)) == FALSE)
{
/* Message wasn't shared after all. Use size of normal datatype
* message. */
- attr->dt_size = H5O_raw_size(H5O_DTYPE_ID, attr->oloc.file, attr->dt);
+ attr->dt_size = H5O_msg_raw_size(attr->oloc.file, H5O_DTYPE_ID, attr->dt);
}
else if(tri_ret > 0)
{
/* Message is shared. Use size of shared message */
- if(H5O_get_share(H5O_DTYPE_ID, attr->oloc.file, attr->dt, &sh_mesg) < 0)
+ if(H5O_msg_get_share(H5O_DTYPE_ID, attr->dt, &sh_mesg) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "couldn't get size of shared message")
- attr->dt_size = H5O_raw_size(H5O_SHARED_ID, attr->oloc.file, &sh_mesg);
+ attr->dt_size = H5O_msg_raw_size(attr->oloc.file, H5O_SHARED_ID, &sh_mesg);
}
else
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "couldn't determine if dataspace is shared")
/* Perform the same test for the dataspace message */
- if((tri_ret = H5O_is_shared(H5O_SDSPACE_ID, attr->ds)) == FALSE)
+ if((tri_ret = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds)) == FALSE)
{
/* Message wasn't shared after all. Use size of normal dataspace
* message. */
- attr->ds_size = H5O_raw_size(H5O_SDSPACE_ID, attr->oloc.file, attr->ds);
+ attr->ds_size = H5O_msg_raw_size(attr->oloc.file, H5O_SDSPACE_ID, attr->ds);
}
else if(tri_ret > 0)
{
/* Message is shared. Use size of shared message */
- if(H5O_get_share(H5O_SDSPACE_ID, attr->oloc.file, attr->ds, &sh_mesg) < 0)
+ if(H5O_msg_get_share(H5O_SDSPACE_ID, attr->ds, &sh_mesg) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "couldn't get size of shared message")
- attr->ds_size = H5O_raw_size(H5O_SHARED_ID, attr->oloc.file, &sh_mesg);
+ attr->ds_size = H5O_msg_raw_size(attr->oloc.file, H5O_SHARED_ID, &sh_mesg);
}
else
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "couldn't determine if datatype is shared")
@@ -512,7 +512,7 @@ H5A_get_index(H5O_loc_t *loc, const char *name, hid_t dxpl_id)
udata.name = name;
udata.idx = (-1);
- if((ret_value = H5O_iterate(loc, H5O_ATTR_ID, H5A_find_idx_by_name, &udata, dxpl_id)) < 0)
+ if((ret_value = H5O_msg_iterate(loc, H5O_ATTR_ID, H5A_find_idx_by_name, &udata, dxpl_id)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error iterating over attributes")
if(ret_value > 0)
ret_value = udata.idx;
@@ -1451,7 +1451,7 @@ H5Aiterate(hid_t loc_id, unsigned *attr_num, H5A_operator_t op, void *op_data)
start_idx = idx = (attr_num ? (int)*attr_num : 0);
if(idx < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified")
- if(idx < H5O_count(loc.oloc, H5O_ATTR_ID, H5AC_dxpl_id)) {
+ if(idx < H5O_msg_count(loc.oloc, H5O_ATTR_ID, H5AC_dxpl_id)) {
while(H5O_msg_read(loc.oloc, H5O_ATTR_ID, idx++, &found_attr, H5AC_dxpl_id) != NULL) {
/*
* Compare found attribute name to new attribute name reject
@@ -1520,7 +1520,7 @@ H5Adelete(hid_t loc_id, const char *name)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "attribute not found")
/* Delete the attribute from the location */
- if((ret_value = H5O_remove(loc.oloc, H5O_ATTR_ID, found, TRUE, H5AC_dxpl_id)) < 0)
+ if((ret_value = H5O_msg_remove(loc.oloc, H5O_ATTR_ID, found, TRUE, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute header message")
done:
diff --git a/src/H5Adeprec.c b/src/H5Adeprec.c
index b2c0b01..22ca0e3 100644
--- a/src/H5Adeprec.c
+++ b/src/H5Adeprec.c
@@ -155,7 +155,7 @@ H5Aget_num_attrs(hid_t loc_id)
} /*lint !e788 All appropriate cases are covered */
/* Look up the # of attributes for the object */
- if((ret_value = H5O_count(loc, H5O_ATTR_ID, H5AC_ind_dxpl_id)) < 0)
+ if((ret_value = H5O_msg_count(loc, H5O_ATTR_ID, H5AC_ind_dxpl_id)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "can't get attribute count for object")
done:
diff --git a/src/H5Dio.c b/src/H5Dio.c
index 269161f..13fcffd 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -898,7 +898,7 @@ H5D_write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
* Update modification time. We have to do this explicitly because
* writing to a dataset doesn't necessarily change the object header.
*/
- if (H5O_touch(&(dataset->oloc), FALSE, dxpl_id) < 0)
+ if(H5O_touch(&(dataset->oloc), FALSE, dxpl_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update modification time")
#endif /* OLD_WAY */
diff --git a/src/H5Doh.c b/src/H5Doh.c
index e25a0ae..5c8797e 100644
--- a/src/H5Doh.c
+++ b/src/H5Doh.c
@@ -177,13 +177,13 @@ H5O_dset_isa(H5O_t *oh)
HDassert(oh);
/* Datatype */
- if((exists = H5O_exists_oh(oh, H5O_DTYPE_ID, 0)) < 0)
+ if((exists = H5O_msg_exists_oh(oh, H5O_DTYPE_ID, 0)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
else if(!exists)
HGOTO_DONE(FALSE)
/* Layout */
- if((exists = H5O_exists_oh(oh, H5O_SDSPACE_ID, 0)) < 0)
+ if((exists = H5O_msg_exists_oh(oh, H5O_SDSPACE_ID, 0)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
else if(!exists)
HGOTO_DONE(FALSE)
diff --git a/src/H5G.c b/src/H5G.c
index 3f1cc08..ae8afee 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -539,7 +539,7 @@ H5Gget_create_plist(hid_t group_id)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object creation info")
/* Check for the group having a group info message */
- if((ginfo_exists = H5O_exists(&(grp->oloc), H5O_GINFO_ID, 0, H5AC_ind_dxpl_id)) < 0)
+ if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, 0, H5AC_ind_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(ginfo_exists) {
H5O_ginfo_t ginfo; /* Group info message */
@@ -554,7 +554,7 @@ H5Gget_create_plist(hid_t group_id)
} /* end if */
/* Check for the group having a link info message */
- if((linfo_exists = H5O_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_ind_dxpl_id)) < 0)
+ if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_ind_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(linfo_exists) {
H5O_linfo_t linfo; /* Link info message */
@@ -1285,8 +1285,8 @@ H5G_open_oid(H5G_t *grp, hid_t dxpl_id)
obj_opened = TRUE;
/* Check if this object has the right message(s) to be treated as a group */
- if((H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, dxpl_id) <= 0)
- && (H5O_exists(&(grp->oloc), H5O_LINFO_ID, 0, dxpl_id) <= 0))
+ if((H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, dxpl_id) <= 0)
+ && (H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, 0, dxpl_id) <= 0))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "not a group")
done:
diff --git a/src/H5Gbtree2.c b/src/H5Gbtree2.c
index 2812513..ed909c3 100644
--- a/src/H5Gbtree2.c
+++ b/src/H5Gbtree2.c
@@ -163,7 +163,7 @@ H5G_dense_fh_name_cmp(const void *obj, size_t UNUSED obj_len, void *_udata)
FUNC_ENTER_NOAPI_NOINIT(H5G_dense_fh_name_cmp)
/* Decode link information */
- if(NULL == (lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
/* Compare the string values */
diff --git a/src/H5Gcompact.c b/src/H5Gcompact.c
index 5229a9a..b33f7d1 100644
--- a/src/H5Gcompact.c
+++ b/src/H5Gcompact.c
@@ -151,7 +151,7 @@ H5G_compact_build_table(const H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t
udata.curr_lnk = 0;
/* Iterate through the link messages, adding them to the table */
- if(H5O_iterate(oloc, H5O_LINK_ID, H5G_compact_build_table_cb, &udata, dxpl_id) < 0)
+ if(H5O_msg_iterate(oloc, H5O_LINK_ID, H5G_compact_build_table_cb, &udata, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over link messages")
/* Sort link table in correct iteration order */
@@ -394,7 +394,7 @@ H5G_compact_remove(const H5O_loc_t *oloc, hid_t dxpl_id, H5RS_str_t *grp_full_pa
udata.name = name;
/* Iterate over the link messages to delete the right one */
- if(H5O_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
+ if(H5O_msg_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link message")
done:
@@ -443,7 +443,7 @@ H5G_compact_remove_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
udata.name = ltable.lnks[n].name;
/* Iterate over the link messages to delete the right one */
- if(H5O_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
+ if(H5O_msg_remove_op(oloc, H5O_LINK_ID, H5O_FIRST, H5G_compact_remove_common_cb, &udata, TRUE, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link message")
done:
@@ -578,7 +578,7 @@ H5G_compact_lookup(H5O_loc_t *oloc, const char *name, H5O_link_t *lnk,
udata.found = FALSE;
/* Iterate through the link messages, adding them to the table */
- if(H5O_iterate(oloc, H5O_LINK_ID, H5G_compact_lookup_cb, &udata, dxpl_id) < 0)
+ if(H5O_msg_iterate(oloc, H5O_LINK_ID, H5G_compact_lookup_cb, &udata, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over link messages")
/* Check if we found the link we were looking for */
diff --git a/src/H5Gdense.c b/src/H5Gdense.c
index 214f5fc..899e833 100644
--- a/src/H5Gdense.c
+++ b/src/H5Gdense.c
@@ -394,7 +394,7 @@ HDfprintf(stderr, "%s: linfo->name_bt2_addr = %a\n", FUNC, linfo->name_bt2_addr)
#endif /* QAK */
/* Find out the size of buffer needed for serialized link */
- if((link_size = H5O_raw_size(H5O_LINK_ID, f, lnk)) == 0)
+ if((link_size = H5O_msg_raw_size(f, H5O_LINK_ID, lnk)) == 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't get link size")
#ifdef QAK
HDfprintf(stderr, "%s: HDstrlen(lnk->name) = %Zu, link_size = %Zu\n", FUNC, HDstrlen(lnk->name), link_size);
@@ -409,7 +409,7 @@ HDfprintf(stderr, "%s: HDstrlen(lnk->name) = %Zu, link_size = %Zu\n", FUNC, HDst
link_ptr = link_buf;
/* Create serialized form of link */
- if(H5O_encode(f, link_ptr, lnk, H5O_LINK_ID) < 0)
+ if(H5O_msg_encode(f, H5O_LINK_ID, link_ptr, lnk) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't encode link")
/* Open the fractal heap */
@@ -577,7 +577,7 @@ H5G_dense_lookup_by_idx_fh_cb(const void *obj, size_t UNUSED obj_len, void *_uda
FUNC_ENTER_NOAPI_NOINIT(H5G_dense_lookup_by_idx_fh_cb)
/* Decode link information & keep a copy */
- if(NULL == (tmp_lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (tmp_lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
/* Copy link information */
@@ -869,7 +869,7 @@ H5G_dense_iterate_fh_cb(const void *obj, size_t UNUSED obj_len, void *_udata)
* HDF5 routine, it could attempt to re-protect that direct block for the
* heap, causing the HDF5 routine called to fail)
*/
- if(NULL == (udata->lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (udata->lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
done:
@@ -1058,7 +1058,7 @@ H5G_dense_get_name_by_idx_fh_cb(const void *obj, size_t UNUSED obj_len, void *_u
FUNC_ENTER_NOAPI_NOINIT(H5G_dense_get_name_by_idx_fh_cb)
/* Decode link information */
- if(NULL == (lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link")
/* Get the length of the name */
@@ -1332,7 +1332,7 @@ H5G_dense_remove_fh_cb(const void *obj, size_t UNUSED obj_len, void *_udata)
FUNC_ENTER_NOAPI_NOINIT(H5G_dense_remove_fh_cb)
/* Decode link information */
- if(NULL == (lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, H5_ITER_ERROR, "can't decode link")
/* Check for removing the link from the creation order index */
@@ -1501,7 +1501,7 @@ H5G_dense_remove_by_idx_fh_cb(const void *obj, size_t UNUSED obj_len, void *_uda
FUNC_ENTER_NOAPI_NOINIT(H5G_dense_remove_by_idx_fh_cb)
/* Decode link information */
- if(NULL == (udata->lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID)))
+ if(NULL == (udata->lnk = H5O_msg_decode(udata->f, udata->dxpl_id, H5O_LINK_ID, obj)))
HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, H5_ITER_ERROR, "can't decode link")
/* Can't operate on link here because the fractal heap block is locked */
diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c
index 4d665ab..6ffc3f4 100644
--- a/src/H5Gdeprec.c
+++ b/src/H5Gdeprec.c
@@ -612,7 +612,7 @@ H5G_set_comment(H5G_loc_t *loc, const char *name, const char *buf, hid_t dxpl_id
loc_valid = TRUE;
/* Remove the previous comment message if any */
- if(H5O_remove(obj_loc.oloc, H5O_NAME_ID, 0, TRUE, dxpl_id) < 0)
+ if(H5O_msg_remove(obj_loc.oloc, H5O_NAME_ID, 0, TRUE, dxpl_id) < 0)
H5E_clear_stack(NULL);
/* Add the new message */
diff --git a/src/H5Gobj.c b/src/H5Gobj.c
index c1d1fd3..bf656e5 100644
--- a/src/H5Gobj.c
+++ b/src/H5Gobj.c
@@ -162,17 +162,17 @@ H5G_obj_create(H5F_t *f, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
size_t link_size; /* Size of a link message */
/* Calculate message size infomation, for creating group's object header */
- linfo_size = H5O_mesg_size(H5O_LINFO_ID, f, linfo, (size_t)0);
+ linfo_size = H5O_msg_mesg_size(f, H5O_LINFO_ID, linfo, (size_t)0);
HDassert(linfo_size);
- ginfo_size = H5O_mesg_size(H5O_GINFO_ID, f, ginfo, (size_t)0);
+ ginfo_size = H5O_msg_mesg_size(f, H5O_GINFO_ID, ginfo, (size_t)0);
HDassert(ginfo_size);
lnk.type = H5L_TYPE_HARD;
lnk.corder = 0;
lnk.corder_valid = ginfo->track_corder;
lnk.name = &null_char;
- link_size = H5O_mesg_size(H5O_LINK_ID, f, &lnk, (size_t)ginfo->est_name_len);
+ link_size = H5O_msg_mesg_size(f, H5O_LINK_ID, &lnk, (size_t)ginfo->est_name_len);
HDassert(link_size);
/* Compute size of header to use for creation */
@@ -434,7 +434,7 @@ H5G_obj_insert(H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
} /* end if */
/* Get the link's message size */
- if((link_msg_size = H5O_raw_size(H5O_LINK_ID, grp_oloc->file, obj_lnk)) == 0)
+ if((link_msg_size = H5O_msg_raw_size(grp_oloc->file, H5O_LINK_ID, obj_lnk)) == 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't get link size")
/* If there's still a small enough number of links, use the 'link' message */
@@ -458,11 +458,11 @@ H5G_obj_insert(H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
udata.linfo = &linfo;
/* Iterate over the 'link' messages, inserting them into the dense link storage */
- if(H5O_iterate(grp_oloc, H5O_LINK_ID, H5G_obj_compact_to_dense_cb, &udata, dxpl_id) < 0)
+ if(H5O_msg_iterate(grp_oloc, H5O_LINK_ID, H5G_obj_compact_to_dense_cb, &udata, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over links")
/* Remove all the 'link' messages */
- if(H5O_remove(grp_oloc, H5O_LINK_ID, H5O_ALL, FALSE, dxpl_id) < 0)
+ if(H5O_msg_remove(grp_oloc, H5O_LINK_ID, H5O_ALL, FALSE, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete link messages")
use_new_dense = TRUE;
@@ -502,7 +502,7 @@ H5G_obj_insert(H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over old format links")
/* Remove the symbol table message from the group */
- if(H5O_remove(grp_oloc, H5O_STAB_ID, 0, FALSE, dxpl_id) < 0)
+ if(H5O_msg_remove(grp_oloc, H5O_STAB_ID, 0, FALSE, dxpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete old format link storage")
/* Recursively call this routine to insert the new link, since the
@@ -899,7 +899,7 @@ H5G_obj_remove_update_linfo(H5O_loc_t *oloc, H5O_linfo_t *linfo, hid_t dxpl_id)
* into an object header message)
*/
for(u = 0; u < linfo->nlinks; u++)
- if(H5O_mesg_size(H5O_LINK_ID, oloc->file, &(ltable.lnks[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) {
+ if(H5O_msg_mesg_size(oloc->file, H5O_LINK_ID, &(ltable.lnks[u]), (size_t)0) >= H5O_MESG_MAX_SIZE) {
can_convert = FALSE;
break;
} /* end if */
diff --git a/src/H5Goh.c b/src/H5Goh.c
index 853dc7c..2b51d0a 100644
--- a/src/H5Goh.c
+++ b/src/H5Goh.c
@@ -99,9 +99,9 @@ H5O_group_isa(struct H5O_t *oh)
HDassert(oh);
/* Check for any of the messages that indicate a group */
- if((stab_exists = H5O_exists_oh(oh, H5O_STAB_ID, 0)) < 0)
+ if((stab_exists = H5O_msg_exists_oh(oh, H5O_STAB_ID, 0)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
- if((linfo_exists = H5O_exists_oh(oh, H5O_LINFO_ID, 0)) < 0)
+ if((linfo_exists = H5O_msg_exists_oh(oh, H5O_LINFO_ID, 0)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
ret_value = (stab_exists > 0 || linfo_exists > 0);
diff --git a/src/H5Gtest.c b/src/H5Gtest.c
index a179ea8..8852adf 100644
--- a/src/H5Gtest.c
+++ b/src/H5Gtest.c
@@ -107,11 +107,11 @@ H5G_is_empty_test(hid_t gid)
/* "New format" checks */
/* Check if the group has any link messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0) {
/* Sanity check that new group format shouldn't have old messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
@@ -120,13 +120,13 @@ H5G_is_empty_test(hid_t gid)
} /* end if */
/* Check for a link info message */
- if((linfo_exists = H5O_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_dxpl_id)) < 0)
+ if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(linfo_exists > 0) {
H5O_linfo_t linfo; /* Link info message */
/* Sanity check that new group format shouldn't have old messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found")
@@ -151,7 +151,7 @@ H5G_is_empty_test(hid_t gid)
/* "Old format" checks */
/* Check if the group has a symbol table message */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0) {
H5O_stab_t stab; /* Info about local heap & B-tree */
@@ -160,7 +160,7 @@ H5G_is_empty_test(hid_t gid)
/* Sanity check that old group format shouldn't have new messages */
if(linfo_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found")
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_GINFO_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and group info messages found")
@@ -216,13 +216,13 @@ H5G_has_links_test(hid_t gid, unsigned *nmsgs)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Check if the group has any link messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists == 0)
HGOTO_DONE(FALSE)
/* Check if the group has a symbol table message */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
@@ -232,7 +232,7 @@ H5G_has_links_test(hid_t gid, unsigned *nmsgs)
int msg_count; /* Number of messages of a type */
/* Check how many link messages there are */
- if((msg_count = H5O_count(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0)
+ if((msg_count = H5O_msg_count(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to count link messages")
*nmsgs = (unsigned)msg_count;
} /* end if */
@@ -274,13 +274,13 @@ H5G_has_stab_test(hid_t gid)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Check if the group has a symbol table message */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists == 0)
HGOTO_DONE(FALSE)
/* Check if the group has any link messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found")
@@ -324,19 +324,19 @@ H5G_is_new_dense_test(hid_t gid)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Check if the group has a symbol table message */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_DONE(FALSE)
/* Check if the group has any link messages */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0)
HGOTO_DONE(FALSE)
/* Check if the group has link info message */
- if((msg_exists = H5O_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_dxpl_id)) < 0)
+ if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, 0, H5AC_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
if(msg_exists > 0) {
H5O_linfo_t linfo; /* Link info message */
diff --git a/src/H5HFcache.c b/src/H5HFcache.c
index e3c07c4..880c36d 100644
--- a/src/H5HFcache.c
+++ b/src/H5HFcache.c
@@ -374,7 +374,7 @@ HDfprintf(stderr, "%s: Load heap header, addr = %a\n", FUNC, addr);
UINT32DECODE(p, hdr->pline_root_direct_filter_mask);
/* Decode I/O filter information */
- if(NULL == (pline = H5O_decode(hdr->f, dxpl_id, p, H5O_PLINE_ID)))
+ if(NULL == (pline = H5O_msg_decode(hdr->f, dxpl_id, H5O_PLINE_ID, p)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode I/O pipeline filters")
p += hdr->filter_len;
@@ -528,7 +528,7 @@ HDfprintf(stderr, "%s: Flushing heap header, addr = %a, destroy = %u\n", FUNC, a
UINT32ENCODE(p, hdr->pline_root_direct_filter_mask);
/* Encode I/O filter information */
- if(H5O_encode(hdr->f, p, &(hdr->pline), H5O_PLINE_ID) < 0)
+ if(H5O_msg_encode(hdr->f, H5O_PLINE_ID, p, &(hdr->pline)) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "can't encode I/O pipeline fiters")
p += hdr->filter_len;
} /* end if */
diff --git a/src/H5HFhdr.c b/src/H5HFhdr.c
index 8bcea64..4b61063 100644
--- a/src/H5HFhdr.c
+++ b/src/H5HFhdr.c
@@ -424,7 +424,7 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
HGOTO_ERROR(H5E_HEAP, H5E_CANTCOPY, HADDR_UNDEF, "can't copy I/O filter pipeline")
/* Compute the I/O filters' encoded size */
- if(0 == (hdr->filter_len = H5O_raw_size(H5O_PLINE_ID, hdr->f, &(hdr->pline))))
+ if(0 == (hdr->filter_len = H5O_msg_raw_size(hdr->f, H5O_PLINE_ID, &(hdr->pline))))
HGOTO_ERROR(H5E_HEAP, H5E_CANTGETSIZE, HADDR_UNDEF, "can't get I/O filter pipeline size")
#ifdef QAK
HDfprintf(stderr, "%s: hdr->filter_len = %u\n", FUNC, hdr->filter_len);
diff --git a/src/H5O.c b/src/H5O.c
index e57f4c0..6b5c853 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -39,10 +39,10 @@
#include "H5FLprivate.h" /* Free lists */
#include "H5Iprivate.h" /* IDs */
#include "H5MFprivate.h" /* File memory management */
-#include "H5MMprivate.h" /* Memory management */
#include "H5Opkg.h" /* Object headers */
#include "H5SMprivate.h" /* Shared object header messages */
+
/****************/
/* Local Macros */
/****************/
@@ -52,38 +52,6 @@
/* Local Typedefs */
/******************/
-/* User data for iteration while removing a message */
-typedef struct {
- H5F_t *f; /* Pointer to file for insertion */
- hid_t dxpl_id; /* DXPL during iteration */
- int sequence; /* Sequence # to search for */
- unsigned nfailed; /* # of failed message removals */
- H5O_operator_t op; /* Callback routine for removal operations */
- void *op_data; /* Callback data for removal operations */
- hbool_t adj_link; /* Whether to adjust links when removing messages */
-} H5O_iter_ud1_t;
-
-/* Typedef for "internal library" iteration operations */
-typedef herr_t (*H5O_lib_operator_t)(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
- unsigned sequence, unsigned *oh_flags_ptr/*out*/, void *operator_data/*in,out*/);
-
-/* Some syntactic sugar to make the compiler happy with two different kinds of iterator callbacks */
-typedef union {
- H5O_operator_t app_op; /* Application callback for each message */
- H5O_lib_operator_t lib_op; /* Library internal callback for each message */
-} H5O_mesg_operator_t;
-
-/*
- * This table contains a list of object types, descriptions, and the
- * functions that determine if some object is a particular type. The table
- * is allocated dynamically.
- */
-typedef struct H5O_typeinfo_t {
- H5G_obj_t type; /*one of the public H5G_* types */
- htri_t (*isa)(H5O_t*); /*function to determine type */
- char *desc; /*description of object type */
-} H5O_typeinfo_t;
-
/********************/
/* Package Typedefs */
@@ -95,17 +63,14 @@ typedef struct H5O_typeinfo_t {
/********************/
static hid_t H5O_open_by_loc(H5G_loc_t *obj_loc, hid_t dxpl_id);
-static H5O_loc_t * H5O_get_oloc(hid_t id);
+static H5O_loc_t * H5O_get_loc(hid_t id);
static herr_t H5O_new(H5F_t *f, hid_t dxpl_id, haddr_t header, size_t chunk_size,
hid_t ocpl_id, H5O_loc_t *loc/*out*/);
-static herr_t H5O_remove_real(const H5O_loc_t *loc, const H5O_msg_class_t *type,
- int sequence, H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
static herr_t H5O_delete_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
-static herr_t H5O_iterate_real(const H5O_loc_t *loc, const H5O_msg_class_t *type,
- H5AC_protect_t prot, hbool_t internal, H5O_mesg_operator_t op, void *op_data, hid_t dxpl_id);
static const H5O_obj_class_t *H5O_obj_class(H5O_loc_t *loc, hid_t dxpl_id);
static herr_t H5O_obj_type_real(H5O_t *oh, H5O_type_t *obj_type);
+
/*********************/
/* Package Variables */
/*********************/
@@ -161,18 +126,19 @@ H5FL_SEQ_DEFINE(H5O_chunk_t);
/* Declare a free list to manage the chunk image information */
H5FL_BLK_DEFINE(chunk_image);
+
/*****************************/
/* Library Private Variables */
/*****************************/
+/* Declare external the free list for time_t's */
+H5FL_EXTERN(time_t);
+
/*******************/
/* Local Variables */
/*******************/
-/* Declare external the free list for time_t's */
-H5FL_EXTERN(time_t);
-
/*-------------------------------------------------------------------------
@@ -391,54 +357,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5Oclose
- *
- * Purpose: Close an open file object.
- *
- * This is the companion to H5Oopen. It is used to close any
- * open object in an HDF5 file (but not IDs are that not file
- * objects, such as property lists and dataspaces). It has
- * the same effect as calling H5Gclose, H5Dclose, or H5Tclose.
- *
- * Return: Success: Non-negative
- * Failure: Negative
- *
- * Programmer: James Laird
- * July 14 2006
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Oclose(hid_t object_id)
-{
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_API(H5Oclose, FAIL)
- H5TRACE1("e","i",object_id);
-
- /* Get the type of the object and close it in the correct way */
- switch(H5I_get_type(object_id))
- {
- case(H5I_GROUP):
- case(H5I_DATATYPE):
- case(H5I_DATASET):
- if(H5I_object(object_id) == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object")
- if(H5I_dec_ref(object_id) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
- break;
-
- default:
- HGOTO_ERROR(H5E_ARGS, H5E_CANTRELEASE, FAIL, "not a valid file object ID (dataset, group, or datatype)")
- break;
- } /* end switch */
-
-done:
- FUNC_LEAVE_API(ret_value)
-} /* end H5Oclose() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5Oincr_refcount
*
* Purpose: Warning! This function is EXTREMELY DANGEROUS!
@@ -468,7 +386,7 @@ H5Oincr_refcount(hid_t object_id)
H5TRACE1("e","i",object_id);
/* Get the object's oloc so we can adjust its link count */
- if((oloc = H5O_get_oloc(object_id)) == NULL)
+ if((oloc = H5O_get_loc(object_id)) == NULL)
HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
if(H5O_link(oloc, 1, H5AC_dxpl_id) < 0)
@@ -509,7 +427,7 @@ H5Odecr_refcount(hid_t object_id)
H5TRACE1("e","i",object_id);
/* Get the object's oloc so we can adjust its link count */
- if((oloc = H5O_get_oloc(object_id)) == NULL)
+ if((oloc = H5O_get_loc(object_id)) == NULL)
HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
if(H5O_link(oloc, -1, H5AC_dxpl_id) < 0)
@@ -631,86 +549,51 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_open_by_loc
- *
- * Purpose: Opens an object and returns an ID given its group loction.
- *
- * Return: Success: Open object identifier
- * Failure: Negative
- *
- * Programmer: James Laird
- * July 25 2006
+ * Function: H5Oclose
*
- *-------------------------------------------------------------------------
- */
-static hid_t
-H5O_open_by_loc(H5G_loc_t *obj_loc, hid_t dxpl_id)
-{
- const H5O_obj_class_t *obj_class; /* Class of object for location */
- hid_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT(H5O_open_by_loc)
-
- HDassert(obj_loc);
-
- /* Get the object class for this location */
- if(NULL == (obj_class = H5O_obj_class(obj_loc->oloc, dxpl_id)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine object class")
-
- /* Call the object class's 'open' routine */
- HDassert(obj_class->open);
- if((ret_value = obj_class->open(obj_loc, dxpl_id)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_open_by_loc() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_get_oloc
+ * Purpose: Close an open file object.
*
- * Purpose: Gets the oloc for an object given its ID.
+ * This is the companion to H5Oopen. It is used to close any
+ * open object in an HDF5 file (but not IDs are that not file
+ * objects, such as property lists and dataspaces). It has
+ * the same effect as calling H5Gclose, H5Dclose, or H5Tclose.
*
- * Return: Success: Pointer to H5O_loc_t
- * Failure: NULL
+ * Return: Success: Non-negative
+ * Failure: Negative
*
* Programmer: James Laird
- * July 25 2006
+ * July 14 2006
*
*-------------------------------------------------------------------------
*/
-static H5O_loc_t *
-H5O_get_oloc(hid_t object_id)
+herr_t
+H5Oclose(hid_t object_id)
{
- H5O_loc_t *ret_value; /* Return value */
+ herr_t ret_value = SUCCEED;
- FUNC_ENTER_NOAPI_NOINIT(H5O_get_oloc)
+ FUNC_ENTER_API(H5Oclose, FAIL)
+ H5TRACE1("e","i",object_id);
+ /* Get the type of the object and close it in the correct way */
switch(H5I_get_type(object_id))
{
case(H5I_GROUP):
- if(NULL == (ret_value = H5O_OBJ_GROUP->get_oloc(object_id)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from group ID")
- break;
-
- case(H5I_DATASET):
- if(NULL == (ret_value = H5O_OBJ_DATASET->get_oloc(object_id)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from dataset ID")
- break;
-
case(H5I_DATATYPE):
- if(NULL == (ret_value = H5O_OBJ_DATATYPE->get_oloc(object_id)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from datatype ID")
+ case(H5I_DATASET):
+ if(H5I_object(object_id) == NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object")
+ if(H5I_dec_ref(object_id) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
break;
default:
- HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, NULL, "invalid object type")
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTRELEASE, FAIL, "not a valid file object ID (dataset, group, or datatype)")
+ break;
} /* end switch */
done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_get_oloc() */
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Oclose() */
/*-------------------------------------------------------------------------
@@ -938,6 +821,43 @@ H5O_open(const H5O_loc_t *loc)
/*-------------------------------------------------------------------------
+ * Function: H5O_open_by_loc
+ *
+ * Purpose: Opens an object and returns an ID given its group loction.
+ *
+ * Return: Success: Open object identifier
+ * Failure: Negative
+ *
+ * Programmer: James Laird
+ * July 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+H5O_open_by_loc(H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+ const H5O_obj_class_t *obj_class; /* Class of object for location */
+ hid_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_open_by_loc)
+
+ HDassert(obj_loc);
+
+ /* Get the object class for this location */
+ if(NULL == (obj_class = H5O_obj_class(obj_loc->oloc, dxpl_id)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine object class")
+
+ /* Call the object class's 'open' routine */
+ HDassert(obj_class->open);
+ if((ret_value = obj_class->open(obj_loc, dxpl_id)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_open_by_loc() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5O_close
*
* Purpose: Closes an object header that was previously open.
@@ -1077,7 +997,7 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id)
ret_value = oh->nlink;
done:
- if (oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, oh_flags) < 0)
+ if(oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, oh_flags) < 0)
HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
FUNC_LEAVE_NOAPI(ret_value)
@@ -1085,155 +1005,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_count
- *
- * Purpose: Counts the number of messages in an object header which are a
- * certain type.
- *
- * Return: Success: Number of messages of specified type.
- *
- * Failure: Negative
- *
- * Programmer: Robb Matzke
- * Tuesday, April 21, 1998
- *
- *-------------------------------------------------------------------------
- */
-int
-H5O_count(H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
-{
- H5O_t *oh = NULL; /* Object header to operate on */
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- int acc; /* Count of the message type found */
- unsigned u; /* Local index variable */
- int ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_count, FAIL)
-
- /* Check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(H5F_addr_defined(loc->addr));
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* Load the object header */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
-
- /* Loop over all messages, counting the ones of the type looked for */
- for(u = acc = 0; u < oh->nmesgs; u++)
- if(oh->mesg[u].type == type)
- acc++;
-
- /* Set return value */
- ret_value = acc;
-
-done:
- if(oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_count() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_exists
- *
- * Purpose: Determines if a particular message exists in an object
- * header without trying to decode the message.
- *
- * Return: Success: FALSE if the message does not exist; TRUE if
- * th message exists.
- *
- * Failure: FAIL if the existence of the message could
- * not be determined due to some error such as
- * not being able to read the object header.
- *
- * Programmer: Robb Matzke
- * Monday, November 2, 1998
- *
- *-------------------------------------------------------------------------
- */
-htri_t
-H5O_exists(H5O_loc_t *loc, unsigned type_id, int sequence, hid_t dxpl_id)
-{
- H5O_t *oh = NULL; /* Object header for location */
- htri_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_exists, FAIL)
-
- HDassert(loc);
- HDassert(loc->file);
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- HDassert(sequence >= 0);
-
- /* Load the object header */
- if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
-
- /* Call the "real" exists routine */
- if((ret_value = H5O_exists_oh(oh, type_id, sequence)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_READERROR, FAIL, "unable to verify object header message")
-
-done:
- if(oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) != SUCCEED)
- HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_exists() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_exists_oh
- *
- * Purpose: Determines if a particular message exists in an object
- * header without trying to decode the message.
- *
- * Return: Success: FALSE if the message does not exist; TRUE if
- * th message exists.
- *
- * Failure: FAIL if the existence of the message could
- * not be determined due to some error such as
- * not being able to read the object header.
- *
- * Programmer: Robb Matzke
- * Monday, November 2, 1998
- *
- *-------------------------------------------------------------------------
- */
-htri_t
-H5O_exists_oh(H5O_t *oh, unsigned type_id, int sequence)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- unsigned u; /* Local index variable */
- htri_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_exists_oh)
-
- HDassert(oh);
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(sequence >= 0);
-
- /* Scan through the messages looking for the right one */
- for(u = 0; u < oh->nmesgs; u++) {
- if(type->id != oh->mesg[u].type->id)
- continue;
- if(--sequence < 0)
- break;
- } /* end for */
-
- /* Set return value */
- ret_value = (sequence < 0);
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_exists_oh() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5O_protect
*
* Purpose: Wrapper around H5AC_protect for use during a H5O_protect->
@@ -1547,503 +1318,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_remove
- *
- * Purpose: Removes the specified message from the object header.
- * If sequence is H5O_ALL (-1) then all messages of the
- * specified type are removed. Removing a message causes
- * the sequence numbers to change for subsequent messages of
- * the same type.
- *
- * No attempt is made to join adjacent free areas of the
- * object header into a single larger free area.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Aug 28 1997
- *
- * Modifications:
- *
- * Robb Matzke, 7 Jan 1998
- * Does not remove constant messages.
- *
- * Changed to use IDs for types, instead of type objects, then
- * call "real" routine.
- * Quincey Koziol
- * Feb 14 2003
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_remove(H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj_link, hid_t dxpl_id)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_remove, FAIL)
-
- /* check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(H5F_addr_defined(loc->addr));
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* Call the "real" remove routine */
- if((ret_value = H5O_remove_real(loc, type, sequence, NULL, NULL, adj_link, dxpl_id)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_remove() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_remove_op
- *
- * Purpose: Removes messages from the object header that a callback
- * routine indicates should be removed.
- *
- * No attempt is made to join adjacent free areas of the
- * object header into a single larger free area.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Sep 6 2005
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
- H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_remove_op, FAIL)
-
- /* check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(H5F_addr_defined(loc->addr));
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* Call the "real" remove routine */
- if((ret_value = H5O_remove_real(loc, type, sequence, op, op_data, adj_link, dxpl_id)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_remove_op() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_remove_cb
- *
- * Purpose: Object header iterator callback routine to remove messages
- * of a particular type that match a particular sequence number,
- * or all messages if the sequence number is H5O_ALL (-1).
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Sep 6 2005
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5O_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
- unsigned sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/)
-{
- H5O_iter_ud1_t *udata = (H5O_iter_ud1_t *)_udata; /* Operator user data */
- htri_t try_remove = FALSE; /* Whether to try removing a message */
- herr_t ret_value = H5_ITER_CONT; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT(H5O_remove_cb)
-
- /* check args */
- HDassert(mesg);
-
- /* Check for callback routine */
- if(udata->op) {
- /* Call the iterator callback */
- if((try_remove = (udata->op)(mesg->native, sequence, udata->op_data)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "object header message deletion callback failed")
- } /* end if */
- else {
- /* If there's no callback routine, does the sequence # match? */
- if((int)sequence == udata->sequence || H5O_ALL == udata->sequence)
- try_remove = H5_ITER_STOP;
- } /* end else */
-
- /* Try removing the message, if indicated */
- if(try_remove) {
- /*
- * Keep track of how many times we failed trying to remove constant
- * messages.
- */
- if(mesg->flags & H5O_MSG_FLAG_CONSTANT)
- udata->nfailed++;
- else {
- /* Convert message into a null message */
- if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, TRUE, udata->adj_link) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to convert into null message")
-
- /* Indicate that the object header was modified */
- *oh_flags_ptr |= H5AC__DIRTIED_FLAG;
- } /* end else */
-
- /* Break out now, if we've found the correct message */
- if(udata->sequence == H5O_FIRST || udata->sequence != H5O_ALL)
- HGOTO_DONE(H5_ITER_STOP)
- } /* end if */
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_remove_cb() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_remove_real
- *
- * Purpose: Removes the specified message from the object header.
- * If sequence is H5O_ALL (-1) then all messages of the
- * specified type are removed. Removing a message causes
- * the sequence numbers to change for subsequent messages of
- * the same type.
- *
- * No attempt is made to join adjacent free areas of the
- * object header into a single larger free area.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Aug 28 1997
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5O_remove_real(const H5O_loc_t *loc, const H5O_msg_class_t *type, int sequence,
- H5O_operator_t app_op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
-{
- H5O_iter_ud1_t udata; /* User data for iterator */
- H5O_mesg_operator_t op; /* Wrapper for operator */
- herr_t ret_value=SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT(H5O_remove_real)
-
- /* check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(type);
-
- /* Make certain we are allowed to modify the file */
- if(0 == (H5F_INTENT(loc->file) & H5F_ACC_RDWR))
- HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
-
- /* Set up iterator operator data */
- udata.f = loc->file;
- udata.dxpl_id = dxpl_id;
- udata.sequence = sequence;
- udata.nfailed = 0;
- udata.op = app_op;
- udata.op_data = op_data;
- udata.adj_link = adj_link;
-
- /* Iterate over the messages, deleting appropriate one(s) */
- op.lib_op = H5O_remove_cb;
- if(H5O_iterate_real(loc, type, H5AC_WRITE, TRUE, op, &udata, dxpl_id) < 0)
- HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over messages")
-
- /* Fail if we tried to remove any constant messages */
- if(udata.nfailed)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to remove constant message(s)")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_remove_real() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_raw_size
- *
- * Purpose: Call the 'raw_size' method for a
- * particular class of object header.
- *
- * Return: Size of message on success, 0 on failure
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Feb 13 2003
- *
- *-------------------------------------------------------------------------
- */
-size_t
-H5O_raw_size(unsigned type_id, const H5F_t *f, const void *mesg)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- size_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_raw_size, 0)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(type->raw_size);
- HDassert(f);
- HDassert(mesg);
-
- /* Compute the raw data size for the mesg */
- if((ret_value = (type->raw_size)(f, mesg)) == 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_raw_size() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_mesg_size
- *
- * Purpose: Calculate the final size of an encoded message in an object
- * header.
- *
- * Note: This routine assumes that the message size will be used in the
- * creation of a new object header.
- *
- * Return: Size of message on success, 0 on failure
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Sep 6 2005
- *
- *-------------------------------------------------------------------------
- */
-size_t
-H5O_mesg_size(unsigned type_id, const H5F_t *f, const void *mesg, size_t extra_raw)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- size_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_mesg_size, 0)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(type->raw_size);
- HDassert(f);
- HDassert(mesg);
-
- /* Compute the raw data size for the mesg */
- if((ret_value = (type->raw_size)(f, mesg)) == 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
-
- /* Add in "extra" raw space */
- ret_value += extra_raw;
-
- /* Adjust size for alignment, if necessary */
- ret_value = H5O_ALIGN_F(f, ret_value);
-
- /* Add space for message header */
- ret_value += H5O_SIZEOF_MSGHDR_F(f);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_mesg_size() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_get_share
- *
- * Purpose: Call the 'get_share' method for a
- * particular class of object header.
- *
- * Return: Success: Non-negative, and SHARE describes the shared
- * object.
- *
- * Failure: Negative
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Oct 2 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_get_share(unsigned type_id, H5F_t *f, const void *mesg, H5O_shared_t *share)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_get_share,FAIL)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(type->get_share);
- HDassert(f);
- HDassert(mesg);
- HDassert(share);
-
- /* Get shared data for the mesg */
- if((ret_value = (type->get_share)(f, mesg, share)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve shared message information")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_get_share() */
-
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_is_shared
- *
- * Purpose: Call the 'is_shared' method for a
- * particular class of object header.
- *
- * Return: Object is shared: TRUE
- * Object is not shared: FALSE
- *
- * Programmer: James Laird
- * jlaird@ncsa.uiuc.edu
- * April 5 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-htri_t
-H5O_is_shared(unsigned type_id, const void *mesg)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- htri_t ret_value;
-
- FUNC_ENTER_NOAPI_NOFUNC(H5O_is_shared)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(mesg);
-
- HDassert(type_id != H5O_SHARED_ID); /* JAMES: check for this mistake elsewhere, too */
-
- /* If there is no is_shared function, then obviously it's not a shared message! */
- if( !(type->is_shared))
- ret_value = FALSE;
- else
- ret_value = (type->is_shared)(mesg);
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_is_shared() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_set_share
- *
- * Purpose: Set the shared information for an object header message.
- *
- * Return: Success: Non-negative
- * Failure: Negative
- *
- * Programmer: James Laird
- * jlaird@hdfgroup.org
- * November 1 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_set_share(H5F_t *f, H5O_shared_t *share, unsigned type_id, void *mesg)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_set_share,FAIL)
-
- /* Check args */
- HDassert(f);
- HDassert(share);
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(type->set_share);
- HDassert(mesg);
- HDassert(share->flags != H5O_NOT_SHARED);
-
- /* Set this message as the shared message for the message, wiping out
- * any information that was there before
- */
- if((ret_value = (type->set_share)(f, mesg, share)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to set shared message information")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_set_share() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_reset_share
- *
- * Purpose: Reset the shared information for an object header message.
- *
- * Return: Success: Non-negative
- * Failure: Negative
- *
- * Programmer: James Laird
- * jlaird@hdfgroup.org
- * Oct 17 2006
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_reset_share(H5F_t *f, unsigned type_id, void *mesg)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- H5O_shared_t sh_mesg; /* Shared message */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_reset_share,FAIL)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
- HDassert(type->set_share);
- HDassert(mesg);
-
- /* Initialize the shared message to zero. */
- HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
-
- /* Set this message as the shared message for the message, wiping out
- * any information that was there before
- */
- if((ret_value = (type->set_share)(f, mesg, &sh_mesg)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to reset shared message information")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_reset_share() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5O_delete
*
* Purpose: Delete an object header from a file. This frees the file
@@ -2136,347 +1410,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_delete_mesg
- *
- * Purpose: Internal function to:
- * Delete an object header message from a file. This frees the file
- * space used for anything referred to in the object header message.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * September 26 2003
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_delete_mesg(H5F_t *f, hid_t dxpl_id, H5O_mesg_t *mesg, hbool_t adj_link)
-{
- const H5O_msg_class_t *type; /* Type of object to free */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_delete_mesg, FAIL)
-
- /* Check args */
- HDassert(f);
- HDassert(mesg);
-
- /* Get the message to free's type */
- if(mesg->flags & H5O_MSG_FLAG_SHARED)
- type = H5O_MSG_SHARED;
- else
- type = mesg->type;
-
- /* Check if there is a file space deletion callback for this type of message */
- if(type->del) {
- /* Decode the message if necessary. */
- if(NULL == mesg->native) {
- HDassert(type->decode);
- if(NULL == (mesg->native = (type->decode)(f, dxpl_id, mesg->raw)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "unable to decode message")
- } /* end if */
-
- /* Check if this message needs to be removed from the SOHM table */
- /* JAMES: there should be a callback, maybe in H5O_shared_delete, to fiddle w/ the ref. count.
- * We shouldn't need to do a search in the SOHM table on delete. */
- if(type == H5O_MSG_SHARED)
- {
- /* The native message here is actually a shared message. */
- if(H5SM_try_delete(f, dxpl_id, mesg->type->id, mesg->native) < 0)
- HGOTO_ERROR (H5E_OHDR, H5E_CANTFREE, FAIL, "unable to delete message from SOHM table")
- }
-
- if((type->del)(f, dxpl_id, mesg->native, adj_link) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
- } /* end if */
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_delete_msg() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_encode
- *
- * Purpose: Encode an object(data type and simple data space only)
- * description into a buffer.
- *
- * Return: Success: Non-negative
- *
- * Failure: Negative
- *
- * Programmer: Raymond Lu
- * slu@ncsa.uiuc.edu
- * July 13, 2004
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_encode(H5F_t *f, unsigned char *buf, const void *obj, unsigned type_id)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_encode,FAIL)
-
- /* check args */
- HDassert(f);
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* Encode */
- if((type->encode)(f, buf, obj) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode message")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_encode() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_decode
- *
- * Purpose: Decode a binary object description and return a new
- * object handle.
- *
- * Note: This routine is not guaranteed to work with all possible
- * header messages, use with care.
- *
- * Return: Success: Pointer to object(data type or space)
- *
- * Failure: NULL
- *
- * Programmer: Raymond Lu
- * slu@ncsa.uiuc.edu
- * July 14, 2004
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5O_decode(H5F_t *f, hid_t dxpl_id, const unsigned char *buf, unsigned type_id)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- void *ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_decode, NULL)
-
- /* check args */
- HDassert(f);
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* decode */
- if((ret_value = (type->decode)(f, dxpl_id, buf)) == NULL)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode message")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_decode() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_iterate
- *
- * Purpose: Iterate through object headers of a certain type.
- *
- * Return: Returns a negative value if something is wrong, the return
- * value of the last operator if it was non-zero, or zero if all
- * object headers were processed.
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Nov 19 2004
- *
- * Description:
- * This function interates over the object headers of an object
- * specified with 'ent' of type 'type_id'. For each object header of the
- * object, the 'op_data' and some additional information (specified below) are
- * passed to the 'op' function.
- * The operation receives a pointer to the object header message for the
- * object being iterated over ('mesg'), and the pointer to the operator data
- * passed in to H5O_iterate ('op_data'). The return values from an operator
- * are:
- * A. Zero causes the iterator to continue, returning zero when all
- * object headers of that type have been processed.
- * B. Positive causes the iterator to immediately return that positive
- * value, indicating short-circuit success.
- * C. Negative causes the iterator to immediately return that value,
- * indicating failure.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5O_iterate(const H5O_loc_t *loc, unsigned type_id, H5O_operator_t app_op,
- void *op_data, hid_t dxpl_id)
-{
- const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
- H5O_mesg_operator_t op; /* Wrapper for operator */
- herr_t ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI(H5O_iterate, FAIL)
-
- /* check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(H5F_addr_defined(loc->addr));
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
- HDassert(type);
-
- /* Call the "real" iterate routine */
- op.app_op = app_op;
- if((ret_value = H5O_iterate_real(loc, type, H5AC_READ, FALSE, op, op_data, dxpl_id)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "unable to iterate over object header messages")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_iterate() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5O_iterate_real
- *
- * Purpose: Iterate through object headers of a certain type.
- *
- * Return: Returns a negative value if something is wrong, the return
- * value of the last operator if it was non-zero, or zero if all
- * object headers were processed.
- *
- * Programmer: Quincey Koziol
- * koziol@ncsa.uiuc.edu
- * Sep 6 2005
- *
- * Description:
- * This function interates over the object headers of an object
- * specified with 'ent' of type 'type_id'. For each object header of the
- * object, the 'op_data' and some additional information (specified below) are
- * passed to the 'op' function.
- * The operation receives a pointer to the object header message for the
- * object being iterated over ('mesg'), and the pointer to the operator data
- * passed in to H5O_iterate ('op_data'). The return values from an operator
- * are:
- * A. Zero causes the iterator to continue, returning zero when all
- * object headers of that type have been processed.
- * B. Positive causes the iterator to immediately return that positive
- * value, indicating short-circuit success.
- * C. Negative causes the iterator to immediately return that value,
- * indicating failure.
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5O_iterate_real(const H5O_loc_t *loc, const H5O_msg_class_t *type, H5AC_protect_t prot,
- hbool_t internal, H5O_mesg_operator_t op, void *op_data, hid_t dxpl_id)
-{
- H5O_t *oh = NULL; /* Pointer to actual object header */
- unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Start iteration with no flags set on object header */
- unsigned idx; /* Absolute index of current message in all messages */
- unsigned sequence; /* Relative index of current message for messages of type */
- H5O_mesg_t *idx_msg; /* Pointer to current message */
- void *native_mesg; /* Native, readable message */
- hbool_t native_mesg_alloc = FALSE; /* True if native_mesg needs to be freed */
-
- herr_t ret_value = H5_ITER_CONT; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT(H5O_iterate_real)
-
- /* check args */
- HDassert(loc);
- HDassert(loc->file);
- HDassert(H5F_addr_defined(loc->addr));
- HDassert(type);
- HDassert(op.app_op);
-
- /* Protect the object header to iterate over */
- if (NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, prot)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
-
- /* Iterate over messages */
- for(sequence = 0, idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs && !ret_value; idx++, idx_msg++) {
- if(type->id == idx_msg->type->id) {
-
- /*
- * Decode the message if necessary.
- */
- H5O_LOAD_NATIVE(loc->file, dxpl_id, idx_msg, FAIL)
-
- /* Check for making an "internal" (i.e. within the H5O package) callback */
- if(internal) {
- /* Call the "internal" iterator callback */
- if((ret_value = (op.lib_op)(oh, idx_msg, sequence, &oh_flags, op_data)) != 0)
- break;
- } /* end if */
- else {
- /* If the message is shared, get the real message it points to */
- /* JAMES: test */
- if(idx_msg->flags & H5O_MSG_FLAG_SHARED) {
- if(NULL == (native_mesg = H5O_shared_read(loc->file, dxpl_id,
- idx_msg->native, idx_msg->type, NULL)))
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unable to read shared message");
- native_mesg_alloc = TRUE;
- }
- else {
- native_mesg = idx_msg->native;
- }
-
- /* Call the iterator callback */
- if((ret_value = (op.app_op)(native_mesg, sequence, op_data)) != 0)
- break;
-
- /* Free the "real" message if it was allocated */
- if(native_mesg_alloc) {
- H5O_msg_free(idx_msg->type->id, native_mesg);
- native_mesg_alloc = FALSE;
- }
- } /* end else */
-
- /* Check for error from iterator */
- if(ret_value < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "iterator function failed")
-
- /* Increment sequence value for message type */
- sequence++;
- } /* end if */
- } /* end for */
-
-done:
- /* Free the native message if it was allocated */
- if(native_mesg_alloc) {
- H5O_msg_free(idx_msg->type->id, native_mesg);
- native_mesg_alloc = FALSE;
- }
-
- if(oh) {
- /* Check if object header was modified */
- if(oh_flags & H5AC__DIRTIED_FLAG) {
- /* Shouldn't be able to modify object header if we don't have write access */
- HDassert(prot == H5AC_WRITE);
-
- /* Try to condense object header info */
- /* (Since this routine is invoked when a message is removed from
- * an object header, the header will be condensed after each
- * message removal)
- */
- if(H5O_condense_header(loc->file, oh, dxpl_id) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't pack object header")
-
- H5O_touch_oh(loc->file, dxpl_id, oh, FALSE, &oh_flags);
- } /* end if */
-
- if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, oh_flags) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
- } /* end if */
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_iterate_real() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5O_obj_type
*
* Purpose: Retrieves the type of object pointed to by `loc'.
@@ -2631,6 +1564,52 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5O_get_loc
+ *
+ * Purpose: Gets the object location for an object given its ID.
+ *
+ * Return: Success: Pointer to H5O_loc_t
+ * Failure: NULL
+ *
+ * Programmer: James Laird
+ * July 25 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5O_loc_t *
+H5O_get_loc(hid_t object_id)
+{
+ H5O_loc_t *ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_get_loc)
+
+ switch(H5I_get_type(object_id))
+ {
+ case(H5I_GROUP):
+ if(NULL == (ret_value = H5O_OBJ_GROUP->get_oloc(object_id)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from group ID")
+ break;
+
+ case(H5I_DATASET):
+ if(NULL == (ret_value = H5O_OBJ_DATASET->get_oloc(object_id)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from dataset ID")
+ break;
+
+ case(H5I_DATATYPE):
+ if(NULL == (ret_value = H5O_OBJ_DATATYPE->get_oloc(object_id)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from datatype ID")
+ break;
+
+ default:
+ HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, NULL, "invalid object type")
+ } /* end switch */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_get_loc() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5O_loc_reset
*
* Purpose: Reset a object location to an empty state
@@ -2770,15 +1749,14 @@ H5O_loc_free(H5O_loc_t *loc)
HDassert(loc);
/* If this location is holding its file open try to close the file. */
- if(loc->holding_file)
- {
+ if(loc->holding_file) {
loc->file->nopen_objs--;
loc->holding_file = FALSE;
if(loc->file->nopen_objs <= 0) {
- if(H5F_try_close(loc->file) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
- }
- }
+ if(H5F_try_close(loc->file) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
+ } /* end if */
+ } /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -2786,46 +1764,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_copy_mesg_file
- *
- * Purpose: Copies a message to file. If MESG is is the null pointer then a null
- * pointer is returned with no error.
- *
- * Return: Success: Ptr to the new message
- *
- * Failure: NULL
- *
- * Programmer: Peter Cao
- * June 4, 2005
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5O_copy_mesg_file(const H5O_msg_class_t *copy_type, const H5O_msg_class_t *mesg_type, H5F_t *file_src, void *native_src,
- H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata)
-{
- void *ret_value;
-
- FUNC_ENTER_NOAPI_NOINIT(H5O_copy_mesg_file)
-
- /* check args */
- HDassert(copy_type);
- HDassert(mesg_type);
- HDassert(copy_type->copy_file);
- HDassert(file_src);
- HDassert(native_src);
- HDassert(file_dst);
- HDassert(cpy_info);
-
- if(NULL == (ret_value = (copy_type->copy_file)(file_src, mesg_type, native_src, file_dst, dxpl_id, cpy_info, udata)))
- HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy object header message to file")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_copy_mesg_file() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5O_get_info
*
* Purpose: Retrieve the information for an object
@@ -3006,5 +1944,5 @@ done:
HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_get_info() */
+} /* end H5O_get_create_plist() */
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 05fb4b9..fa104a9 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -43,10 +43,8 @@ static herr_t H5O_attr_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *typ
static void *H5O_attr_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_attr_get_share(H5F_t *f, const void *_mesg,
- H5O_shared_t *sh);
-static herr_t H5O_attr_set_share(H5F_t *f, void *_mesg,
- const H5O_shared_t *sh);
+static herr_t H5O_attr_get_share(const void *_mesg, H5O_shared_t *sh);
+static herr_t H5O_attr_set_share(void *_mesg, const H5O_shared_t *sh);
static htri_t H5O_attr_is_shared(const void *_mesg);
static herr_t H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
FILE * stream, int indent, int fwidth);
@@ -306,7 +304,7 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg)
{
const H5A_t *attr = (const H5A_t *) mesg;
size_t name_len; /* Attribute name length */
- htri_t is_shared_ret; /* Return value from H5O_is_shared */
+ htri_t is_shared_ret; /* Return value from H5O_msg_is_shared */
unsigned version; /* Attribute version */
hbool_t type_shared; /* Flag to indicate that a shared datatype is used for this attribute */
hbool_t space_shared; /* Flag to indicate that a shared dataspace is used for this attribute */
@@ -326,14 +324,14 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg)
use_latest_format = H5F_USE_LATEST_FORMAT(f);
/* Check whether datatype and dataspace are shared */
- if((is_shared_ret = H5O_is_shared(H5O_DTYPE_ID, attr->dt)) < 0)
+ if((is_shared_ret = H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if datatype is shared")
else if(is_shared_ret)
type_shared = TRUE;
else
type_shared = FALSE;
- if((is_shared_ret = H5O_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0)
+ if((is_shared_ret = H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "can't determine if dataspace is shared")
else if(is_shared_ret)
space_shared = TRUE;
@@ -399,7 +397,7 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg)
HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
/* Get shared message information from datatype */
- if((H5O_MSG_DTYPE->get_share)(f, attr->dt, &sh_mesg/*out*/) < 0)
+ if((H5O_MSG_DTYPE->get_share)(attr->dt, &sh_mesg/*out*/) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode shared attribute datatype")
/* Encode shared message information for datatype */
@@ -425,7 +423,7 @@ H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg)
HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
/* Get shared message information from dataspace */
- if((H5O_MSG_SDSPACE->get_share)(f, attr->ds, &sh_mesg/*out*/) < 0)
+ if((H5O_MSG_SDSPACE->get_share)(attr->ds, &sh_mesg/*out*/) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't encode shared attribute dataspace")
/* Encode shared message information for dataspace */
@@ -531,12 +529,12 @@ H5O_attr_size(const H5F_t *f, const void *_mesg)
use_latest_format = H5F_USE_LATEST_FORMAT(f);
/* Check whether datatype and dataspace are shared */
- if(H5O_is_shared(H5O_DTYPE_ID, attr->dt) > 0)
+ if(H5O_msg_is_shared(H5O_DTYPE_ID, attr->dt) > 0)
type_shared = TRUE;
else
type_shared = FALSE;
- if(H5O_is_shared(H5O_SDSPACE_ID, attr->ds) > 0)
+ if(H5O_msg_is_shared(H5O_SDSPACE_ID, attr->ds) > 0)
space_shared = TRUE;
else
space_shared = FALSE;
@@ -671,21 +669,21 @@ H5O_attr_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
/* Remove both the datatype and dataspace from the SOHM heap if they're
* shared there.
*/
- if((tri_ret = H5O_is_shared(H5O_DTYPE_ID, attr->dt)) < 0)
+ 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_get_share(H5O_DTYPE_ID, f, attr->dt, &sh_mesg) < 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")
}
- if((tri_ret =H5O_is_shared(H5O_SDSPACE_ID, attr->ds)) < 0)
+ 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_get_share(H5O_SDSPACE_ID, f, attr->ds, &sh_mesg) < 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")
@@ -873,14 +871,14 @@ H5O_attr_copy_file(H5F_t *file_src, const H5O_msg_class_t UNUSED *mesg_type,
HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
/* Get shared message information for datatype */
- if(H5O_get_share(H5O_DTYPE_ID, file_dst, attr_src->dt, &sh_mesg/*out*/) < 0)
+ if(H5O_msg_get_share(H5O_DTYPE_ID, attr_src->dt, &sh_mesg/*out*/) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to get shared message")
/* Compute shared message size for datatype */
- attr_dst->dt_size = H5O_raw_size(H5O_SHARED_ID, file_dst, &sh_mesg);
+ attr_dst->dt_size = H5O_msg_raw_size(file_dst, H5O_SHARED_ID, &sh_mesg);
} /* end if */
else
- attr_dst->dt_size = H5O_raw_size(H5O_DTYPE_ID, file_dst, attr_src->dt);
+ attr_dst->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, attr_src->dt);
HDassert(attr_dst->dt_size > 0);
attr_dst->ds_size = H5S_raw_size(file_dst, attr_src->ds);
HDassert(attr_dst->ds_size > 0);
@@ -1056,13 +1054,10 @@ done:
* Programmer: James Laird
* Tuesday, October 17, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_get_share(H5F_t UNUSED *f, const void *_mesg,
- H5O_shared_t *sh /*out*/)
+H5O_attr_get_share(const void *_mesg, H5O_shared_t *sh /*out*/)
{
const H5A_t *mesg = (const H5A_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -1076,7 +1071,7 @@ H5O_attr_get_share(H5F_t UNUSED *f, const void *_mesg,
ret_value = FAIL;
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5O_attr_get_share() */
/*-------------------------------------------------------------------------
@@ -1089,13 +1084,10 @@ H5O_attr_get_share(H5F_t UNUSED *f, const void *_mesg,
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_attr_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
- const H5O_shared_t *sh)
+H5O_attr_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
{
H5A_t *mesg = (H5A_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -1109,7 +1101,7 @@ H5O_attr_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
ret_value = FAIL;
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5O_attr_set_share() */
/*-------------------------------------------------------------------------
@@ -1212,7 +1204,7 @@ H5O_attr_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int in
HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
/* Get shared message information from datatype */
- if((H5O_MSG_DTYPE->get_share)(f, mesg->dt, &sh_mesg/*out*/) < 0)
+ if((H5O_MSG_DTYPE->get_share)(mesg->dt, &sh_mesg/*out*/) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "can't retrieve shared message information")
debug = H5O_MSG_SHARED->debug;
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c
index 38f4f43..9048d25 100644
--- a/src/H5Ocopy.c
+++ b/src/H5Ocopy.c
@@ -500,7 +500,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
} /* end if (NULL == mesg_src->native) */
/* Copy the source message */
- if((mesg_dst->native = H5O_copy_mesg_file(copy_type, mesg_dst->type,
+ if((mesg_dst->native = H5O_msg_copy_file(copy_type, mesg_dst->type,
oloc_src->file, mesg_src->native, oloc_dst->file, dxpl_id,
cpy_info, udata)) == NULL)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object header message")
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index 32f01f5..eff0d24 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -33,8 +33,8 @@ static void *H5O_dtype_copy(const void *_mesg, void *_dest, unsigned update_flag
static size_t H5O_dtype_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_dtype_reset(void *_mesg);
static herr_t H5O_dtype_free(void *_mesg);
-static herr_t H5O_dtype_get_share(H5F_t *f, const void *_mesg, H5O_shared_t *sh);
-static herr_t H5O_dtype_set_share(H5F_t *f, void *_mesg, const H5O_shared_t *sh);
+static herr_t H5O_dtype_get_share(const void *_mesg, H5O_shared_t *sh);
+static herr_t H5O_dtype_set_share(void *_mesg, const H5O_shared_t *sh);
static herr_t H5O_dtype_is_shared(const void *_mesg);
static herr_t H5O_dtype_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);
@@ -1269,8 +1269,7 @@ H5O_dtype_free(void *mesg)
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_dtype_get_share(H5F_t UNUSED *f, const void *_mesg,
- H5O_shared_t *sh/*out*/)
+H5O_dtype_get_share(const void *_mesg, H5O_shared_t *sh/*out*/)
{
const H5T_t *dt = (const H5T_t *)_mesg;
herr_t ret_value = SUCCEED; /* Return value */
@@ -1312,8 +1311,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_dtype_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
- const H5O_shared_t *sh)
+H5O_dtype_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
{
H5T_t *dt = (H5T_t *)_mesg;
herr_t ret_value = SUCCEED;
diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index 9ad1b84..fedbfd2 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -45,10 +45,8 @@ static void *H5O_fill_copy(const void *_mesg, void *_dest, unsigned update_flag
static size_t H5O_fill_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_fill_reset(void *_mesg);
static herr_t H5O_fill_free(void *_mesg);
-static herr_t H5O_fill_new_get_share(H5F_t *f, const void *_mesg,
- H5O_shared_t *sh);
-static herr_t H5O_fill_new_set_share(H5F_t *f, void *_mesg,
- const H5O_shared_t *sh);
+static herr_t H5O_fill_new_get_share(const void *_mesg, H5O_shared_t *sh);
+static herr_t H5O_fill_new_set_share(void *_mesg, const H5O_shared_t *sh);
static htri_t H5O_fill_new_is_shared(const void *_mesg);
static herr_t H5O_fill_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
int indent, int fwidth);
@@ -680,13 +678,10 @@ H5O_fill_free (void *mesg)
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_fill_new_get_share(H5F_t UNUSED *f, const void *_mesg,
- H5O_shared_t *sh /*out*/)
+H5O_fill_new_get_share(const void *_mesg, H5O_shared_t *sh /*out*/)
{
const H5O_fill_new_t *mesg = (const H5O_fill_new_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -713,13 +708,10 @@ H5O_fill_new_get_share(H5F_t UNUSED *f, const void *_mesg,
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_fill_new_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
- const H5O_shared_t *sh)
+H5O_fill_new_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
{
H5O_fill_new_t *mesg = (H5O_fill_new_t *)_mesg;
herr_t ret_value = SUCCEED;
diff --git a/src/H5Omessage.c b/src/H5Omessage.c
index c244899..27c0c02 100644
--- a/src/H5Omessage.c
+++ b/src/H5Omessage.c
@@ -49,6 +49,27 @@
/* Local Typedefs */
/******************/
+/* User data for iteration while removing a message */
+typedef struct {
+ H5F_t *f; /* Pointer to file for insertion */
+ hid_t dxpl_id; /* DXPL during iteration */
+ int sequence; /* Sequence # to search for */
+ unsigned nfailed; /* # of failed message removals */
+ H5O_operator_t op; /* Callback routine for removal operations */
+ void *op_data; /* Callback data for removal operations */
+ hbool_t adj_link; /* Whether to adjust links when removing messages */
+} H5O_iter_ud1_t;
+
+/* Typedef for "internal library" iteration operations */
+typedef herr_t (*H5O_lib_operator_t)(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+ unsigned sequence, unsigned *oh_flags_ptr/*out*/, void *operator_data/*in,out*/);
+
+/* Some syntactic sugar to make the compiler happy with two different kinds of iterator callbacks */
+typedef union {
+ H5O_operator_t app_op; /* Application callback for each message */
+ H5O_lib_operator_t lib_op; /* Library internal callback for each message */
+} H5O_mesg_operator_t;
+
/********************/
/* Package Typedefs */
@@ -68,6 +89,12 @@ static herr_t H5O_msg_write_real(H5O_loc_t *loc, const H5O_msg_class_t *type,
static herr_t H5O_msg_reset_real(const H5O_msg_class_t *type, void *native);
static void *H5O_msg_copy_real(const H5O_msg_class_t *type, const void *mesg,
void *dst);
+static herr_t H5O_msg_remove_real(const H5O_loc_t *loc, const H5O_msg_class_t *type,
+ int sequence, H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
+static herr_t H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+ unsigned sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/);
+static herr_t H5O_msg_iterate_real(const H5O_loc_t *loc, const H5O_msg_class_t *type,
+ H5AC_protect_t prot, hbool_t internal, H5O_mesg_operator_t op, void *op_data, hid_t dxpl_id);
static unsigned H5O_find_in_ohdr(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
const H5O_msg_class_t **type_p, int sequence);
static unsigned H5O_new_mesg(H5F_t *f, H5O_t *oh, unsigned *flags,
@@ -190,7 +217,7 @@ H5O_msg_append(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id, unsigned me
/* Mark the message as shared */
mesg_flags |= H5O_MSG_FLAG_SHARED;
else if(shared_mesg < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "error determining if message should be shared");
+ HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "error determining if message should be shared")
if(H5O_msg_append_real(f, dxpl_id, oh, type, mesg_flags, update_flags, mesg, oh_flags_ptr) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to append to object header")
@@ -253,73 +280,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5O_msg_hash
- *
- * Purpose: Returns a hash value for an object header message.
- *
- * Return: Non-H5O_HASH_UNDEF hash value on success
- * H5O_HASH_UNDEF on failure
- *
- * Programmer: James Laird
- * April 13 2006
- *
- *-------------------------------------------------------------------------
- */
-uint32_t
-H5O_msg_hash(unsigned type_id, H5F_t *f, const void *mesg)
-{
- size_t buf_size;
- unsigned char * buf = NULL; /* Buffer to be hashed */
- uint32_t hash;
- uint32_t ret_value;
-
- FUNC_ENTER_NOAPI(H5O_msg_hash, H5O_HASH_UNDEF)
-
- /* Check args */
- HDassert(type_id < NELMTS(H5O_msg_class_g));
- HDassert(mesg);
- HDassert(f);
-
- /* Find out the size of buffer needed */
- if((buf_size = H5O_raw_size(type_id, f, mesg)) <= 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADSIZE, H5O_HASH_UNDEF, "can't find message size");
-
- /* JAMES: revisit this! Some messages don't use as much space as they say
- * they need. Quincey may have fixed this.
- */
- if((buf = H5MM_calloc(buf_size)) == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5O_HASH_UNDEF, "can't allocate buffer for message");
-
- /* Encode message into temporary buffer */
- if(H5O_encode(f, buf, mesg, type_id) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, H5O_HASH_UNDEF, "can't encode OH message");
-
- /*
- * Compute the hash value for this message. type_id is used here to
- * initialize the hash algorithm, and affects the resulting value.
- */
- hash = H5_checksum_lookup3(buf, buf_size, type_id);
-
- /* JAMES: this is a pretty good hash function. Do we need to version it?
- * If so, we'd do so here. */
-
- /* A hash value of H5O_HASH_UNDEF indicates failure. If we naturally
- * generated this value, reset it to some valid value. */
- if(hash == H5O_HASH_UNDEF)
- hash = (uint32_t) 1;
-
- /* Set return value */
- ret_value = hash;
-
-done:
- if(buf)
- HDfree(buf);
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_msg_hash() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5O_msg_write
*
* Purpose: Modifies an existing message or creates a new message.
@@ -371,7 +331,7 @@ H5O_msg_write(H5O_loc_t *loc, unsigned type_id, unsigned overwrite,
/* Mark the message as shared */
mesg_flags |= H5O_MSG_FLAG_SHARED;
else if(shared_mesg < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "error while trying to share message");
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "error while trying to share message")
/* Call the "real" modify routine */
if(H5O_msg_write_real(loc, type, overwrite, mesg_flags, update_flags, mesg, dxpl_id) < 0)
@@ -460,7 +420,7 @@ H5O_msg_write_real(H5O_loc_t *loc, const H5O_msg_class_t *type, unsigned overwri
* First, make sure it's not a committed message; these can't ever
* be modified.
*/
- if(((H5O_shared_t*)oh->mesg[idx].native)->flags & H5O_COMMITTED_FLAG)
+ if(((H5O_shared_t *)oh->mesg[idx].native)->flags & H5O_COMMITTED_FLAG)
HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to modify committed message")
/* Remove the old message from the SOHM index */
@@ -475,10 +435,10 @@ H5O_msg_write_real(H5O_loc_t *loc, const H5O_msg_class_t *type, unsigned overwri
* JAMES: will this break if a shared message is overwritten with a larger
* non-shared message?
*/
- HDassert(H5O_is_shared(type->id, mesg) > 0); /* JAMES: this should work with
+ HDassert(H5O_msg_is_shared(type->id, mesg) > 0); /* JAMES: this should work with
* replacement messages that aren't shared, too. */
- if(H5O_get_share(type->id, loc->file, mesg, &sh_mesg) < 0)
+ if(H5O_msg_get_share(type->id, mesg, &sh_mesg) < 0)
HGOTO_ERROR (H5E_OHDR, H5E_BADMESG, FAIL, "can't get shared message")
/* Instead of writing the original message, write a shared message */
@@ -885,6 +845,960 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_msg_copy_real() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_count
+ *
+ * Purpose: Counts the number of messages in an object header which are a
+ * certain type.
+ *
+ * Return: Success: Number of messages of specified type.
+ *
+ * Failure: Negative
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, April 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5O_msg_count(H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
+{
+ H5O_t *oh = NULL; /* Object header to operate on */
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ int acc; /* Count of the message type found */
+ unsigned u; /* Local index variable */
+ int ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_count, FAIL)
+
+ /* Check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(H5F_addr_defined(loc->addr));
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* Load the object header */
+ if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
+
+ /* Loop over all messages, counting the ones of the type looked for */
+ for(u = acc = 0; u < oh->nmesgs; u++)
+ if(oh->mesg[u].type == type)
+ acc++;
+
+ /* Set return value */
+ ret_value = acc;
+
+done:
+ if(oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_count() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_exists
+ *
+ * Purpose: Determines if a particular message exists in an object
+ * header without trying to decode the message.
+ *
+ * Return: Success: FALSE if the message does not exist; TRUE if
+ * th message exists.
+ *
+ * Failure: FAIL if the existence of the message could
+ * not be determined due to some error such as
+ * not being able to read the object header.
+ *
+ * Programmer: Robb Matzke
+ * Monday, November 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_exists(H5O_loc_t *loc, unsigned type_id, int sequence, hid_t dxpl_id)
+{
+ H5O_t *oh = NULL; /* Object header for location */
+ htri_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_exists, FAIL)
+
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ HDassert(sequence >= 0);
+
+ /* Load the object header */
+ if(NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
+
+ /* Call the "real" exists routine */
+ if((ret_value = H5O_msg_exists_oh(oh, type_id, sequence)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_READERROR, FAIL, "unable to verify object header message")
+
+done:
+ if(oh && H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) != SUCCEED)
+ HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_exists() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_exists_oh
+ *
+ * Purpose: Determines if a particular message exists in an object
+ * header without trying to decode the message.
+ *
+ * Return: Success: FALSE if the message does not exist; TRUE if
+ * th message exists.
+ *
+ * Failure: FAIL if the existence of the message could
+ * not be determined due to some error such as
+ * not being able to read the object header.
+ *
+ * Programmer: Robb Matzke
+ * Monday, November 2, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_exists_oh(H5O_t *oh, unsigned type_id, int sequence)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ unsigned u; /* Local index variable */
+ htri_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_msg_exists_oh)
+
+ HDassert(oh);
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(sequence >= 0);
+
+ /* Scan through the messages looking for the right one */
+ for(u = 0; u < oh->nmesgs; u++) {
+ if(type->id != oh->mesg[u].type->id)
+ continue;
+ if(--sequence < 0)
+ break;
+ } /* end for */
+
+ /* Set return value */
+ ret_value = (sequence < 0);
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_exists_oh() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_remove
+ *
+ * Purpose: Removes the specified message from the object header.
+ * If sequence is H5O_ALL (-1) then all messages of the
+ * specified type are removed. Removing a message causes
+ * the sequence numbers to change for subsequent messages of
+ * the same type.
+ *
+ * No attempt is made to join adjacent free areas of the
+ * object header into a single larger free area.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Aug 28 1997
+ *
+ * Modifications:
+ *
+ * Robb Matzke, 7 Jan 1998
+ * Does not remove constant messages.
+ *
+ * Changed to use IDs for types, instead of type objects, then
+ * call "real" routine.
+ * Quincey Koziol
+ * Feb 14 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_remove(H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj_link, hid_t dxpl_id)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_remove, FAIL)
+
+ /* check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(H5F_addr_defined(loc->addr));
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* Call the "real" remove routine */
+ if((ret_value = H5O_msg_remove_real(loc, type, sequence, NULL, NULL, adj_link, dxpl_id)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_remove_op
+ *
+ * Purpose: Removes messages from the object header that a callback
+ * routine indicates should be removed.
+ *
+ * No attempt is made to join adjacent free areas of the
+ * object header into a single larger free area.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Sep 6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
+ H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_remove_op, FAIL)
+
+ /* check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(H5F_addr_defined(loc->addr));
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* Call the "real" remove routine */
+ if((ret_value = H5O_msg_remove_real(loc, type, sequence, op, op_data, adj_link, dxpl_id)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to remove object header message")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_op() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_remove_cb
+ *
+ * Purpose: Object header iterator callback routine to remove messages
+ * of a particular type that match a particular sequence number,
+ * or all messages if the sequence number is H5O_ALL (-1).
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Sep 6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+ unsigned sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/)
+{
+ H5O_iter_ud1_t *udata = (H5O_iter_ud1_t *)_udata; /* Operator user data */
+ htri_t try_remove = FALSE; /* Whether to try removing a message */
+ herr_t ret_value = H5_ITER_CONT; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_msg_remove_cb)
+
+ /* check args */
+ HDassert(mesg);
+
+ /* Check for callback routine */
+ if(udata->op) {
+ /* Call the iterator callback */
+ if((try_remove = (udata->op)(mesg->native, sequence, udata->op_data)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "object header message deletion callback failed")
+ } /* end if */
+ else {
+ /* If there's no callback routine, does the sequence # match? */
+ if((int)sequence == udata->sequence || H5O_ALL == udata->sequence)
+ try_remove = H5_ITER_STOP;
+ } /* end else */
+
+ /* Try removing the message, if indicated */
+ if(try_remove) {
+ /*
+ * Keep track of how many times we failed trying to remove constant
+ * messages.
+ */
+ if(mesg->flags & H5O_MSG_FLAG_CONSTANT)
+ udata->nfailed++;
+ else {
+ /* Convert message into a null message */
+ if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, TRUE, udata->adj_link) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to convert into null message")
+
+ /* Indicate that the object header was modified */
+ *oh_flags_ptr |= H5AC__DIRTIED_FLAG;
+ } /* end else */
+
+ /* Break out now, if we've found the correct message */
+ if(udata->sequence == H5O_FIRST || udata->sequence != H5O_ALL)
+ HGOTO_DONE(H5_ITER_STOP)
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_cb() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_remove_real
+ *
+ * Purpose: Removes the specified message from the object header.
+ * If sequence is H5O_ALL (-1) then all messages of the
+ * specified type are removed. Removing a message causes
+ * the sequence numbers to change for subsequent messages of
+ * the same type.
+ *
+ * No attempt is made to join adjacent free areas of the
+ * object header into a single larger free area.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Aug 28 1997
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_msg_remove_real(const H5O_loc_t *loc, const H5O_msg_class_t *type, int sequence,
+ H5O_operator_t app_op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
+{
+ H5O_iter_ud1_t udata; /* User data for iterator */
+ H5O_mesg_operator_t op; /* Wrapper for operator */
+ herr_t ret_value=SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_msg_remove_real)
+
+ /* check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(type);
+
+ /* Make certain we are allowed to modify the file */
+ if(0 == (H5F_INTENT(loc->file) & H5F_ACC_RDWR))
+ HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
+
+ /* Set up iterator operator data */
+ udata.f = loc->file;
+ udata.dxpl_id = dxpl_id;
+ udata.sequence = sequence;
+ udata.nfailed = 0;
+ udata.op = app_op;
+ udata.op_data = op_data;
+ udata.adj_link = adj_link;
+
+ /* Iterate over the messages, deleting appropriate one(s) */
+ op.lib_op = H5O_msg_remove_cb;
+ if(H5O_msg_iterate_real(loc, type, H5AC_WRITE, TRUE, op, &udata, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "error iterating over messages")
+
+ /* Fail if we tried to remove any constant messages */
+ if(udata.nfailed)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to remove constant message(s)")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_remove_real() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_iterate
+ *
+ * Purpose: Iterate through object headers of a certain type.
+ *
+ * Return: Returns a negative value if something is wrong, the return
+ * value of the last operator if it was non-zero, or zero if all
+ * object headers were processed.
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Nov 19 2004
+ *
+ * Description:
+ * This function interates over the object headers of an object
+ * specified with 'ent' of type 'type_id'. For each object header of the
+ * object, the 'op_data' and some additional information (specified below) are
+ * passed to the 'op' function.
+ * The operation receives a pointer to the object header message for the
+ * object being iterated over ('mesg'), and the pointer to the operator data
+ * passed in to H5O_msg_iterate ('op_data'). The return values from an operator
+ * are:
+ * A. Zero causes the iterator to continue, returning zero when all
+ * object headers of that type have been processed.
+ * B. Positive causes the iterator to immediately return that positive
+ * value, indicating short-circuit success.
+ * C. Negative causes the iterator to immediately return that value,
+ * indicating failure.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id, H5O_operator_t app_op,
+ void *op_data, hid_t dxpl_id)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ H5O_mesg_operator_t op; /* Wrapper for operator */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_iterate, FAIL)
+
+ /* check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(H5F_addr_defined(loc->addr));
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* Call the "real" iterate routine */
+ op.app_op = app_op;
+ if((ret_value = H5O_msg_iterate_real(loc, type, H5AC_READ, FALSE, op, op_data, dxpl_id)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "unable to iterate over object header messages")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_iterate() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_iterate_real
+ *
+ * Purpose: Iterate through object headers of a certain type.
+ *
+ * Return: Returns a negative value if something is wrong, the return
+ * value of the last operator if it was non-zero, or zero if all
+ * object headers were processed.
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Sep 6 2005
+ *
+ * Description:
+ * This function interates over the object headers of an object
+ * specified with 'ent' of type 'type_id'. For each object header of the
+ * object, the 'op_data' and some additional information (specified below) are
+ * passed to the 'op' function.
+ * The operation receives a pointer to the object header message for the
+ * object being iterated over ('mesg'), and the pointer to the operator data
+ * passed in to H5O_msg_iterate ('op_data'). The return values from an operator
+ * are:
+ * A. Zero causes the iterator to continue, returning zero when all
+ * object headers of that type have been processed.
+ * B. Positive causes the iterator to immediately return that positive
+ * value, indicating short-circuit success.
+ * C. Negative causes the iterator to immediately return that value,
+ * indicating failure.
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_msg_iterate_real(const H5O_loc_t *loc, const H5O_msg_class_t *type, H5AC_protect_t prot,
+ hbool_t internal, H5O_mesg_operator_t op, void *op_data, hid_t dxpl_id)
+{
+ H5O_t *oh = NULL; /* Pointer to actual object header */
+ unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Start iteration with no flags set on object header */
+ unsigned idx; /* Absolute index of current message in all messages */
+ unsigned sequence; /* Relative index of current message for messages of type */
+ H5O_mesg_t *idx_msg; /* Pointer to current message */
+ void *native_mesg; /* Native, readable message */
+ hbool_t native_mesg_alloc = FALSE; /* True if native_mesg needs to be freed */
+
+ herr_t ret_value = H5_ITER_CONT; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_msg_iterate_real)
+
+ /* check args */
+ HDassert(loc);
+ HDassert(loc->file);
+ HDassert(H5F_addr_defined(loc->addr));
+ HDassert(type);
+ HDassert(op.app_op);
+
+ /* Protect the object header to iterate over */
+ if (NULL == (oh = H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, prot)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
+
+ /* Iterate over messages */
+ for(sequence = 0, idx = 0, idx_msg = &oh->mesg[0]; idx < oh->nmesgs && !ret_value; idx++, idx_msg++) {
+ if(type->id == idx_msg->type->id) {
+
+ /*
+ * Decode the message if necessary.
+ */
+ H5O_LOAD_NATIVE(loc->file, dxpl_id, idx_msg, FAIL)
+
+ /* Check for making an "internal" (i.e. within the H5O package) callback */
+ if(internal) {
+ /* Call the "internal" iterator callback */
+ if((ret_value = (op.lib_op)(oh, idx_msg, sequence, &oh_flags, op_data)) != 0)
+ break;
+ } /* end if */
+ else {
+ /* If the message is shared, get the real message it points to */
+ /* JAMES: test */
+ if(idx_msg->flags & H5O_MSG_FLAG_SHARED) {
+ if(NULL == (native_mesg = H5O_shared_read(loc->file, dxpl_id,
+ idx_msg->native, idx_msg->type, NULL)))
+ HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unable to read shared message")
+ native_mesg_alloc = TRUE;
+ }
+ else {
+ native_mesg = idx_msg->native;
+ }
+
+ /* Call the iterator callback */
+ if((ret_value = (op.app_op)(native_mesg, sequence, op_data)) != 0)
+ break;
+
+ /* Free the "real" message if it was allocated */
+ if(native_mesg_alloc) {
+ H5O_msg_free(idx_msg->type->id, native_mesg);
+ native_mesg_alloc = FALSE;
+ }
+ } /* end else */
+
+ /* Check for error from iterator */
+ if(ret_value < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "iterator function failed")
+
+ /* Increment sequence value for message type */
+ sequence++;
+ } /* end if */
+ } /* end for */
+
+done:
+ /* Free the native message if it was allocated */
+ if(native_mesg_alloc) {
+ H5O_msg_free(idx_msg->type->id, native_mesg);
+ native_mesg_alloc = FALSE;
+ }
+
+ if(oh) {
+ /* Check if object header was modified */
+ if(oh_flags & H5AC__DIRTIED_FLAG) {
+ /* Shouldn't be able to modify object header if we don't have write access */
+ HDassert(prot == H5AC_WRITE);
+
+ /* Try to condense object header info */
+ /* (Since this routine is invoked when a message is removed from
+ * an object header, the header will be condensed after each
+ * message removal)
+ */
+ if(H5O_condense_header(loc->file, oh, dxpl_id) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_CANTPACK, FAIL, "can't pack object header")
+
+ H5O_touch_oh(loc->file, dxpl_id, oh, FALSE, &oh_flags);
+ } /* end if */
+
+ if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, oh_flags) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
+ } /* end if */
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_iterate_real() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_raw_size
+ *
+ * Purpose: Call the 'raw_size' method for a
+ * particular class of object header.
+ *
+ * Return: Size of message on success, 0 on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Feb 13 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_msg_raw_size(const H5F_t *f, unsigned type_id, const void *mesg)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ size_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_raw_size, 0)
+
+ /* Check args */
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(type->raw_size);
+ HDassert(f);
+ HDassert(mesg);
+
+ /* Compute the raw data size for the mesg */
+ if((ret_value = (type->raw_size)(f, mesg)) == 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_raw_size() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_mesg_size
+ *
+ * Purpose: Calculate the final size of an encoded message in an object
+ * header.
+ *
+ * Note: This routine assumes that the message size will be used in the
+ * creation of a new object header.
+ *
+ * Return: Size of message on success, 0 on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Sep 6 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5O_msg_mesg_size(const H5F_t *f, unsigned type_id, const void *mesg, size_t extra_raw)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ size_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_mesg_size, 0)
+
+ /* Check args */
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(type->raw_size);
+ HDassert(f);
+ HDassert(mesg);
+
+ /* Compute the raw data size for the mesg */
+ if((ret_value = (type->raw_size)(f, mesg)) == 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, 0, "unable to determine size of message")
+
+ /* Add in "extra" raw space */
+ ret_value += extra_raw;
+
+ /* Adjust size for alignment, if necessary */
+ ret_value = H5O_ALIGN_F(f, ret_value);
+
+ /* Add space for message header */
+ ret_value += H5O_SIZEOF_MSGHDR_F(f);
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_mesg_size() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_get_share
+ *
+ * Purpose: Call the 'get_share' method for a
+ * particular class of object header.
+ *
+ * Return: Success: Non-negative, and SHARE describes the shared
+ * object.
+ *
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Oct 2 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_get_share(unsigned type_id, const void *mesg, H5O_shared_t *share)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_get_share, FAIL)
+
+ /* Check args */
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(type->get_share);
+ HDassert(mesg);
+ HDassert(share);
+
+ /* Get shared data for the mesg */
+ if((ret_value = (type->get_share)(mesg, share)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve shared message information")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_get_share() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_is_shared
+ *
+ * Purpose: Call the 'is_shared' method for a
+ * particular class of object header.
+ *
+ * Return: Object is shared: TRUE
+ * Object is not shared: FALSE
+ *
+ * Programmer: James Laird
+ * jlaird@ncsa.uiuc.edu
+ * April 5 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5O_msg_is_shared(unsigned type_id, const void *mesg)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ htri_t ret_value;
+
+ FUNC_ENTER_NOAPI_NOFUNC(H5O_msg_is_shared)
+
+ /* Check args */
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(mesg);
+
+ HDassert(type_id != H5O_SHARED_ID); /* JAMES: check for this mistake elsewhere, too */
+
+ /* If there is no is_shared function, then obviously it's not a shared message! */
+ if(!(type->is_shared))
+ ret_value = FALSE;
+ else
+ ret_value = (type->is_shared)(mesg);
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_is_shared() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_set_share
+ *
+ * Purpose: Set the shared information for an object header message.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: James Laird
+ * jlaird@hdfgroup.org
+ * November 1 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_set_share(unsigned type_id, H5O_shared_t *share, void *mesg)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_set_share, FAIL)
+
+ /* Check args */
+ HDassert(share);
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(type->set_share);
+ HDassert(mesg);
+ HDassert(share->flags != H5O_NOT_SHARED);
+
+ /* Set this message as the shared message for the message, wiping out
+ * any information that was there before
+ */
+ if((ret_value = (type->set_share)(mesg, share)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to set shared message information")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_set_share() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_reset_share
+ *
+ * Purpose: Reset the shared information for an object header message.
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ *
+ * Programmer: James Laird
+ * jlaird@hdfgroup.org
+ * Oct 17 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_reset_share(unsigned type_id, void *mesg)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ H5O_shared_t sh_mesg; /* Shared message */
+ herr_t ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_reset_share, FAIL)
+
+ /* Check args */
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+ HDassert(type->set_share);
+ HDassert(mesg);
+
+ /* Initialize the shared message to zero. */
+ HDmemset(&sh_mesg, 0, sizeof(H5O_shared_t));
+
+ /* Set this message as the shared message for the message, wiping out
+ * any information that was there before
+ */
+ if((ret_value = (type->set_share)(mesg, &sh_mesg)) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to reset shared message information")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_reset_share() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_encode
+ *
+ * Purpose: Encode an object(data type and simple data space only)
+ * description into a buffer.
+ *
+ * Return: Success: Non-negative
+ *
+ * Failure: Negative
+ *
+ * Programmer: Raymond Lu
+ * slu@ncsa.uiuc.edu
+ * July 13, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_msg_encode(H5F_t *f, unsigned type_id, unsigned char *buf, const void *mesg)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_encode,FAIL)
+
+ /* check args */
+ HDassert(f);
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* Encode */
+ if((type->encode)(f, buf, mesg) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to encode message")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_encode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_decode
+ *
+ * Purpose: Decode a binary object description and return a new
+ * object handle.
+ *
+ * Note: This routine is not guaranteed to work with all possible
+ * header messages, use with care.
+ *
+ * Return: Success: Pointer to object(data type or space)
+ *
+ * Failure: NULL
+ *
+ * Programmer: Raymond Lu
+ * slu@ncsa.uiuc.edu
+ * July 14, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_decode(H5F_t *f, hid_t dxpl_id, unsigned type_id, const unsigned char *buf)
+{
+ const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
+ void *ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_msg_decode, NULL)
+
+ /* check args */
+ HDassert(f);
+ HDassert(type_id < NELMTS(H5O_msg_class_g));
+ type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */
+ HDassert(type);
+
+ /* decode */
+ if((ret_value = (type->decode)(f, dxpl_id, buf)) == NULL)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "unable to decode message")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_msg_copy_file
+ *
+ * Purpose: Copies a message to file. If MESG is is the null pointer then a null
+ * pointer is returned with no error.
+ *
+ * Return: Success: Ptr to the new message
+ *
+ * Failure: NULL
+ *
+ * Programmer: Peter Cao
+ * June 4, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5O_msg_copy_file(const H5O_msg_class_t *copy_type, const H5O_msg_class_t *mesg_type, H5F_t *file_src, void *native_src,
+ H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata)
+{
+ void *ret_value;
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_msg_copy_file)
+
+ /* check args */
+ HDassert(copy_type);
+ HDassert(mesg_type);
+ HDassert(copy_type->copy_file);
+ HDassert(file_src);
+ HDassert(native_src);
+ HDassert(file_dst);
+ HDassert(cpy_info);
+
+ if(NULL == (ret_value = (copy_type->copy_file)(file_src, mesg_type, native_src, file_dst, dxpl_id, cpy_info, udata)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to copy object header message to file")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_msg_copy_file() */
/*-------------------------------------------------------------------------
@@ -1004,7 +1918,7 @@ H5O_new_mesg(H5F_t *f, H5O_t *oh, unsigned *mesg_flags, const H5O_msg_class_t *o
/* Message is shared. Get shared message, change message type,
* and use shared information */
HDmemset(sh_mesg, 0, sizeof(H5O_shared_t));
- if((orig_type->get_share)(f, orig_mesg, sh_mesg/*out*/) < 0)
+ if((orig_type->get_share)(orig_mesg, sh_mesg/*out*/) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, UFAIL, "can't get shared message")
*new_type = H5O_MSG_SHARED;
@@ -1090,3 +2004,64 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_write_mesg() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_delete_mesg
+ *
+ * Purpose: Internal function to:
+ * Delete an object header message from a file. This frees the file
+ * space used for anything referred to in the object header message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * September 26 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_delete_mesg(H5F_t *f, hid_t dxpl_id, H5O_mesg_t *mesg, hbool_t adj_link)
+{
+ const H5O_msg_class_t *type; /* Type of object to free */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5O_delete_mesg, FAIL)
+
+ /* Check args */
+ HDassert(f);
+ HDassert(mesg);
+
+ /* Get the message to free's type */
+ if(mesg->flags & H5O_MSG_FLAG_SHARED)
+ type = H5O_MSG_SHARED;
+ else
+ type = mesg->type;
+
+ /* Check if there is a file space deletion callback for this type of message */
+ if(type->del) {
+ /* Decode the message if necessary. */
+ if(NULL == mesg->native) {
+ HDassert(type->decode);
+ if(NULL == (mesg->native = (type->decode)(f, dxpl_id, mesg->raw)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, FAIL, "unable to decode message")
+ } /* end if */
+
+ /* Check if this message needs to be removed from the SOHM table */
+ /* JAMES: there should be a callback, maybe in H5O_shared_delete, to fiddle w/ the ref. count.
+ * We shouldn't need to do a search in the SOHM table on delete. */
+ if(type == H5O_MSG_SHARED)
+ {
+ /* The native message here is actually a shared message. */
+ if(H5SM_try_delete(f, dxpl_id, mesg->type->id, mesg->native) < 0)
+ HGOTO_ERROR (H5E_OHDR, H5E_CANTFREE, FAIL, "unable to delete message from SOHM table")
+ }
+
+ if((type->del)(f, dxpl_id, mesg->native, adj_link) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete file space for object header message")
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_delete_msg() */
+
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index 0471d5f..a23b311 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -176,14 +176,14 @@ struct H5O_msg_class_t {
void *(*decode)(H5F_t*, hid_t, const uint8_t*);
herr_t (*encode)(H5F_t*, uint8_t*, const void*);
void *(*copy)(const void*, void*, unsigned); /*copy native value */
- size_t (*raw_size)(const H5F_t*, const void*);/*sizeof raw val */
+ size_t (*raw_size)(const H5F_t*, const void*);/*sizeof encoded message */
herr_t (*reset)(void *); /*free nested data structs */
herr_t (*free)(void *); /*free main data struct */
herr_t (*del)(H5F_t *, hid_t, const void *, hbool_t); /* Delete space in file referenced by this message */
herr_t (*link)(H5F_t *, hid_t, const void *); /* Increment any links in file reference by this message */
- herr_t (*get_share)(H5F_t*, const void*, struct H5O_shared_t*); /* Get shared information */
- herr_t (*set_share)(H5F_t*, void*, const struct H5O_shared_t*); /* Set shared information */
- htri_t (*is_shared)(const void*); /* Is message shared? */
+ herr_t (*get_share)(const void*, struct H5O_shared_t*); /* Get shared information */
+ herr_t (*set_share)(void*, const struct H5O_shared_t*); /* Set shared information */
+ htri_t (*is_shared)(const void*); /* Is message shared? */
herr_t (*pre_copy_file)(H5F_t *, const H5O_msg_class_t *, const void *, hbool_t *, const H5O_copy_t *, void *); /*"pre copy" action when copying native value to file */
void *(*copy_file)(H5F_t *, const H5O_msg_class_t *, void *, H5F_t *, hid_t, H5O_copy_t *, void *); /*copy native value to file */
herr_t (*post_copy_file)(const H5O_loc_t *, const void *, H5O_loc_t *, void *, hid_t, H5O_copy_t *); /*"post copy" action when copying native value to file */
@@ -394,9 +394,6 @@ H5_DLLVAR const H5O_obj_class_t H5O_OBJ_DATATYPE[1];
H5_DLL herr_t H5O_flush_msgs(H5F_t *f, H5O_t *oh);
H5_DLL herr_t H5O_delete_mesg(H5F_t *f, hid_t dxpl_id, H5O_mesg_t *mesg,
hbool_t adj_link);
-H5_DLL void * H5O_copy_mesg_file(const H5O_msg_class_t *copy_type,
- const H5O_msg_class_t *mesg_type, H5F_t *file_src, void *mesg_src,
- H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata);
H5_DLL const H5O_obj_class_t *H5O_obj_class_real(H5O_t *oh);
/* Object header message routines */
@@ -404,6 +401,10 @@ H5_DLL void *H5O_msg_read_real(H5F_t *f, H5O_t *oh, unsigned type_id,
int sequence, void *mesg, hid_t dxpl_id);
H5_DLL void *H5O_msg_free_real(const H5O_msg_class_t *type, void *mesg);
H5_DLL herr_t H5O_msg_free_mesg(H5O_mesg_t *mesg);
+H5_DLL htri_t H5O_msg_exists_oh(struct H5O_t *oh, unsigned type_id, int sequence);
+H5_DLL void * H5O_msg_copy_file(const H5O_msg_class_t *copy_type,
+ const H5O_msg_class_t *mesg_type, H5F_t *file_src, void *mesg_src,
+ H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata);
/* Object header allocation routines */
H5_DLL unsigned H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
diff --git a/src/H5Opline.c b/src/H5Opline.c
index e95863b..0c7f754 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -35,10 +35,8 @@ static void *H5O_pline_copy(const void *_mesg, void *_dest, unsigned update_flag
static size_t H5O_pline_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_pline_reset(void *_mesg);
static herr_t H5O_pline_free(void *_mesg);
-static herr_t H5O_pline_get_share (H5F_t *f, const void *_mesg,
- H5O_shared_t *sh);
-static herr_t H5O_pline_set_share (H5F_t *f, void *_mesg,
- const H5O_shared_t *sh);
+static herr_t H5O_pline_get_share(const void *_mesg, H5O_shared_t *sh);
+static herr_t H5O_pline_set_share(void *_mesg, const H5O_shared_t *sh);
static htri_t H5O_pline_is_shared(const void *_mesg);
static herr_t H5O_pline_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);
@@ -606,13 +604,10 @@ done:
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_pline_get_share(H5F_t UNUSED *f, const void *_mesg,
- H5O_shared_t *sh /*out*/)
+H5O_pline_get_share(const void *_mesg, H5O_shared_t *sh /*out*/)
{
const H5O_pline_t *mesg = (const H5O_pline_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -644,8 +639,7 @@ H5O_pline_get_share(H5F_t UNUSED *f, const void *_mesg,
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_pline_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
- const H5O_shared_t *sh)
+H5O_pline_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
{
H5O_pline_t *mesg = (H5O_pline_t *)_mesg;
herr_t ret_value = SUCCEED;
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index cd821db..2248962 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -377,17 +377,13 @@ struct H5P_genplist_t;
struct H5SL_t;
struct H5O_t;
-/* General message operators */
+/* Object header routines */
H5_DLL herr_t H5O_init(void);
H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint,
hid_t ocpl_id, H5O_loc_t *loc/*out*/);
H5_DLL herr_t H5O_open(const H5O_loc_t *loc);
H5_DLL herr_t H5O_close(H5O_loc_t *loc);
H5_DLL int H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id);
-H5_DLL int H5O_count(H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
-H5_DLL htri_t H5O_exists(H5O_loc_t *loc, unsigned type_id, int sequence,
- hid_t dxpl_id);
-H5_DLL htri_t H5O_exists_oh(struct H5O_t *oh, unsigned type_id, int sequence);
H5_DLL struct H5O_t *H5O_protect(H5O_loc_t *loc, hid_t dxpl_id);
H5_DLL herr_t H5O_unprotect(H5O_loc_t *loc, struct H5O_t *oh, hid_t dxpl_id,
unsigned oh_flags);
@@ -399,25 +395,8 @@ H5_DLL herr_t H5O_bogus(H5O_loc_t *loc, hid_t dxpl_id);
H5_DLL herr_t H5O_bogus_oh(H5F_t *f, hid_t dxpl_id, struct H5O_t *oh,
unsigned * oh_flags_ptr);
#endif /* H5O_ENABLE_BOGUS */
-H5_DLL herr_t H5O_remove(H5O_loc_t *loc, unsigned type_id, int sequence,
- hbool_t adj_link, hid_t dxpl_id);
-H5_DLL herr_t H5O_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
- H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
-H5_DLL herr_t H5O_encode(H5F_t *f, unsigned char *buf, const void *obj, unsigned type_id);
-H5_DLL void* H5O_decode(H5F_t *f, hid_t dxpl_id, const unsigned char *buf,
- unsigned type_id);
-H5_DLL size_t H5O_raw_size(unsigned type_id, const H5F_t *f, const void *mesg);
-H5_DLL size_t H5O_mesg_size(unsigned type_id, const H5F_t *f, const void *mesg,
- size_t extra_raw);
-H5_DLL herr_t H5O_get_share(unsigned type_id, H5F_t *f, const void *mesg, H5O_shared_t *share);
H5_DLL herr_t H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
-H5_DLL htri_t H5O_is_shared(unsigned type_id, const void *mesg);
-H5_DLL herr_t H5O_set_share(H5F_t *f, H5O_shared_t *share, unsigned type_id,
- void *mesg);
-H5_DLL herr_t H5O_reset_share(H5F_t *f, unsigned type_id, void *mesg);
H5_DLL herr_t H5O_get_info(H5O_loc_t *oloc, H5O_info_t *oinfo, hid_t dxpl_id);
-H5_DLL herr_t H5O_iterate(const H5O_loc_t *loc, unsigned type_id, H5O_operator_t op,
- void *op_data, hid_t dxpl_id);
H5_DLL herr_t H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id);
H5_DLL herr_t H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, struct H5P_genplist_t *oc_plist);
@@ -434,7 +413,25 @@ H5_DLL void *H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, int sequence,
H5_DLL herr_t H5O_msg_reset(unsigned type_id, void *native);
H5_DLL void *H5O_msg_free(unsigned type_id, void *mesg);
H5_DLL void *H5O_msg_copy(unsigned type_id, const void *mesg, void *dst);
-H5_DLL uint32_t H5O_msg_hash(unsigned type_id, H5F_t *f, const void *mesg);
+H5_DLL int H5O_msg_count(H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
+H5_DLL htri_t H5O_msg_exists(H5O_loc_t *loc, unsigned type_id, int sequence,
+ hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_remove(H5O_loc_t *loc, unsigned type_id, int sequence,
+ hbool_t adj_link, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
+ H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id);
+H5_DLL herr_t H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id, H5O_operator_t op,
+ void *op_data, hid_t dxpl_id);
+H5_DLL size_t H5O_msg_raw_size(const H5F_t *f, unsigned type_id, const void *mesg);
+H5_DLL size_t H5O_msg_mesg_size(const H5F_t *f, unsigned type_id, const void *mesg,
+ size_t extra_raw);
+H5_DLL herr_t H5O_msg_get_share(unsigned type_id, const void *mesg, H5O_shared_t *share);
+H5_DLL htri_t H5O_msg_is_shared(unsigned type_id, const void *mesg);
+H5_DLL herr_t H5O_msg_set_share(unsigned type_id, H5O_shared_t *share, void *mesg);
+H5_DLL herr_t H5O_msg_reset_share(unsigned type_id, void *mesg);
+H5_DLL herr_t H5O_msg_encode(H5F_t *f, unsigned type_id, unsigned char *buf, const void *obj);
+H5_DLL void* H5O_msg_decode(H5F_t *f, hid_t dxpl_id, unsigned type_id,
+ const unsigned char *buf);
/* Object copying routines */
H5_DLL herr_t H5O_copy_header_map(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index 750ad4a..7287f50 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -31,11 +31,9 @@ static void *H5O_sdspace_copy(const void *_mesg, void *_dest, unsigned update_fl
static size_t H5O_sdspace_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_sdspace_reset(void *_mesg);
static herr_t H5O_sdspace_free (void *_mesg);
-static herr_t H5O_sdspace_get_share (H5F_t *f, const void *_mesg,
- H5O_shared_t *sh);
-static herr_t H5O_sdspace_set_share (H5F_t *f, void *_mesg,
- const H5O_shared_t *sh);
-static htri_t H5O_sdspace_is_shared (const void *_mesg);
+static herr_t H5O_sdspace_get_share(const void *_mesg, H5O_shared_t *sh);
+static herr_t H5O_sdspace_set_share(void *_mesg, const H5O_shared_t *sh);
+static htri_t H5O_sdspace_is_shared(const void *_mesg);
static herr_t H5O_sdspace_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 herr_t H5O_sdspace_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
@@ -459,13 +457,10 @@ H5O_sdspace_free (void *mesg)
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_sdspace_get_share(H5F_t UNUSED *f, const void *_mesg,
- H5O_shared_t *sh /*out*/)
+H5O_sdspace_get_share(const void *_mesg, H5O_shared_t *sh /*out*/)
{
const H5S_extent_t *mesg = (const H5S_extent_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -492,13 +487,10 @@ H5O_sdspace_get_share(H5F_t UNUSED *f, const void *_mesg,
* Programmer: James Laird
* Tuesday, October 10, 2006
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_sdspace_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
- const H5O_shared_t *sh)
+H5O_sdspace_set_share(void *_mesg/*in,out*/, const H5O_shared_t *sh)
{
H5S_extent_t *mesg = (H5S_extent_t *)_mesg;
herr_t ret_value = SUCCEED;
@@ -512,7 +504,7 @@ H5O_sdspace_set_share(H5F_t UNUSED *f, void *_mesg/*in,out*/,
ret_value = FAIL;
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5O_sdspace_set_share() */
/*-------------------------------------------------------------------------
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index 1a1ca21..f84fde6 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -38,10 +38,10 @@
#include "H5HFprivate.h" /* Fractal heap */
#include "H5SMprivate.h" /*JAMES: for H5SM_get_fheap_addr. Change this? */
-static void *H5O_shared_decode (H5F_t*, hid_t dxpl_id, const uint8_t*);
-static herr_t H5O_shared_encode (H5F_t*, uint8_t*, const void*);
+static void *H5O_shared_decode(H5F_t*, hid_t dxpl_id, 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, unsigned update_flags);
-static size_t H5O_shared_size (const H5F_t*, const void *_mesg);
+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);
@@ -49,7 +49,7 @@ static herr_t H5O_shared_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *t
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);
+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] = {{
@@ -151,7 +151,7 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared,
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "can't read message from fractal heap.")
/* Decode the message */
- if(NULL == (native_mesg = H5O_decode(f, dxpl_id, buf, type->id)))
+ if(NULL == (native_mesg = H5O_msg_decode(f, dxpl_id, type->id, buf)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode shared message.")
/* Copy this message to the user's buffer */
@@ -167,7 +167,7 @@ H5O_shared_read(H5F_t *f, hid_t dxpl_id, const H5O_shared_t *shared,
} /* end else */
/* Mark the message as shared */
- if(type->set_share && (type->set_share)(f, ret_value, shared) < 0)
+ if(type->set_share && (type->set_share)(ret_value, shared) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to set sharing information")
done:
@@ -706,7 +706,7 @@ H5O_shared_copy_file(H5F_t *file_src, const H5O_msg_class_t *mesg_type,
if(mesg_type->copy_file) {
/* Copy the original, un-shared message and return it */
- ret_value = H5O_copy_mesg_file(mesg_type, mesg_type, file_src, dst_mesg, file_dst, dxpl_id, cpy_info, udata);
+ ret_value = H5O_msg_copy_file(mesg_type, mesg_type, file_src, dst_mesg, file_dst, dxpl_id, cpy_info, udata);
H5MM_xfree(dst_mesg);
}
else {
diff --git a/src/H5S.c b/src/H5S.c
index 42c70ca..6547281 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -1493,62 +1493,56 @@ done:
* Programmer: Robb Matzke
* Friday, January 30, 1998
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
int
-H5S_extend (H5S_t *space, const hsize_t *size)
+H5S_extend(H5S_t *space, const hsize_t *size)
{
- int ret_value=0;
unsigned u;
+ int ret_value = 0;
- FUNC_ENTER_NOAPI(H5S_extend, FAIL);
+ FUNC_ENTER_NOAPI(H5S_extend, FAIL)
/* Check args */
- assert (space && H5S_SIMPLE==H5S_GET_EXTENT_TYPE(space));
- assert (size);
+ HDassert(space && H5S_SIMPLE == H5S_GET_EXTENT_TYPE(space));
+ HDassert(size);
/* Check through all the dimensions to see if modifying the dataspace is allowed */
- for (u=0; u<space->extent.rank; u++) {
- if (space->extent.size[u]<size[u]) {
- if (space->extent.max &&
- H5S_UNLIMITED!=space->extent.max[u] &&
+ for(u = 0; u < space->extent.rank; u++) {
+ if(space->extent.size[u]<size[u]) {
+ if(space->extent.max && H5S_UNLIMITED!=space->extent.max[u] &&
space->extent.max[u]<size[u])
- HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "dimension cannot be increased");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimension cannot be increased")
ret_value++;
- }
- }
+ } /* end if */
+ } /* end for */
/* Update */
- if (ret_value) {
+ if(ret_value) {
hsize_t nelem; /* Number of elements in extent */
/* Change the dataspace size & re-compute the number of elements in the extent */
- for (u=0, nelem=1; u<space->extent.rank; u++) {
- if (space->extent.size[u]<size[u])
+ for(u = 0, nelem = 1; u < space->extent.rank; u++) {
+ if(space->extent.size[u] < size[u])
space->extent.size[u] = size[u];
- nelem*=space->extent.size[u];
- }
+ nelem *= space->extent.size[u];
+ } /* end for */
space->extent.nelem = nelem;
/* If the selection is 'all', update the number of elements selected */
- if(H5S_GET_SELECT_TYPE(space)==H5S_SEL_ALL)
- if(H5S_select_all(space, FALSE)<0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection");
+ if(H5S_GET_SELECT_TYPE(space) == H5S_SEL_ALL)
+ if(H5S_select_all(space, FALSE) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
/* Mark the dataspace as no longer shared if it was before */
- /* JAMES: passes in NULL for the file because the file has nothing to do with it.
- * can I eliminate the file completely from sharing?
- */
- if(H5O_reset_share(NULL, H5O_SDSPACE_ID, space) < 0)
+ if(H5O_msg_reset_share(H5O_SDSPACE_ID, space) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRESET, FAIL, "can't stop sharing dataspace")
- }
+ } /* end if */
done:
- FUNC_LEAVE_NOAPI(ret_value);
-}
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extend() */
/*-------------------------------------------------------------------------
@@ -1738,7 +1732,7 @@ H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
/* Find out the size of buffer needed for extent */
- if((extent_size = H5O_raw_size(H5O_SDSPACE_ID, f, obj)) == 0)
+ if((extent_size = H5O_msg_raw_size(f, H5O_SDSPACE_ID, obj)) == 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADSIZE, FAIL, "can't find dataspace size")
/* Find out the size of buffer needed for selection */
@@ -1764,7 +1758,7 @@ H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
UINT32ENCODE(buf, extent_size);
/* Encode the extent part of dataspace */
- if(H5O_encode(f, buf, obj, H5O_SDSPACE_ID) < 0)
+ if(H5O_msg_encode(f, H5O_SDSPACE_ID, buf, obj) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space")
buf += extent_size;
@@ -1870,7 +1864,7 @@ H5S_decode(const unsigned char *buf)
/* Decode the extent part of dataspace */
/* (pass mostly bogus file pointer and bogus DXPL) */
- if((extent = H5O_decode(f, H5P_DEFAULT, buf, H5O_SDSPACE_ID))==NULL)
+ if((extent = H5O_msg_decode(f, H5P_DEFAULT, H5O_SDSPACE_ID, buf))==NULL)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode object")
buf += extent_size;
@@ -1923,7 +1917,7 @@ H5S_raw_size(const H5F_t *f, const H5S_t *space)
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5S_raw_size)
/* Return the size of buffer needed for extent */
- FUNC_LEAVE_NOAPI(H5O_raw_size(H5O_SDSPACE_ID, f, &(space->extent)))
+ FUNC_LEAVE_NOAPI(H5O_msg_raw_size(f, H5O_SDSPACE_ID, &(space->extent)))
} /* end H5S_raw_size() */
diff --git a/src/H5SM.c b/src/H5SM.c
index 38b8c75..e84490b 100755
--- a/src/H5SM.c
+++ b/src/H5SM.c
@@ -19,19 +19,20 @@
#define H5SM_PACKAGE /*suppress error about including H5SMpkg */
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
+
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5ACprivate.h" /* Metadata cache */
#include "H5Eprivate.h" /* Error handling */
+#include "H5Fpkg.h" /* File access */
#include "H5FLprivate.h" /* Free Lists */
#include "H5MFprivate.h" /* File memory management */
#include "H5MMprivate.h" /* Memory management */
-
-#include "H5Fpkg.h" /* File access */
#include "H5SMpkg.h" /* Shared object header messages */
+
/****************/
/* Local Macros */
/****************/
@@ -44,10 +45,12 @@
#define H5SM_FHEAP_CHECKSUM_DBLOCKS TRUE
#define H5SM_FHEAP_MAX_MAN_SIZE (4 * 1024)
+
/******************/
/* Local Typedefs */
/******************/
+
/********************/
/* Local Prototypes */
/********************/
@@ -71,10 +74,12 @@ H5FL_ARR_DEFINE(H5SM_index_header_t, H5SM_MAX_INDEXES);
H5FL_DEFINE(H5SM_list_t);
H5FL_ARR_DEFINE(H5SM_sohm_t, H5SM_MAX_LIST_ELEMS);
+
/*****************************/
/* Library Private Variables */
/*****************************/
+
/*******************/
/* Local Variables */
/*******************/
@@ -138,10 +143,9 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, hid_t dxpl_id)
/* Check that type flags weren't duplicated anywhere */
type_flags_used = 0;
- for(x=0; x<num_indexes; ++x) {
- if(index_type_flags[x] & type_flags_used) {
+ for(x = 0; x < num_indexes; ++x) {
+ if(index_type_flags[x] & type_flags_used)
HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "the same shared message type flag is assigned to more than one index")
- }
type_flags_used |= index_type_flags[x];
}
@@ -202,14 +206,14 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, hid_t dxpl_id)
done:
if(ret_value < 0)
{
- if(table_addr != HADDR_UNDEF)
- H5MF_xfree(f, H5FD_MEM_SOHM, dxpl_id, table_addr, (hsize_t)H5SM_TABLE_SIZE(f));
- if(table != NULL)
- H5FL_FREE(H5SM_master_table_t, table);
+ if(table_addr != HADDR_UNDEF)
+ H5MF_xfree(f, H5FD_MEM_SOHM, dxpl_id, table_addr, (hsize_t)H5SM_TABLE_SIZE(f));
+ if(table != NULL)
+ H5FL_FREE(H5SM_master_table_t, table);
}
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5SM_init() */
/*-------------------------------------------------------------------------
@@ -241,23 +245,23 @@ H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id)
/* Translate the H5O type_id into an H5SM type flag */
switch(type_id)
{
- case H5O_SDSPACE_ID:
- type_flag = H5O_MESG_SDSPACE_FLAG;
- break;
- case H5O_DTYPE_ID:
- type_flag = H5O_MESG_DTYPE_FLAG;
- break;
- case H5O_FILL_NEW_ID:
- type_flag = H5O_MESG_FILL_FLAG;
- break;
- case H5O_PLINE_ID:
- type_flag = H5O_MESG_PLINE_FLAG;
- break;
- case H5O_ATTR_ID:
- type_flag = H5O_MESG_ATTR_FLAG;
- break;
- default:
- HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "unknown message type ID")
+ case H5O_SDSPACE_ID:
+ type_flag = H5O_MESG_SDSPACE_FLAG;
+ break;
+ case H5O_DTYPE_ID:
+ type_flag = H5O_MESG_DTYPE_FLAG;
+ break;
+ case H5O_FILL_NEW_ID:
+ type_flag = H5O_MESG_FILL_FLAG;
+ break;
+ case H5O_PLINE_ID:
+ type_flag = H5O_MESG_PLINE_FLAG;
+ break;
+ case H5O_ATTR_ID:
+ type_flag = H5O_MESG_ATTR_FLAG;
+ break;
+ default:
+ HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "unknown message type ID")
}
/* Search the indexes until we find one that matches this flag or we've
@@ -277,7 +281,8 @@ H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id)
*/
done:
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5SM_get_index() */
+
/*-------------------------------------------------------------------------
* Function: H5SM_get_fheap_addr
@@ -298,10 +303,11 @@ H5SM_get_fheap_addr(H5F_t *f, unsigned type_id, hid_t dxpl_id)
H5SM_master_table_t *table = NULL;
ssize_t index_num; /* Which index */
haddr_t ret_value;
+
FUNC_ENTER_NOAPI(H5SM_get_fheap_addr, FAIL)
/* Look up the master SOHM table */
- if (NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, HADDR_UNDEF, "unable to load SOHM master table")
/* JAMES! */
@@ -316,9 +322,9 @@ done:
HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, HADDR_UNDEF, "unable to close SOHM master table")
FUNC_LEAVE_NOAPI(ret_value)
-}
-
+} /* end H5SM_get_fheap_addr() */
+
/*-------------------------------------------------------------------------
* Function: H5SM_create_index
*
@@ -393,9 +399,8 @@ H5SM_create_index(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
done:
/* Close the fractal heap if one has been created */
- if(fheap)
- if(H5HF_close(fheap, dxpl_id) < 0)
- HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+ if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+ HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5SM_create_index */
@@ -458,28 +463,26 @@ H5SM_create_list(H5F_t *f, H5SM_index_header_t * header, hid_t dxpl_id)
if(H5AC_set(f, dxpl_id, H5AC_SOHM_LIST, addr, list, H5AC__NO_FLAGS_SET) < 0)
HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, HADDR_UNDEF, "can't add SOHM list to cache")
+ /* Set return value */
ret_value = addr;
+
done:
if(ret_value == HADDR_UNDEF)
{
- if(list != NULL)
- {
- if(list->messages != NULL)
- H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
- H5FL_FREE(H5SM_list_t, list);
-
- }
- if(addr != HADDR_UNDEF)
- {
- H5MF_xfree(f, H5FD_MEM_SOHM, dxpl_id, addr, size);
- }
+ if(list != NULL)
+ {
+ if(list->messages != NULL)
+ H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
+ H5FL_FREE(H5SM_list_t, list);
+ }
+ if(addr != HADDR_UNDEF)
+ H5MF_xfree(f, H5FD_MEM_SOHM, dxpl_id, addr, size);
}
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5SM_create_list */
-
/*-------------------------------------------------------------------------
* Function: H5SM_try_share
*
@@ -510,6 +513,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, unsigned type_id, void *mesg)
unsigned cache_flags = H5AC__NO_FLAGS_SET;
ssize_t index_num;
herr_t ret_value = TRUE;
+
FUNC_ENTER_NOAPI(H5SM_try_share, FAIL)
/* Check whether this message ought to be shared or not */
@@ -554,7 +558,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, unsigned type_id, void *mesg)
HGOTO_DONE(FALSE);
/* If the message isn't big enough, don't bother sharing it */
- if(0 == (mesg_size = H5O_mesg_size(type_id, f, mesg, 0)))
+ if(0 == (mesg_size = H5O_msg_mesg_size(f, type_id, mesg, 0)))
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unable to get OH message size")
if(mesg_size < table->indexes[index_num].min_mesg_size)
HGOTO_DONE(FALSE);
@@ -579,7 +583,7 @@ done:
HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table")
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5SM_try_share() */
/*-------------------------------------------------------------------------
@@ -614,6 +618,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
size_t buf_size; /* Size of the encoded message */
void * encoding_buf=NULL; /* Buffer for encoded message */
herr_t ret_value = SUCCEED;
+
FUNC_ENTER_NOAPI(H5SM_write_mesg, FAIL)
HDassert(cache_flags_ptr);
@@ -627,17 +632,15 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
shared.flags = H5O_SHARED_IN_HEAP_FLAG;
/* Encode the message to be written */
- if((buf_size = H5O_raw_size(type_id, f, mesg)) <= 0)
- HGOTO_ERROR(H5E_OHDR, H5E_BADSIZE, FAIL, "can't find message size");
-
+ if((buf_size = H5O_msg_raw_size(f, type_id, mesg)) <= 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_BADSIZE, FAIL, "can't find message size")
if(NULL == (encoding_buf = H5MM_calloc(buf_size)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate buffer for encoding");
-
- if(H5O_encode(f, encoding_buf, mesg, type_id) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "can't encode message to be shared");
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate buffer for encoding")
+ if(H5O_msg_encode(f, type_id, encoding_buf, mesg) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "can't encode message to be shared")
/* Open the fractal heap for this index */
- if(NULL == (fheap=H5HF_open(f, dxpl_id, header->heap_addr)))
+ if(NULL == (fheap = H5HF_open(f, dxpl_id, header->heap_addr)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
/* Set up a key for the message to be written */
@@ -660,7 +663,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
/* JAMES: not very effecient (gets hash value twice, searches list twice). Refactor. */
/* See if the message is already in the index and get its location */
/* JAMES: should return a pointer to the message */
- list_pos=H5SM_find_in_list(f, list, &key);
+ list_pos = H5SM_find_in_list(f, list, &key);
if(list_pos != UFAIL)
{
/* The message was in the index. Increment its reference count. */
@@ -678,9 +681,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
/* If this returns failure, it means that the message wasn't found. */
/* If it succeeds, the heap_id in the shared struct will be set */
if(H5B2_modify(f, dxpl_id, H5SM_INDEX, header->index_addr, &key, H5SM_incr_ref, &shared.u.heap_id) >= 0)
- {
found = TRUE;
- }
}
/* If the message isn't in the list, add it */
@@ -692,7 +693,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
/* JAMES: wrap this in a function call? */
/* Encode the message and get its size */ /* JAMES: already have this */
- if((mesg_size = H5O_raw_size(type_id, f, mesg)) == 0)
+ if((mesg_size = H5O_msg_raw_size(f, type_id, mesg)) == 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unable to get size of message")
/* JAMES: fix memory problem */
@@ -772,14 +773,13 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header,
}
/* Change the original message passed in to reflect that it's now shared */
- if(H5O_set_share(f, &shared, type_id, mesg) < 0)
+ if(H5O_msg_set_share(type_id, &shared, mesg) < 0)
HGOTO_ERROR (H5E_OHDR, H5E_BADMESG, FAIL, "unable to set sharing information")
done:
/* Release the fractal heap if we opened it */
- if(fheap)
- if(H5HF_close(fheap, dxpl_id) < 0)
- HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+ if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+ HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
/* If we got a list out of the cache, release it (it is always dirty after writing a message) */
if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
@@ -789,8 +789,7 @@ done:
H5MM_free(encoding_buf);
FUNC_LEAVE_NOAPI(ret_value)
-}
-
+} /* end H5SM_write_mesg() */
/*-------------------------------------------------------------------------
@@ -814,6 +813,7 @@ H5SM_try_delete(H5F_t *f, hid_t dxpl_id, unsigned type_id, const H5O_shared_t *s
unsigned cache_flags = H5AC__NO_FLAGS_SET;
ssize_t index_num;
herr_t ret_value = SUCCEED;
+
FUNC_ENTER_NOAPI(H5SM_try_delete, FAIL)
HDassert(f);
@@ -826,7 +826,7 @@ H5SM_try_delete(H5F_t *f, hid_t dxpl_id, unsigned type_id, const H5O_shared_t *s
HDassert(f->shared->sohm_addr != HADDR_UNDEF);
/* Look up the master SOHM table */
- if (NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
+ if(NULL == (table = H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
/* Find the correct index and try to delete from it */
@@ -839,11 +839,11 @@ H5SM_try_delete(H5F_t *f, hid_t dxpl_id, unsigned type_id, const H5O_shared_t *s
done:
/* Release the master SOHM table */
- if (table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, table, cache_flags) < 0)
+ if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, table, cache_flags) < 0)
HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table")
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5SM_try_delete() */
/*-------------------------------------------------------------------------
@@ -871,7 +871,7 @@ H5SM_find_in_list(H5F_t *f, H5SM_list_t *list, const H5SM_mesg_key_t *key)
HDassert(list);
HDassert(key);
- for(x=0; x<list->header->list_to_btree; x++)
+ for(x = 0; x < list->header->list_to_btree; x++)
{
if(0 == H5SM_message_compare(key, &(list->messages[x])))
{
@@ -909,6 +909,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header, uns
hsize_t list_pos; /* Position of the message in the list */
H5HF_t *fheap=NULL; /* Fractal heap that contains the message */
herr_t ret_value = SUCCEED;
+
FUNC_ENTER_NOAPI(H5SM_delete_from_index, FAIL)
HDassert(header);
@@ -926,8 +927,8 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header, uns
HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get message size from fractal heap.")
/* Allocate a buffer to hold the message */
- if(NULL == (buf = HDmalloc(buf_size)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "couldn't allocate memory");
+ if(NULL == (buf = H5MM_malloc(buf_size)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "couldn't allocate memory")
/* Read the message to get its hash value */
if(H5HF_read(fheap, dxpl_id, &(mesg->u.heap_id), buf) < 0)
@@ -953,6 +954,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header, uns
HGOTO_ERROR(H5E_SOHM, H5E_NOTFOUND, FAIL, "message not in index")
--(list->messages[list_pos].ref_count);
+
/* Copy the message */
message = list->messages[list_pos];
}
@@ -1016,7 +1018,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header, uns
HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create shared message list")
HDassert(NULL == list);
- if (NULL == (list = H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
+ if(NULL == (list = H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, NULL, header, H5AC_WRITE)))
HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
/* Delete the B-tree and have messages copy themselves to the
@@ -1024,25 +1026,24 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5SM_index_header_t *header, uns
*/
if(H5B2_delete(f, dxpl_id, H5SM_INDEX, temp_header.index_addr, H5SM_convert_to_list_op, list) < 0)
HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete B-tree")
- }
- }
+ } /* end if */
+ } /* end if */
done:
/* Free the message buffer */
if(buf)
- HDfree(buf);
+ H5MM_xfree(buf);
/* Release the SOHM list */
- if (list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
+ if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
/* Release the fractal heap if we opened it */
- if(fheap)
- if(H5HF_close(fheap, dxpl_id) < 0)
- HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
+ if(fheap && H5HF_close(fheap, dxpl_id) < 0)
+ HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap")
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5SM_delete_from_index() */
/*-------------------------------------------------------------------------
@@ -1058,13 +1059,15 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5SM_get_info(H5F_t *f, unsigned *index_flags, unsigned *minsizes,
- size_t *list_to_btree, size_t *btree_to_list, hid_t dxpl_id)
+herr_t
+H5SM_get_info(H5F_t *f, unsigned *index_flags, unsigned *minsizes,
+ size_t *list_to_btree, size_t *btree_to_list, hid_t dxpl_id)
{
H5SM_master_table_t *table = NULL;
haddr_t table_addr;
uint8_t i;
herr_t ret_value = SUCCEED;
+
FUNC_ENTER_NOAPI(H5SM_get_info, FAIL)
HDassert(f);
@@ -1102,5 +1105,5 @@ done:
HGOTO_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table")
FUNC_LEAVE_NOAPI(ret_value)
-}
-
+} /* end H5SM_get_info() */
+
diff --git a/src/H5T.c b/src/H5T.c
index 76619b1..08cdc7e 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -2843,7 +2843,7 @@ H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "can't allocate fake file struct")
/* Find out the size of buffer needed */
- if((buf_size = H5O_raw_size(H5O_DTYPE_ID, f, obj)) == 0)
+ if((buf_size = H5O_msg_raw_size(f, H5O_DTYPE_ID, obj)) == 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "can't find datatype size")
/* Don't encode if buffer size isn't big enough or buffer is empty */
@@ -2857,7 +2857,7 @@ H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
*buf++ = H5T_ENCODE_VERSION;
/* Encode into user's buffer */
- if(H5O_encode(f, buf, obj, H5O_DTYPE_ID) < 0)
+ if(H5O_msg_encode(f, H5O_DTYPE_ID, buf, obj) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode object")
} /* end else */
@@ -2907,7 +2907,7 @@ H5T_decode(const unsigned char *buf)
HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, NULL, "unknown version of encoded datatype")
/* Decode the serialized datatype message */
- if((ret_value = H5O_decode(f, H5AC_dxpl_id, buf, H5O_DTYPE_ID)) == NULL)
+ if((ret_value = H5O_msg_decode(f, H5AC_dxpl_id, H5O_DTYPE_ID, buf)) == NULL)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode object")
done:
diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c
index 1417638..2c1cf5b 100644
--- a/src/H5Tcommit.c
+++ b/src/H5Tcommit.c
@@ -272,7 +272,7 @@ H5T_commit(H5F_t *file, H5T_t *type, hid_t dxpl_id, hid_t tcpl_id, hid_t UNUSED
loc_init = TRUE;
/* Calculate message size infomation, for creating object header */
- dtype_size = H5O_mesg_size(H5O_DTYPE_ID, file, type, (size_t)0);
+ dtype_size = H5O_msg_mesg_size(file, H5O_DTYPE_ID, type, (size_t)0);
HDassert(dtype_size);
/*
diff --git a/src/H5Toh.c b/src/H5Toh.c
index 2137a8a..f6854e9 100644
--- a/src/H5Toh.c
+++ b/src/H5Toh.c
@@ -98,7 +98,7 @@ H5O_dtype_isa(struct H5O_t *oh)
HDassert(oh);
- if((ret_value = H5O_exists_oh(oh, H5O_DTYPE_ID, 0)) < 0)
+ if((ret_value = H5O_msg_exists_oh(oh, H5O_DTYPE_ID, 0)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to read object header")
done:
diff --git a/test/ohdr.c b/test/ohdr.c
index 366da04..67d07a6 100644
--- a/test/ohdr.c
+++ b/test/ohdr.c
@@ -251,12 +251,12 @@ main(void)
* Delete all time messages.
*/
TESTING("message deletion");
- if (H5O_remove(&oh_loc, H5O_MTIME_NEW_ID, H5O_ALL, TRUE, H5P_DATASET_XFER_DEFAULT)<0) {
+ if (H5O_msg_remove(&oh_loc, H5O_MTIME_NEW_ID, H5O_ALL, TRUE, H5P_DATASET_XFER_DEFAULT)<0) {
H5_FAILED();
H5Eprint_stack(H5E_DEFAULT, stdout);
goto error;
}
- if (H5O_remove(&oh_loc, H5O_MTIME_ID, H5O_ALL, TRUE, H5P_DATASET_XFER_DEFAULT)<0) {
+ if (H5O_msg_remove(&oh_loc, H5O_MTIME_ID, H5O_ALL, TRUE, H5P_DATASET_XFER_DEFAULT)<0) {
H5_FAILED();
H5Eprint_stack(H5E_DEFAULT, stdout);
goto error;