summaryrefslogtreecommitdiffstats
path: root/src/H5Gnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Gnode.c')
-rw-r--r--src/H5Gnode.c177
1 files changed, 93 insertions, 84 deletions
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index f578783..1ec6daf 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -44,31 +44,32 @@ static herr_t H5G_node_decode_key (H5F_t *f, H5B_t *bt, uint8 *raw,
static herr_t H5G_node_encode_key (H5F_t *f, H5B_t *bt, uint8 *raw,
void *_key);
static size_t H5G_node_size (H5F_t *f);
-static haddr_t H5G_node_new (H5F_t *f, H5B_ins_t op, void *_lt_key,
- void *_udata, void *_rt_key);
-static herr_t H5G_node_flush (H5F_t *f, hbool_t destroy, haddr_t addr,
+static herr_t H5G_node_new (H5F_t *f, H5B_ins_t op, void *_lt_key,
+ void *_udata, void *_rt_key, haddr_t *addr/*out*/);
+static herr_t H5G_node_flush (H5F_t *f, hbool_t destroy, const haddr_t *addr,
H5G_node_t *sym);
-static H5G_node_t *H5G_node_load (H5F_t *f, haddr_t addr, const void *_udata1,
- void *_udata2);
+static H5G_node_t *H5G_node_load (H5F_t *f, const haddr_t *addr,
+ const void *_udata1, void *_udata2);
static intn H5G_node_cmp2 (H5F_t *f, void *_lt_key, void *_udata,
void *_rt_key);
static intn H5G_node_cmp3 (H5F_t *f, void *_lt_key, void *_udata,
void *_rt_key);
-static herr_t H5G_node_found (H5F_t *f, haddr_t addr,
+static herr_t H5G_node_found (H5F_t *f, const haddr_t *addr,
const void *_lt_key, void *_udata,
const void *_rt_key);
-static haddr_t H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
- void *_lt_key, hbool_t *lt_key_changed,
- void *_md_key, void *_udata,
- void *_rt_key, hbool_t *rt_key_changed);
-static herr_t H5G_node_list (H5F_t *f, haddr_t addr, void *_udata);
+static H5B_ins_t H5G_node_insert (H5F_t *f, const haddr_t *addr,
+ void *_lt_key, hbool_t *lt_key_changed,
+ void *_md_key, void *_udata,
+ void *_rt_key, hbool_t *rt_key_changed,
+ haddr_t *new_node/*out*/);
+static herr_t H5G_node_list (H5F_t *f, const haddr_t *addr, void *_udata);
static size_t H5G_node_sizeof_rkey (H5F_t *f, const void *_udata);
/* H5G inherits cache-like properties from H5AC */
const H5AC_class_t H5AC_SNODE[1] = {{
H5AC_SNODE_ID,
- (void*(*)(H5F_t*,haddr_t,const void*,void*))H5G_node_load,
- (herr_t(*)(H5F_t*,hbool_t,haddr_t,void*))H5G_node_flush,
+ (void*(*)(H5F_t*,const haddr_t*,const void*,void*))H5G_node_load,
+ (herr_t(*)(H5F_t*,hbool_t,const haddr_t*,void*))H5G_node_flush,
}};
/* H5G inherits B-tree like properties from H5B */
@@ -113,7 +114,7 @@ static intn interface_initialize_g = FALSE;
static size_t
H5G_node_sizeof_rkey (H5F_t *f, const void *udata __attribute__((unused)))
{
- return H5F_SIZEOF_OFFSET(f);
+ return H5F_SIZEOF_SIZE(f); /*the name offset*/
}
@@ -145,7 +146,7 @@ H5G_node_decode_key (H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
assert (raw);
assert (key);
- H5F_decode_offset (f, raw, key->offset);
+ H5F_decode_length (f, raw, key->offset);
FUNC_LEAVE (SUCCEED);
}
@@ -179,7 +180,7 @@ H5G_node_encode_key (H5F_t *f, H5B_t *bt, uint8 *raw, void *_key)
assert (raw);
assert (key);
- H5F_encode_offset (f, raw, key->offset);
+ H5F_encode_length (f, raw, key->offset);
FUNC_LEAVE (SUCCEED);
}
@@ -218,7 +219,8 @@ H5G_node_size (H5F_t *f)
* also called internally to split a symbol node with
* LT_KEY and RT_KEY null pointers.
*
- * Return: Success: Address of symbol table node.
+ * Return: Success: SUCCEED. The address of symbol table node is
+ * returned through the ADDR argument.
*
* Failure: FAIL
*
@@ -230,15 +232,15 @@ H5G_node_size (H5F_t *f)
*
*-------------------------------------------------------------------------
*/
-static haddr_t
+static herr_t
H5G_node_new (H5F_t *f, H5B_ins_t op,
- void *_lt_key, void *_udata, void *_rt_key)
+ void *_lt_key, void *_udata, void *_rt_key,
+ haddr_t *addr/*out*/)
{
H5G_node_key_t *lt_key = (H5G_node_key_t*)_lt_key;
H5G_node_key_t *rt_key = (H5G_node_key_t*)_rt_key;
H5G_node_t *sym = NULL;
size_t size = 0;
- haddr_t addr;
FUNC_ENTER (H5G_node_new, NULL, FAIL);
@@ -250,7 +252,7 @@ H5G_node_new (H5F_t *f, H5B_ins_t op,
sym = H5MM_xcalloc (1, sizeof(H5G_node_t));
size = H5G_node_size (f);
- if ((addr = H5MF_alloc (f, size))<0) {
+ if (H5MF_alloc (f, H5MF_META, size, addr/*out*/)<0) {
H5MM_xfree (sym);
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL);
}
@@ -272,7 +274,7 @@ H5G_node_new (H5F_t *f, H5B_ins_t op,
if (lt_key) lt_key->offset = 0;
if (rt_key) rt_key->offset = 0;
- FUNC_LEAVE (addr);
+ FUNC_LEAVE (SUCCEED);
}
@@ -297,7 +299,8 @@ H5G_node_new (H5F_t *f, H5B_ins_t op,
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_flush (H5F_t *f, hbool_t destroy, haddr_t addr, H5G_node_t *sym)
+H5G_node_flush (H5F_t *f, hbool_t destroy, const haddr_t *addr,
+ H5G_node_t *sym)
{
uint8 *buf=NULL, *p=NULL;
size_t size;
@@ -310,7 +313,7 @@ H5G_node_flush (H5F_t *f, hbool_t destroy, haddr_t addr, H5G_node_t *sym)
* Check arguments.
*/
assert (f);
- assert (addr>=0);
+ assert (addr && H5F_addr_defined (addr));
assert (sym);
/*
@@ -389,11 +392,13 @@ H5G_node_flush (H5F_t *f, hbool_t destroy, haddr_t addr, H5G_node_t *sym)
*-------------------------------------------------------------------------
*/
static H5G_node_t *
-H5G_node_load (H5F_t *f, haddr_t addr, const void *_udata1, void *_udata2)
+H5G_node_load (H5F_t *f, const haddr_t *addr, const void *_udata1,
+ void *_udata2)
{
H5G_node_t *sym = NULL;
size_t size = 0;
- uint8 *buf = NULL, *p = NULL;
+ uint8 *buf = NULL;
+ const uint8 *p = NULL;
const H5G_ac_ud1_t *ac_udata = (const H5G_ac_ud1_t*)_udata1;
H5G_node_t *ret_value = NULL; /*for error handling*/
@@ -403,7 +408,7 @@ H5G_node_load (H5F_t *f, haddr_t addr, const void *_udata1, void *_udata2)
* Check arguments.
*/
assert (f);
- assert (addr>=0);
+ assert (addr && H5F_addr_defined (addr));
assert (ac_udata);
assert (NULL==_udata2);
@@ -411,7 +416,7 @@ H5G_node_load (H5F_t *f, haddr_t addr, const void *_udata1, void *_udata2)
* Initialize variables.
*/
size = H5G_node_size (f);
- buf = p = H5MM_xmalloc (size);
+ p = buf = H5MM_xmalloc (size);
sym = H5MM_xcalloc (1, sizeof(H5G_node_t));
sym->entry = H5MM_xcalloc (2*H5G_NODE_K(f), sizeof(H5G_entry_t));
@@ -500,10 +505,10 @@ H5G_node_cmp2 (H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
assert (lt_key);
assert (rt_key);
- if (NULL==(s1=H5H_peek (f, udata->heap_addr, lt_key->offset))) {
+ if (NULL==(s1=H5H_peek (f, &(udata->heap_addr), lt_key->offset))) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
- if (NULL==(s2=H5H_peek (f, udata->heap_addr, rt_key->offset))) {
+ if (NULL==(s2=H5H_peek (f, &(udata->heap_addr), rt_key->offset))) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
@@ -551,13 +556,13 @@ H5G_node_cmp3 (H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
FUNC_ENTER (H5G_node_cmp3, NULL, FAIL);
/* left side */
- if (NULL==(s=H5H_peek (f, udata->heap_addr, lt_key->offset))) {
+ if (NULL==(s=H5H_peek (f, &(udata->heap_addr), lt_key->offset))) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
if (HDstrcmp (udata->name, s)<=0) HRETURN (-1);
/* right side */
- if (NULL==(s=H5H_peek (f, udata->heap_addr, rt_key->offset))) {
+ if (NULL==(s=H5H_peek (f, &(udata->heap_addr), rt_key->offset))) {
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
if (HDstrcmp (udata->name, s)>0) HRETURN(1);
@@ -595,7 +600,7 @@ H5G_node_cmp3 (H5F_t *f, void *_lt_key, void *_udata, void *_rt_key)
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_found (H5F_t *f, haddr_t addr, const void *_lt_key,
+H5G_node_found (H5F_t *f, const haddr_t *addr, const void *_lt_key,
void *_udata, const void *_rt_key)
{
H5G_bt_ud1_t *bt_udata = (H5G_bt_ud1_t *)_udata;
@@ -611,7 +616,7 @@ H5G_node_found (H5F_t *f, haddr_t addr, const void *_lt_key,
* Check arguments.
*/
assert (f);
- assert (addr>=0);
+ assert (addr && H5F_addr_defined (addr));
assert (bt_udata);
ac_udata.grp_addr = bt_udata->grp_addr;
@@ -630,7 +635,7 @@ H5G_node_found (H5F_t *f, haddr_t addr, const void *_lt_key,
rt = sn->nsyms;
while (lt<rt && cmp) {
idx = (lt + rt) / 2;
- if (NULL==(s=H5H_peek (f, bt_udata->heap_addr,
+ if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
sn->entry[idx].name_off))) {
HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
@@ -652,7 +657,7 @@ H5G_node_found (H5F_t *f, haddr_t addr, const void *_lt_key,
*/
H5G_shadow_sync (sn->entry+idx);
bt_udata->entry_ptr = sn->entry+idx;
- bt_udata->node_addr = addr;
+ bt_udata->node_addr = *addr;
bt_udata->node_ptr = sn;
break;
@@ -696,15 +701,15 @@ done:
* If the new key is larger than RIGHT then update RIGHT
* with the new key.
*
- * Return: Success: Address of new node if the node was
- * split. MID has been initialized with
- * the high key of the left node, RIGHT
- * has the high key of the right node.
+ * Return: Success: An insertion command for the caller, one of
+ * the H5B_INS_* constants. The address of the
+ * new node, if any, is returned through the
+ * NEW_NODE argument. NEW_NODE might not be
+ * initialized if the return value is
+ * H5B_INS_NOOP.
*
- * Zero if the node didn't split. RIGHT has the
- * high key of the right node.
- *
- * Failure: -1
+ * Failure: H5B_INS_ERROR, NEW_NODE might not be
+ * initialized.
*
* Programmer: Robb Matzke
* matzke@llnl.gov
@@ -718,11 +723,12 @@ done:
*
*-------------------------------------------------------------------------
*/
-static haddr_t
-H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
+static H5B_ins_t
+H5G_node_insert (H5F_t *f, const haddr_t *addr,
void *_lt_key, hbool_t *lt_key_changed,
void *_md_key, void *_udata,
- void *_rt_key, hbool_t *rt_key_changed)
+ void *_rt_key, hbool_t *rt_key_changed,
+ haddr_t *new_node)
{
H5G_node_key_t *md_key = (H5G_node_key_t *)_md_key;
H5G_node_key_t *rt_key = (H5G_node_key_t *)_rt_key;
@@ -730,28 +736,30 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
H5G_ac_ud1_t ac_udata;
H5G_node_t *sn=NULL, *snrt=NULL;
- haddr_t new_node=0, offset;
+ size_t offset; /*offset of name in heap*/
const char *s;
intn idx=-1, cmp=1;
intn lt=0, rt; /*binary search cntrs */
intn i;
- haddr_t ret_value = FAIL;
+ H5B_ins_t ret_value = H5B_INS_ERROR;
H5G_shadow_t *shadow = NULL;
H5G_node_t *insert_into=NULL; /*node that gets new entry*/
- haddr_t insert_addr=-1; /*address of that node */
+ haddr_t insert_addr; /*address of that node */
- FUNC_ENTER (H5G_node_insert, NULL, FAIL);
+ FUNC_ENTER (H5G_node_insert, NULL, H5B_INS_ERROR);
/*
* Check arguments.
*/
assert (f);
- assert (addr>=0);
- assert (anchor);
+ assert (addr && H5F_addr_defined (addr));
assert (md_key);
assert (rt_key);
assert (bt_udata);
- bt_udata->node_addr = -1;
+ assert (new_node);
+
+ /* Init return value */
+ H5F_addr_undef (&(bt_udata->node_addr));
bt_udata->node_ptr = NULL;
bt_udata->entry_ptr = NULL;
@@ -761,7 +769,7 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
ac_udata.grp_addr = bt_udata->grp_addr;
ac_udata.heap_addr = bt_udata->heap_addr;
if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, addr, &ac_udata, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL);
+ HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR);
}
/*
@@ -770,12 +778,13 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
rt = sn->nsyms;
while (lt<rt) {
idx = (lt + rt) / 2;
- if (NULL==(s=H5H_peek (f, bt_udata->heap_addr,
+ if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
sn->entry[idx].name_off))) {
- HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
+ HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, H5B_INS_ERROR);
}
if (0==(cmp=HDstrcmp (bt_udata->name, s))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL); /*already present*/
+ /*already present*/
+ HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR);
}
if (cmp<0) {
rt = idx;
@@ -790,10 +799,10 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
* heap address changed and update the symbol table object header
* with the new heap address.
*/
- offset = H5H_insert (f, bt_udata->heap_addr, HDstrlen(bt_udata->name)+1,
+ offset = H5H_insert (f, &(bt_udata->heap_addr), HDstrlen(bt_udata->name)+1,
bt_udata->name);
bt_udata->entry.name_off = offset;
- if (offset<0) HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL);
+ if (offset<=0) HGOTO_ERROR (H5E_SYM, H5E_CANTINSERT, H5B_INS_ERROR);
if (sn->nsyms>=2*H5G_NODE_K(f)) {
/*
@@ -801,14 +810,15 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
* node and return the address of the new right node (the
* left node is at the same address as the original node).
*/
- *anchor = H5B_INS_RIGHT;
+ ret_value = H5B_INS_RIGHT;
/* The right node */
- if ((new_node = H5G_node_new (f, H5B_INS_FIRST, NULL, NULL, NULL))<0) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTINIT, FAIL);
+ if (H5G_node_new (f, H5B_INS_FIRST, NULL, NULL, NULL,
+ new_node/*out*/)<0) {
+ HGOTO_ERROR (H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR);
}
if (NULL==(snrt=H5AC_find (f, H5AC_SNODE, new_node, &ac_udata, NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL);
+ HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR);
}
HDmemcpy (snrt->entry, sn->entry + H5G_NODE_K(f),
H5G_NODE_K(f) * sizeof(H5G_entry_t));
@@ -834,26 +844,24 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
/* Where to insert the new entry? */
if (idx<=H5G_NODE_K(f)) {
insert_into = sn;
- insert_addr = addr;
+ insert_addr = *addr;
if (idx==H5G_NODE_K(f)) md_key->offset = offset;
} else {
idx -= H5G_NODE_K (f);
insert_into = snrt;
- insert_addr = new_node;
+ insert_addr = *new_node;
}
- ret_value = new_node;
} else {
/* Where to insert the new entry? */
- *anchor = H5B_INS_NOOP;
+ ret_value = H5B_INS_NOOP;
sn->dirty = TRUE;
insert_into = sn;
- insert_addr = addr;
+ insert_addr = *addr;
if (idx==sn->nsyms) {
rt_key->offset = offset;
*rt_key_changed = TRUE;
}
- ret_value = 0;
}
/* Adjust shadows */
@@ -866,7 +874,7 @@ H5G_node_insert (H5F_t *f, haddr_t addr, H5B_ins_t *anchor,
H5G_shadow_move (f, bt_udata->entry.shadow,
bt_udata->name,
insert_into->entry + idx,
- bt_udata->grp_addr);
+ &(bt_udata->grp_addr));
}
/* Move entries */
@@ -887,16 +895,16 @@ done:
if (ret_value<0) {
/* failing... */
if (sn && H5AC_unprotect (f, H5AC_SNODE, addr, sn)<0) {
- HRETURN_ERROR (H5E_SYM, H5E_PROTECT, FAIL);
+ HRETURN_ERROR (H5E_SYM, H5E_PROTECT, H5B_INS_ERROR);
}
} else if (insert_into!=sn) {
/* unprotect the first node and protect the return value */
if (H5AC_unprotect (f, H5AC_SNODE, addr, sn)<0) {
- HRETURN_ERROR (H5E_SYM, H5E_PROTECT, FAIL);
+ HRETURN_ERROR (H5E_SYM, H5E_PROTECT, H5B_INS_ERROR);
}
- if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, insert_addr, &ac_udata,
+ if (NULL==(sn=H5AC_protect (f, H5AC_SNODE, &insert_addr, &ac_udata,
NULL))) {
- HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, FAIL);
+ HGOTO_ERROR (H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR);
}
bt_udata->node_ptr = sn;
bt_udata->entry_ptr = sn->entry + idx;
@@ -927,7 +935,7 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5G_node_list (H5F_t *f, haddr_t addr, void *_udata)
+H5G_node_list (H5F_t *f, const haddr_t *addr, void *_udata)
{
H5G_bt_ud2_t *bt_udata = (H5G_bt_ud2_t *)_udata;
H5G_node_t *sn = NULL;
@@ -942,7 +950,7 @@ H5G_node_list (H5F_t *f, haddr_t addr, void *_udata)
* Check arguments.
*/
assert (f);
- assert (addr>=0);
+ assert (addr && H5F_addr_defined (addr));
assert (bt_udata);
ac_udata.grp_addr = bt_udata->grp_addr;
@@ -972,7 +980,7 @@ H5G_node_list (H5F_t *f, haddr_t addr, void *_udata)
}
if (bt_udata->name) {
for (i=0; i<sn->nsyms && bt_udata->nsyms+i<bt_udata->maxentries; i++) {
- if (NULL==(s=H5H_peek (f, bt_udata->heap_addr,
+ if (NULL==(s=H5H_peek (f, &(bt_udata->heap_addr),
sn->entry[i].name_off))) {
HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL);
}
@@ -1013,8 +1021,8 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5G_node_debug (H5F_t *f, haddr_t addr, FILE *stream, intn indent,
- intn fwidth, haddr_t heap)
+H5G_node_debug (H5F_t *f, const haddr_t *addr, FILE *stream, intn indent,
+ intn fwidth, const haddr_t *heap)
{
int i, acc;
H5G_node_t *sn = NULL;
@@ -1028,7 +1036,7 @@ H5G_node_debug (H5F_t *f, haddr_t addr, FILE *stream, intn indent,
* Check arguments.
*/
assert (f);
- assert (addr>=0);
+ assert (addr && H5F_addr_defined (addr));
assert (stream);
assert (indent>=0);
assert (fwidth>=0);
@@ -1042,8 +1050,8 @@ H5G_node_debug (H5F_t *f, haddr_t addr, FILE *stream, intn indent,
* cache when we're done so if some later caller knows the header address
* they'll be able to access the open objects.
*/
- ac_udata.grp_addr = -1;
- ac_udata.heap_addr = heap;
+ H5F_addr_undef (&(ac_udata.grp_addr));
+ ac_udata.heap_addr = *heap;
/*
* If we couldn't load the symbol table node, then try loading the
@@ -1075,7 +1083,8 @@ H5G_node_debug (H5F_t *f, haddr_t addr, FILE *stream, intn indent,
fwidth = MAX (0, fwidth-3);
for (i=0; i<sn->nsyms; i++) {
fprintf (stream, "%*sSymbol %d:\n", indent-3, "", i);
- if (heap>0 && (s = H5H_peek (f, heap, sn->entry[i].name_off))) {
+ if (H5F_addr_defined (heap) &&
+ (s = H5H_peek (f, heap, sn->entry[i].name_off))) {
fprintf (stream, "%*s%-*s `%s'\n", indent, "", fwidth,
"Name:",
s);