summaryrefslogtreecommitdiffstats
path: root/src/H5Distore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Distore.c')
-rw-r--r--src/H5Distore.c85
1 files changed, 43 insertions, 42 deletions
diff --git a/src/H5Distore.c b/src/H5Distore.c
index c86b45c..36e3cb7 100644
--- a/src/H5Distore.c
+++ b/src/H5Distore.c
@@ -133,7 +133,7 @@ typedef struct H5D_istore_key_t {
typedef struct H5D_istore_ud1_t {
H5D_istore_key_t key; /*key values */
haddr_t addr; /*file address of chunk */
- H5O_layout_t mesg; /*layout message */
+ const H5O_layout_t *mesg; /*layout message */
hsize_t total_storage; /*output from iterator */
FILE *stream; /*debug output stream */
hsize_t *dims; /*dataset dimensions */
@@ -238,11 +238,11 @@ H5D_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata)
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_sizeof_rkey);
assert(udata);
- assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+ assert(udata->mesg->u.chunk.ndims > 0 && udata->mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
nbytes = 4 + /*storage size */
4 + /*filter mask */
- udata->mesg.u.chunk.ndims*8; /*dimension indices */
+ udata->mesg->u.chunk.ndims*8; /*dimension indices */
FUNC_LEAVE_NOAPI(nbytes);
} /* end H5D_istore_sizeof_rkey() */
@@ -360,7 +360,7 @@ H5D_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int i
"Filter mask:", key->filter_mask);
HDfprintf(stream, "%*s%-*s {", indent, "", fwidth,
"Logical offset:");
- for (u=0; u<udata->mesg.u.chunk.ndims; u++)
+ for (u=0; u<udata->mesg->u.chunk.ndims; u++)
HDfprintf (stream, "%s%Hd", u?", ":"", key->offset[u]);
HDfputs ("}\n", stream);
@@ -403,10 +403,10 @@ H5D_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda
assert(lt_key);
assert(rt_key);
assert(udata);
- assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+ assert(udata->mesg->u.chunk.ndims > 0 && udata->mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
/* Compare the offsets but ignore the other fields */
- ret_value = H5V_vector_cmp_s(udata->mesg.u.chunk.ndims, lt_key->offset, rt_key->offset);
+ ret_value = H5V_vector_cmp_s(udata->mesg->u.chunk.ndims, lt_key->offset, rt_key->offset);
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5D_istore_cmp2() */
@@ -455,12 +455,12 @@ H5D_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda
assert(lt_key);
assert(rt_key);
assert(udata);
- assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+ assert(udata->mesg->u.chunk.ndims > 0 && udata->mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
- if (H5V_vector_lt_s(udata->mesg.u.chunk.ndims, udata->key.offset,
+ if (H5V_vector_lt_s(udata->mesg->u.chunk.ndims, udata->key.offset,
lt_key->offset)) {
ret_value = -1;
- } else if (H5V_vector_ge_s(udata->mesg.u.chunk.ndims, udata->key.offset,
+ } else if (H5V_vector_ge_s(udata->mesg->u.chunk.ndims, udata->key.offset,
rt_key->offset)) {
ret_value = 1;
}
@@ -507,7 +507,7 @@ H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
assert(lt_key);
assert(rt_key);
assert(udata);
- assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims < H5O_LAYOUT_NDIMS);
+ assert(udata->mesg->u.chunk.ndims > 0 && udata->mesg->u.chunk.ndims < H5O_LAYOUT_NDIMS);
assert(addr_p);
/* Allocate new storage */
@@ -523,7 +523,7 @@ H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
*/
lt_key->nbytes = udata->key.nbytes;
lt_key->filter_mask = udata->key.filter_mask;
- for (u=0; u<udata->mesg.u.chunk.ndims; u++)
+ for (u=0; u<udata->mesg->u.chunk.ndims; u++)
lt_key->offset[u] = udata->key.offset[u];
/*
@@ -533,11 +533,11 @@ H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
if (H5B_INS_LEFT != op) {
rt_key->nbytes = 0;
rt_key->filter_mask = 0;
- for (u=0; u<udata->mesg.u.chunk.ndims; u++) {
- assert (udata->key.offset[u]+(hssize_t)(udata->mesg.u.chunk.dim[u]) >
+ for (u=0; u<udata->mesg->u.chunk.ndims; u++) {
+ assert (udata->key.offset[u]+(hssize_t)(udata->mesg->u.chunk.dim[u]) >
udata->key.offset[u]);
rt_key->offset[u] = udata->key.offset[u] +
- (hssize_t)(udata->mesg.u.chunk.dim[u]);
+ (hssize_t)(udata->mesg->u.chunk.dim[u]);
}
}
@@ -591,8 +591,8 @@ H5D_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void
assert(lt_key);
/* Is this *really* the requested chunk? */
- for (u=0; u<udata->mesg.u.chunk.ndims; u++) {
- if (udata->key.offset[u] >= lt_key->offset[u]+(hssize_t)(udata->mesg.u.chunk.dim[u]))
+ for (u=0; u<udata->mesg->u.chunk.ndims; u++) {
+ if (udata->key.offset[u] >= lt_key->offset[u]+(hssize_t)(udata->mesg->u.chunk.dim[u]))
HGOTO_DONE(FAIL);
}
@@ -601,7 +601,7 @@ H5D_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void
udata->key.nbytes = lt_key->nbytes;
udata->key.filter_mask = lt_key->filter_mask;
assert (lt_key->nbytes>0);
- for (u = 0; u < udata->mesg.u.chunk.ndims; u++)
+ for (u = 0; u < udata->mesg->u.chunk.ndims; u++)
udata->key.offset[u] = lt_key->offset[u];
done:
@@ -677,7 +677,7 @@ H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
assert("HDF5 INTERNAL ERROR -- see rpm" && 0);
HGOTO_ERROR(H5E_STORAGE, H5E_UNSUPPORTED, H5B_INS_ERROR, "internal error");
- } else if (H5V_vector_eq_s (udata->mesg.u.chunk.ndims,
+ } else if (H5V_vector_eq_s (udata->mesg->u.chunk.ndims,
udata->key.offset, lt_key->offset) &&
lt_key->nbytes>0) {
/*
@@ -716,20 +716,20 @@ H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
ret_value = H5B_INS_NOOP;
}
- } else if (H5V_hyper_disjointp(udata->mesg.u.chunk.ndims,
- lt_key->offset, udata->mesg.u.chunk.dim,
- udata->key.offset, udata->mesg.u.chunk.dim)) {
- assert(H5V_hyper_disjointp(udata->mesg.u.chunk.ndims,
- rt_key->offset, udata->mesg.u.chunk.dim,
- udata->key.offset, udata->mesg.u.chunk.dim));
+ } else if (H5V_hyper_disjointp(udata->mesg->u.chunk.ndims,
+ lt_key->offset, udata->mesg->u.chunk.dim,
+ udata->key.offset, udata->mesg->u.chunk.dim)) {
+ assert(H5V_hyper_disjointp(udata->mesg->u.chunk.ndims,
+ rt_key->offset, udata->mesg->u.chunk.dim,
+ udata->key.offset, udata->mesg->u.chunk.dim));
/*
* Split this node, inserting the new new node to the right of the
* current node. The MD_KEY is where the split occurs.
*/
md_key->nbytes = udata->key.nbytes;
md_key->filter_mask = udata->key.filter_mask;
- for (u=0; u<udata->mesg.u.chunk.ndims; u++) {
- assert(0 == udata->key.offset[u] % udata->mesg.u.chunk.dim[u]);
+ for (u=0; u<udata->mesg->u.chunk.ndims; u++) {
+ assert(0 == udata->key.offset[u] % udata->mesg->u.chunk.dim[u]);
md_key->offset[u] = udata->key.offset[u];
}
@@ -828,7 +828,7 @@ H5D_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, hadd
}
HDfprintf(bt_udata->stream, " 0x%08x %8Zu %10a [",
lt_key->filter_mask, lt_key->nbytes, addr);
- for (u=0; u<bt_udata->mesg.u.chunk.ndims; u++)
+ for (u=0; u<bt_udata->mesg->u.chunk.ndims; u++)
HDfprintf(bt_udata->stream, "%s%Hd", u?", ":"", lt_key->offset[u]);
HDfputs("]\n", bt_udata->stream);
@@ -914,7 +914,7 @@ H5D_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache,
if (ent->dirty) {
H5D_istore_ud1_t udata; /*pass through B-tree */
- udata.mesg = dset->layout;
+ udata.mesg = &dset->layout;
udata.key.filter_mask = 0;
udata.addr = HADDR_UNDEF;
udata.key.nbytes = ent->chunk_size;
@@ -1919,7 +1919,7 @@ H5D_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ )
assert(layout->u.chunk.dim[u] > 0);
#endif
- udata.mesg.u.chunk.ndims = layout->u.chunk.ndims;
+ udata.mesg = layout;
if (H5B_create(f, dxpl_id, H5B_ISTORE, &udata, &(layout->u.chunk.addr)/*out*/) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "can't create B-tree");
@@ -1971,7 +1971,7 @@ H5D_istore_allocated(H5F_t *f, hid_t dxpl_id, H5D_t *dset)
} /* end for */
HDmemset(&udata, 0, sizeof udata);
- udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims;
+ udata.mesg = &dset->layout;
if (H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_iter_allocated, dset->layout.u.chunk.addr, &udata)<0)
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over chunk B-tree");
@@ -2022,7 +2022,7 @@ H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
/* Initialize the information about the chunk we are looking for */
for (u=0; u<layout->u.chunk.ndims; u++)
udata->key.offset[u] = offset[u];
- udata->mesg = *layout;
+ udata->mesg = layout;
udata->addr = HADDR_UNDEF;
/* Go get the chunk information */
@@ -2323,7 +2323,7 @@ H5D_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
if(!chunk_exists) {
/* Initialize the chunk information */
- udata.mesg = dset->layout;
+ udata.mesg = &dset->layout;
udata.key.filter_mask = 0;
udata.addr = HADDR_UNDEF;
H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t);
@@ -2556,10 +2556,7 @@ H5D_istore_prune_by_extent(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache,
HDmemset(&udata, 0, sizeof udata);
udata.stream = stdout;
- udata.mesg.u.chunk.addr = dset->layout.u.chunk.addr;
- udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims;
- for(u = 0; u < dset->layout.u.chunk.ndims; u++)
- udata.mesg.u.chunk.dim[u] = dset->layout.u.chunk.dim[u];
+ udata.mesg = &dset->layout;
udata.dims = curr_dims;
if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_prune_extent, dset->layout.u.chunk.addr, &udata) < 0)
@@ -2604,11 +2601,11 @@ H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED a
FUNC_ENTER_NOAPI_NOINIT(H5D_istore_prune_extent);
/* Figure out what chunks are no longer in use for the specified extent and release them */
- for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++)
+ for(u = 0; u < bt_udata->mesg->u.chunk.ndims - 1; u++)
if((hsize_t)lt_key->offset[u] > bt_udata->dims[u]) {
#ifdef H5D_ISTORE_DEBUG
HDfputs("b-tree:remove:[", bt_udata->stream);
- for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++)
+ for(u = 0; u < bt_udata->mesg->u.chunk.ndims - 1; u++)
HDfprintf(bt_udata->stream, "%s%Hd", u ? ", " : "", lt_key->offset[u]);
HDfputs("]\n", bt_udata->stream);
#endif
@@ -2618,7 +2615,7 @@ H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED a
udata.mesg = bt_udata->mesg;
/* Remove */
- if(H5B_remove(f, dxpl_id, H5B_ISTORE, bt_udata->mesg.u.chunk.addr, &udata) < 0)
+ if(H5B_remove(f, dxpl_id, H5B_ISTORE, bt_udata->mesg->u.chunk.addr, &udata) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_ITER_ERROR, "unable to remove entry");
break;
} /* end if */
@@ -2895,7 +2892,7 @@ H5D_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout)
if(H5F_addr_defined(layout->u.chunk.addr)) {
/* Set up user data for B-tree deletion */
HDmemset(&udata, 0, sizeof udata);
- udata.mesg = *layout;
+ udata.mesg = layout;
/* Delete entire B-tree */
if(H5B_delete(f, dxpl_id, H5B_ISTORE, layout->u.chunk.addr, &udata)<0)
@@ -3026,13 +3023,15 @@ done:
herr_t
H5D_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, haddr_t addr)
{
+ H5O_layout_t layout;
H5D_istore_ud1_t udata;
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5D_istore_dump_btree, FAIL);
HDmemset(&udata, 0, sizeof udata);
- udata.mesg.u.chunk.ndims = ndims;
+ layout.u.chunk.ndims = ndims;
+ udata.mesg = &layout;
udata.stream = stream;
if(stream)
HDfprintf(stream, " Address: %a\n",addr);
@@ -3129,12 +3128,14 @@ herr_t
H5D_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
int fwidth, int ndims)
{
+ H5O_layout_t layout;
H5D_istore_ud1_t udata;
FUNC_ENTER_NOAPI_NOFUNC(H5D_istore_debug);
HDmemset (&udata, 0, sizeof udata);
- udata.mesg.u.chunk.ndims = ndims;
+ layout.u.chunk.ndims = ndims;
+ udata.mesg = &layout;
H5B_debug (f, dxpl_id, addr, stream, indent, fwidth, H5B_ISTORE, &udata);