#include "H5EAmodule.h"
#include "H5private.h"
#include "H5Eprivate.h"
#include "H5EApkg.h"
#include "H5MFprivate.h"
#include "H5MMprivate.h"
#include "H5VMprivate.h"
#include "H5WBprivate.h"
#define H5EA_HDR_VERSION 0
#define H5EA_IBLOCK_VERSION 0
#define H5EA_SBLOCK_VERSION 0
#define H5EA_DBLOCK_VERSION 0
static herr_t H5EA__cache_hdr_get_initial_load_size(void *udata, size_t *image_len);
static htri_t H5EA__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
static void *H5EA__cache_hdr_deserialize(const void *image, size_t len,
void *udata, hbool_t *dirty);
static herr_t H5EA__cache_hdr_image_len(const void *thing, size_t *image_len);
static herr_t H5EA__cache_hdr_serialize(const H5F_t *f, void *image, size_t len,
void *thing);
static herr_t H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *thing);
static herr_t H5EA__cache_hdr_free_icr(void *thing);
static herr_t H5EA__cache_iblock_get_initial_load_size(void *udata, size_t *image_len);
static htri_t H5EA__cache_iblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
static void *H5EA__cache_iblock_deserialize(const void *image, size_t len,
void *udata, hbool_t *dirty);
static herr_t H5EA__cache_iblock_image_len(const void *thing, size_t *image_len);
static herr_t H5EA__cache_iblock_serialize(const H5F_t *f, void *image, size_t len,
void *thing);
static herr_t H5EA__cache_iblock_notify(H5AC_notify_action_t action, void *thing);
static herr_t H5EA__cache_iblock_free_icr(void *thing);
static herr_t H5EA__cache_sblock_get_initial_load_size(void *udata, size_t *image_len);
static htri_t H5EA__cache_sblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
static void *H5EA__cache_sblock_deserialize(const void *image, size_t len,
void *udata, hbool_t *dirty);
static herr_t H5EA__cache_sblock_image_len(const void *thing, size_t *image_len);
static herr_t H5EA__cache_sblock_serialize(const H5F_t *f, void *image, size_t len,
void *thing);
static herr_t H5EA__cache_sblock_notify(H5AC_notify_action_t action, void *thing);
static herr_t H5EA__cache_sblock_free_icr(void *thing);
static herr_t H5EA__cache_dblock_get_initial_load_size(void *udata, size_t *image_len);
static htri_t H5EA__cache_dblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
static void *H5EA__cache_dblock_deserialize(const void *image, size_t len,
void *udata, hbool_t *dirty);
static herr_t H5EA__cache_dblock_image_len(const void *thing, size_t *image_len);
static herr_t H5EA__cache_dblock_serialize(const H5F_t *f, void *image, size_t len,
void *thing);
static herr_t H5EA__cache_dblock_notify(H5AC_notify_action_t action, void *thing);
static herr_t H5EA__cache_dblock_free_icr(void *thing);
static herr_t H5EA__cache_dblock_fsf_size(const void *thing, hsize_t *fsf_size);
static herr_t H5EA__cache_dblk_page_get_initial_load_size(void *udata, size_t *image_len);
static htri_t H5EA__cache_dblk_page_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
static void *H5EA__cache_dblk_page_deserialize(const void *image, size_t len,
void *udata, hbool_t *dirty);
static herr_t H5EA__cache_dblk_page_image_len(const void *thing,
size_t *image_len);
static herr_t H5EA__cache_dblk_page_serialize(const H5F_t *f, void *image, size_t len,
void *thing);
static herr_t H5EA__cache_dblk_page_notify(H5AC_notify_action_t action, void *thing);
static herr_t H5EA__cache_dblk_page_free_icr(void *thing);
const H5AC_class_t H5AC_EARRAY_HDR[1] = {{
H5AC_EARRAY_HDR_ID,
"Extensible Array Header",
H5FD_MEM_EARRAY_HDR,
H5AC__CLASS_NO_FLAGS_SET,
H5EA__cache_hdr_get_initial_load_size,
NULL,
H5EA__cache_hdr_verify_chksum,
H5EA__cache_hdr_deserialize,
H5EA__cache_hdr_image_len,
NULL,
H5EA__cache_hdr_serialize,
H5EA__cache_hdr_notify,
H5EA__cache_hdr_free_icr,
NULL,
}};
const H5AC_class_t H5AC_EARRAY_IBLOCK[1] = {{
H5AC_EARRAY_IBLOCK_ID,
"Extensible Array Index Block",
H5FD_MEM_EARRAY_IBLOCK,
H5AC__CLASS_NO_FLAGS_SET,
H5EA__cache_iblock_get_initial_load_size,
NULL,
H5EA__cache_iblock_verify_chksum,
H5EA__cache_iblock_deserialize,
H5EA__cache_iblock_image_len,
NULL,
H5EA__cache_iblock_serialize,
H5EA__cache_iblock_notify,
H5EA__cache_iblock_free_icr,
NULL,
}};
const H5AC_class_t H5AC_EARRAY_SBLOCK[1] = {{
H5AC_EARRAY_SBLOCK_ID,
"Extensible Array Super Block",
H5FD_MEM_EARRAY_SBLOCK,
H5AC__CLASS_NO_FLAGS_SET,
H5EA__cache_sblock_get_initial_load_size,
NULL,
H5EA__cache_sblock_verify_chksum,
H5EA__cache_sblock_deserialize,
H5EA__cache_sblock_image_len,
NULL,
H5EA__cache_sblock_serialize,
H5EA__cache_sblock_notify,
H5EA__cache_sblock_free_icr,
NULL,
}};
const H5AC_class_t H5AC_EARRAY_DBLOCK[1] = {{
H5AC_EARRAY_DBLOCK_ID,
"Extensible Array Data Block",
H5FD_MEM_EARRAY_DBLOCK,
H5AC__CLASS_NO_FLAGS_SET,
H5EA__cache_dblock_get_initial_load_size,
NULL,
H5EA__cache_dblock_verify_chksum,
H5EA__cache_dblock_deserialize,
H5EA__cache_dblock_image_len,
NULL,
H5EA__cache_dblock_serialize,
H5EA__cache_dblock_notify,
H5EA__cache_dblock_free_icr,
H5EA__cache_dblock_fsf_size,
}};
const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
H5AC_EARRAY_DBLK_PAGE_ID,
"Extensible Array Data Block Page",
H5FD_MEM_EARRAY_DBLK_PAGE,
H5AC__CLASS_NO_FLAGS_SET,
H5EA__cache_dblk_page_get_initial_load_size,
NULL,
H5EA__cache_dblk_page_verify_chksum,
H5EA__cache_dblk_page_deserialize,
H5EA__cache_dblk_page_image_len,
NULL,
H5EA__cache_dblk_page_serialize,
H5EA__cache_dblk_page_notify,
H5EA__cache_dblk_page_free_icr,
NULL,
}};
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_hdr_get_initial_load_size(void *_udata, size_t *image_len))
H5EA_hdr_cache_ud_t *udata = (H5EA_hdr_cache_ud_t *)_udata;
HDassert(udata);
HDassert(udata->f);
HDassert(image_len);
*image_len = (size_t)H5EA_HEADER_SIZE_FILE(udata->f);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
htri_t, TRUE, -,
H5EA__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
uint32_t computed_chksum;
HDassert(image);
H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
if(stored_chksum != computed_chksum)
ret_value = FALSE;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
void *, NULL, NULL,
H5EA__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
hbool_t H5_ATTR_UNUSED *dirty))
H5EA_cls_id_t id;
H5EA_hdr_t *hdr = NULL;
H5EA_hdr_cache_ud_t *udata = (H5EA_hdr_cache_ud_t *)_udata;
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
HDassert(image);
HDassert(udata);
HDassert(udata->f);
HDassert(H5F_addr_defined(udata->addr));
if(NULL == (hdr = H5EA__hdr_alloc(udata->f)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
hdr->addr = udata->addr;
if(HDmemcmp(image, H5EA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
H5E_THROW(H5E_BADVALUE, "wrong extensible array header signature")
image += H5_SIZEOF_MAGIC;
if(*image++ != H5EA_HDR_VERSION)
H5E_THROW(H5E_VERSION, "wrong extensible array header version")
id = (H5EA_cls_id_t)*image++;
if(id >= H5EA_NUM_CLS_ID)
H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
hdr->cparam.cls = H5EA_client_class_g[id];
hdr->cparam.raw_elmt_size = *image++;
hdr->cparam.max_nelmts_bits = *image++;
hdr->cparam.idx_blk_elmts = *image++;
hdr->cparam.data_blk_min_elmts = *image++;
hdr->cparam.sup_blk_min_data_ptrs = *image++;
hdr->cparam.max_dblk_page_nelmts_bits = *image++;
hdr->stats.computed.hdr_size = len;
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.nsuper_blks);
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.super_blk_size);
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.ndata_blks);
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.data_blk_size);
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.max_idx_set);
H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.nelmts);
H5F_addr_decode(udata->f, &image, &hdr->idx_blk_addr);
if(H5F_addr_defined(hdr->idx_blk_addr)) {
H5EA_iblock_t iblock;
hdr->stats.computed.nindex_blks = 1;
iblock.hdr = hdr;
iblock.nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs);
iblock.ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1);
iblock.nsblk_addrs = hdr->nsblks - iblock.nsblks;
hdr->stats.computed.index_blk_size = H5EA_IBLOCK_SIZE(&iblock);
}
else {
hdr->stats.computed.nindex_blks = 0;
hdr->stats.computed.index_blk_size = 0;
}
HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
UINT32DECODE(image, stored_chksum);
HDassert((size_t)(image - (const uint8_t *)_image) == len);
if(H5EA__hdr_init(hdr, udata->ctx_udata) < 0)
H5E_THROW(H5E_CANTINIT, "initialization failed for extensible array header")
HDassert(hdr->size == len);
ret_value = hdr;
CATCH
if(!ret_value)
if(hdr && H5EA__hdr_dest(hdr) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_hdr_image_len(const void *_thing, size_t *image_len))
const H5EA_hdr_t *hdr = (const H5EA_hdr_t *)_thing;
HDassert(hdr);
HDassert(image_len);
*image_len = hdr->size;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_hdr_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
void *_thing))
H5EA_hdr_t *hdr = (H5EA_hdr_t *)_thing;
uint8_t *image = (uint8_t *)_image;
uint32_t metadata_chksum;
HDassert(f);
HDassert(image);
HDassert(hdr);
H5MM_memcpy(image, H5EA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
image += H5_SIZEOF_MAGIC;
*image++ = H5EA_HDR_VERSION;
HDassert(hdr->cparam.cls->id <= 255);
*image++ = (uint8_t)hdr->cparam.cls->id;
*image++ = hdr->cparam.raw_elmt_size;
*image++ = hdr->cparam.max_nelmts_bits;
*image++ = hdr->cparam.idx_blk_elmts;
*image++ = hdr->cparam.data_blk_min_elmts;
*image++ = hdr->cparam.sup_blk_min_data_ptrs;
*image++ = hdr->cparam.max_dblk_page_nelmts_bits;
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.nsuper_blks);
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.super_blk_size);
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.ndata_blks);
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.data_blk_size);
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.max_idx_set);
H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.nelmts);
H5F_addr_encode(f, &image, hdr->idx_blk_addr);
metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
UINT32ENCODE(image, metadata_chksum);
HDassert((size_t)(image - (uint8_t *)_image) == len);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
H5EA_hdr_t *hdr = (H5EA_hdr_t *)_thing;
HDassert(hdr);
if(hdr->swmr_write) {
switch(action) {
case H5AC_NOTIFY_ACTION_AFTER_INSERT:
case H5AC_NOTIFY_ACTION_AFTER_LOAD:
case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
break;
case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
if(hdr->parent) {
HDassert(hdr->top_proxy);
if(H5AC_proxy_entry_remove_child((H5AC_proxy_entry_t *)hdr->parent, (void *)hdr->top_proxy) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between extensible array and proxy")
hdr->parent = NULL;
}
if(hdr->top_proxy) {
if(H5AC_proxy_entry_remove_child(hdr->top_proxy, hdr) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between header and extensible array 'top' proxy")
}
break;
default:
#ifdef NDEBUG
H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
#else
HDassert(0 && "Unknown action?!?");
#endif
}
}
else
HDassert(NULL == hdr->parent);
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_hdr_free_icr(void *thing))
HDassert(thing);
if(H5EA__hdr_dest((H5EA_hdr_t *)thing) < 0)
H5E_THROW(H5E_CANTFREE, "can't free extensible array header")
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_iblock_get_initial_load_size(void *_udata, size_t *image_len))
H5EA_hdr_t *hdr = (H5EA_hdr_t *)_udata;
H5EA_iblock_t iblock;
HDassert(hdr);
HDassert(image_len);
HDmemset(&iblock, 0, sizeof(iblock));
iblock.hdr = (H5EA_hdr_t *)hdr;
iblock.nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs);
iblock.ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1);
iblock.nsblk_addrs = hdr->nsblks - iblock.nsblks;
*image_len = (size_t)H5EA_IBLOCK_SIZE(&iblock);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
htri_t, TRUE, -,
H5EA__cache_iblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
uint32_t computed_chksum;
HDassert(image);
H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
if(stored_chksum != computed_chksum)
ret_value = FALSE;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
void *, NULL, NULL,
H5EA__cache_iblock_deserialize(const void *_image, size_t len,
void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
H5EA_iblock_t *iblock = NULL;
H5EA_hdr_t *hdr = (H5EA_hdr_t *)_udata;
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
haddr_t arr_addr;
size_t u;
HDassert(image);
HDassert(hdr);
if(NULL == (iblock = H5EA__iblock_alloc(hdr)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array index block")
iblock->addr = hdr->idx_blk_addr;
if(HDmemcmp(image, H5EA_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
H5E_THROW(H5E_BADVALUE, "wrong extensible array index block signature")
image += H5_SIZEOF_MAGIC;
if(*image++ != H5EA_IBLOCK_VERSION)
H5E_THROW(H5E_VERSION, "wrong extensible array index block version")
if(*image++ != (uint8_t)hdr->cparam.cls->id)
H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
H5F_addr_decode(hdr->f, &image, &arr_addr);
if(H5F_addr_ne(arr_addr, hdr->addr))
H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
if(hdr->cparam.idx_blk_elmts > 0) {
if((hdr->cparam.cls->decode)(image, iblock->elmts, (size_t)hdr->cparam.idx_blk_elmts, hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTDECODE, "can't decode extensible array index elements")
image += (hdr->cparam.idx_blk_elmts * hdr->cparam.raw_elmt_size);
}
if(iblock->ndblk_addrs > 0) {
for(u = 0; u < iblock->ndblk_addrs; u++)
H5F_addr_decode(hdr->f, &image, &iblock->dblk_addrs[u]);
}
if(iblock->nsblk_addrs > 0) {
for(u = 0; u < iblock->nsblk_addrs; u++)
H5F_addr_decode(hdr->f, &image, &iblock->sblk_addrs[u]);
}
HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
iblock->size = len;
UINT32DECODE(image, stored_chksum);
HDassert((size_t)(image - (const uint8_t *)_image) == iblock->size);
ret_value = iblock;
CATCH
if(!ret_value)
if(iblock && H5EA__iblock_dest(iblock) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array index block")
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_iblock_image_len(const void *_thing, size_t *image_len))
const H5EA_iblock_t *iblock = (const H5EA_iblock_t *)_thing;
HDassert(iblock);
HDassert(image_len);
*image_len = iblock->size;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_iblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
void *_thing))
H5EA_iblock_t *iblock = (H5EA_iblock_t *)_thing;
uint8_t *image = (uint8_t *)_image;
uint32_t metadata_chksum;
HDassert(f);
HDassert(image);
HDassert(iblock);
HDassert(iblock->hdr);
H5MM_memcpy(image, H5EA_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
image += H5_SIZEOF_MAGIC;
*image++ = H5EA_IBLOCK_VERSION;
HDassert(iblock->hdr->cparam.cls->id <= 255);
*image++ = (uint8_t)iblock->hdr->cparam.cls->id;
H5F_addr_encode(f, &image, iblock->hdr->addr);
if(iblock->hdr->cparam.idx_blk_elmts > 0) {
if((iblock->hdr->cparam.cls->encode)(image, iblock->elmts, (size_t)iblock->hdr->cparam.idx_blk_elmts, iblock->hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTENCODE, "can't encode extensible array index elements")
image += (iblock->hdr->cparam.idx_blk_elmts * iblock->hdr->cparam.raw_elmt_size);
}
if(iblock->ndblk_addrs > 0) {
size_t u;
for(u = 0; u < iblock->ndblk_addrs; u++)
H5F_addr_encode(f, &image, iblock->dblk_addrs[u]);
}
if(iblock->nsblk_addrs > 0) {
size_t u;
for(u = 0; u < iblock->nsblk_addrs; u++)
H5F_addr_encode(f, &image, iblock->sblk_addrs[u]);
}
metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
UINT32ENCODE(image, metadata_chksum);
HDassert((size_t)(image - (uint8_t *)_image) == len);
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_iblock_notify(H5AC_notify_action_t action, void *_thing))
H5EA_iblock_t *iblock = (H5EA_iblock_t *)_thing;
HDassert(iblock);
switch(action) {
case H5AC_NOTIFY_ACTION_AFTER_INSERT:
case H5AC_NOTIFY_ACTION_AFTER_LOAD:
if(H5EA__create_flush_depend((H5AC_info_t *)iblock->hdr, (H5AC_info_t *)iblock) < 0)
H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between index block and header, address = %llu", (unsigned long long)iblock->addr)
break;
case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
break;
case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
if(H5EA__destroy_flush_depend((H5AC_info_t *)iblock->hdr, (H5AC_info_t *)iblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between index block and header, address = %llu", (unsigned long long)iblock->addr)
if(iblock->top_proxy) {
if(H5AC_proxy_entry_remove_child(iblock->top_proxy, iblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between index block and extensible array 'top' proxy")
iblock->top_proxy = NULL;
}
break;
default:
#ifdef NDEBUG
H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
#else
HDassert(0 && "Unknown action?!?");
#endif
}
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_iblock_free_icr(void *thing))
HDassert(thing);
if(H5EA__iblock_dest((H5EA_iblock_t *)thing) < 0)
H5E_THROW(H5E_CANTFREE, "can't free extensible array index block")
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_sblock_get_initial_load_size(void *_udata, size_t *image_len))
H5EA_sblock_cache_ud_t *udata = (H5EA_sblock_cache_ud_t *)_udata;
H5EA_sblock_t sblock;
HDassert(udata);
HDassert(udata->hdr);
HDassert(udata->sblk_idx > 0);
HDassert(H5F_addr_defined(udata->sblk_addr));
HDassert(image_len);
HDmemset(&sblock, 0, sizeof(sblock));
sblock.hdr = udata->hdr;
sblock.ndblks = udata->hdr->sblk_info[udata->sblk_idx].ndblks;
sblock.dblk_nelmts = udata->hdr->sblk_info[udata->sblk_idx].dblk_nelmts;
if(sblock.dblk_nelmts > udata->hdr->dblk_page_nelmts) {
sblock.dblk_npages = sblock.dblk_nelmts / udata->hdr->dblk_page_nelmts;
HDassert(sblock.dblk_npages > 1);
HDassert((sblock.dblk_npages * udata->hdr->dblk_page_nelmts) == sblock.dblk_nelmts);
sblock.dblk_page_init_size = ((sblock.dblk_npages) + 7) / 8;
HDassert(sblock.dblk_page_init_size > 0);
}
*image_len = (size_t)H5EA_SBLOCK_SIZE(&sblock);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
htri_t, TRUE, -,
H5EA__cache_sblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
uint32_t computed_chksum;
HDassert(image);
H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
if(stored_chksum != computed_chksum)
ret_value = FALSE;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
void *, NULL, NULL,
H5EA__cache_sblock_deserialize(const void *_image, size_t len,
void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
H5EA_sblock_t *sblock = NULL;
H5EA_sblock_cache_ud_t *udata = (H5EA_sblock_cache_ud_t *)_udata;
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
haddr_t arr_addr;
size_t u;
HDassert(udata);
HDassert(udata->hdr);
HDassert(udata->parent);
HDassert(udata->sblk_idx > 0);
HDassert(H5F_addr_defined(udata->sblk_addr));
if(NULL == (sblock = H5EA__sblock_alloc(udata->hdr, udata->parent, udata->sblk_idx)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array super block")
sblock->addr = udata->sblk_addr;
if(HDmemcmp(image, H5EA_SBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
H5E_THROW(H5E_BADVALUE, "wrong extensible array super block signature")
image += H5_SIZEOF_MAGIC;
if(*image++ != H5EA_SBLOCK_VERSION)
H5E_THROW(H5E_VERSION, "wrong extensible array super block version")
if(*image++ != (uint8_t)udata->hdr->cparam.cls->id)
H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
H5F_addr_decode(udata->hdr->f, &image, &arr_addr);
if(H5F_addr_ne(arr_addr, udata->hdr->addr))
H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
UINT64DECODE_VAR(image, sblock->block_off, udata->hdr->arr_off_size);
if(sblock->dblk_npages > 0) {
size_t tot_page_init_size = sblock->ndblks * sblock->dblk_page_init_size;
H5MM_memcpy(sblock->page_init, image, tot_page_init_size);
image += tot_page_init_size;
}
for(u = 0; u < sblock->ndblks; u++)
H5F_addr_decode(udata->hdr->f, &image, &sblock->dblk_addrs[u]);
HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
sblock->size = len;
UINT32DECODE(image, stored_chksum);
HDassert((size_t)(image - (const uint8_t *)_image) == sblock->size);
ret_value = sblock;
CATCH
if(!ret_value)
if(sblock && H5EA__sblock_dest(sblock) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array super block")
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_sblock_image_len(const void *_thing, size_t *image_len))
const H5EA_sblock_t *sblock = (const H5EA_sblock_t *)_thing;
HDassert(sblock);
HDassert(image_len);
*image_len = sblock->size;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_sblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
void *_thing))
H5EA_sblock_t *sblock = (H5EA_sblock_t *)_thing;
uint8_t *image = (uint8_t *)_image;
uint32_t metadata_chksum;
size_t u;
HDassert(f);
HDassert(image);
HDassert(sblock);
HDassert(sblock->hdr);
H5MM_memcpy(image, H5EA_SBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
image += H5_SIZEOF_MAGIC;
*image++ = H5EA_SBLOCK_VERSION;
HDassert(sblock->hdr->cparam.cls->id <= 255);
*image++ = (uint8_t)sblock->hdr->cparam.cls->id;
H5F_addr_encode(f, &image, sblock->hdr->addr);
UINT64ENCODE_VAR(image, sblock->block_off, sblock->hdr->arr_off_size);
if(sblock->dblk_npages > 0) {
size_t tot_page_init_size = sblock->ndblks * sblock->dblk_page_init_size;
H5MM_memcpy(image, sblock->page_init, tot_page_init_size);
image += tot_page_init_size;
}
for(u = 0; u < sblock->ndblks; u++)
H5F_addr_encode(f, &image, sblock->dblk_addrs[u]);
metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
UINT32ENCODE(image, metadata_chksum);
HDassert((size_t)(image - (uint8_t *)_image) == len);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_sblock_notify(H5AC_notify_action_t action, void *_thing))
H5EA_sblock_t *sblock = (H5EA_sblock_t *)_thing;
HDassert(sblock);
switch(action) {
case H5AC_NOTIFY_ACTION_AFTER_INSERT:
case H5AC_NOTIFY_ACTION_AFTER_LOAD:
if(H5EA__create_flush_depend((H5AC_info_t *)sblock->parent, (H5AC_info_t *)sblock) < 0)
H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between super block and index block, address = %llu", (unsigned long long)sblock->addr)
break;
case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
if(sblock->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->hdr, (H5AC_info_t *)sblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and header, address = %llu", (unsigned long long)sblock->addr)
sblock->has_hdr_depend = FALSE;
}
break;
case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->parent, (H5AC_info_t *)sblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and index block, address = %llu", (unsigned long long)sblock->addr)
if(sblock->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->hdr, (H5AC_info_t *)sblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and header, address = %llu", (unsigned long long)sblock->addr)
sblock->has_hdr_depend = FALSE;
}
if(sblock->top_proxy) {
if(H5AC_proxy_entry_remove_child(sblock->top_proxy, sblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and extensible array 'top' proxy")
sblock->top_proxy = NULL;
}
break;
case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
break;
default:
#ifdef NDEBUG
H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
#else
HDassert(0 && "Unknown action?!?");
#endif
}
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_sblock_free_icr(void *thing))
HDassert(thing);
if(H5EA__sblock_dest((H5EA_sblock_t *)thing) < 0)
H5E_THROW(H5E_CANTFREE, "can't free extensible array super block")
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_dblock_get_initial_load_size(void *_udata, size_t *image_len))
H5EA_dblock_cache_ud_t *udata = (H5EA_dblock_cache_ud_t *)_udata;
H5EA_dblock_t dblock;
HDassert(udata);
HDassert(udata->hdr);
HDassert(udata->nelmts > 0);
HDassert(image_len);
HDmemset(&dblock, 0, sizeof(dblock));
dblock.hdr = udata->hdr;
dblock.nelmts = udata->nelmts;
if(udata->nelmts > udata->hdr->dblk_page_nelmts) {
dblock.npages = udata->nelmts / udata->hdr->dblk_page_nelmts;
HDassert(udata->nelmts==(dblock.npages * udata->hdr->dblk_page_nelmts));
}
if(!dblock.npages)
*image_len = H5EA_DBLOCK_SIZE(&dblock);
else
*image_len = H5EA_DBLOCK_PREFIX_SIZE(&dblock);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
htri_t, TRUE, -,
H5EA__cache_dblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
uint32_t computed_chksum;
HDassert(image);
H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
if(stored_chksum != computed_chksum)
ret_value = FALSE;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
void *, NULL, NULL,
H5EA__cache_dblock_deserialize(const void *_image, size_t H5_ATTR_NDEBUG_UNUSED len,
void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
H5EA_dblock_t *dblock = NULL;
H5EA_dblock_cache_ud_t *udata = (H5EA_dblock_cache_ud_t *)_udata;
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
haddr_t arr_addr;
HDassert(udata);
HDassert(udata->hdr);
HDassert(udata->parent);
HDassert(udata->nelmts > 0);
HDassert(H5F_addr_defined(udata->dblk_addr));
if(NULL == (dblock = H5EA__dblock_alloc(udata->hdr, udata->parent, udata->nelmts)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block")
HDassert(((!dblock->npages) && (len == H5EA_DBLOCK_SIZE(dblock))) ||
(len == H5EA_DBLOCK_PREFIX_SIZE(dblock)));
dblock->addr = udata->dblk_addr;
if(HDmemcmp(image, H5EA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
H5E_THROW(H5E_BADVALUE, "wrong extensible array data block signature")
image += H5_SIZEOF_MAGIC;
if(*image++ != H5EA_DBLOCK_VERSION)
H5E_THROW(H5E_VERSION, "wrong extensible array data block version")
if(*image++ != (uint8_t)udata->hdr->cparam.cls->id)
H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
H5F_addr_decode(udata->hdr->f, &image, &arr_addr);
if(H5F_addr_ne(arr_addr, udata->hdr->addr))
H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
UINT64DECODE_VAR(image, dblock->block_off, udata->hdr->arr_off_size);
if(!dblock->npages) {
if((udata->hdr->cparam.cls->decode)(image, dblock->elmts, udata->nelmts, udata->hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTDECODE, "can't decode extensible array data elements")
image += (udata->nelmts * udata->hdr->cparam.raw_elmt_size);
}
HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
dblock->size = H5EA_DBLOCK_SIZE(dblock);
UINT32DECODE(image, stored_chksum);
HDassert((size_t)(image - (const uint8_t *)_image) == len);
ret_value = dblock;
CATCH
if(!ret_value)
if(dblock && H5EA__dblock_dest(dblock) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block")
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_dblock_image_len(const void *_thing, size_t *image_len))
const H5EA_dblock_t *dblock = (const H5EA_dblock_t *)_thing;
HDassert(dblock);
HDassert(image_len);
if(!dblock->npages)
*image_len = dblock->size;
else
*image_len = (size_t)H5EA_DBLOCK_PREFIX_SIZE(dblock);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
void *_thing))
H5EA_dblock_t *dblock = (H5EA_dblock_t *)_thing;
uint8_t *image = (uint8_t *)_image;
uint32_t metadata_chksum;
HDassert(f);
HDassert(image);
HDassert(dblock);
HDassert(dblock->hdr);
H5MM_memcpy(image, H5EA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
image += H5_SIZEOF_MAGIC;
*image++ = H5EA_DBLOCK_VERSION;
HDassert(dblock->hdr->cparam.cls->id <= 255);
*image++ = (uint8_t)dblock->hdr->cparam.cls->id;
H5F_addr_encode(f, &image, dblock->hdr->addr);
UINT64ENCODE_VAR(image, dblock->block_off, dblock->hdr->arr_off_size);
if(!dblock->npages) {
if((dblock->hdr->cparam.cls->encode)(image, dblock->elmts, dblock->nelmts, dblock->hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTENCODE, "can't encode extensible array data elements")
image += (dblock->nelmts * dblock->hdr->cparam.raw_elmt_size);
}
metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
UINT32ENCODE(image, metadata_chksum);
HDassert((size_t)(image - (uint8_t *)_image) == len);
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
H5EA_dblock_t *dblock = (H5EA_dblock_t *)_thing;
HDassert(dblock);
switch(action) {
case H5AC_NOTIFY_ACTION_AFTER_INSERT:
case H5AC_NOTIFY_ACTION_AFTER_LOAD:
if(H5EA__create_flush_depend((H5AC_info_t *)dblock->parent, (H5AC_info_t *)dblock) < 0)
H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block and parent, address = %llu", (unsigned long long)dblock->addr)
break;
case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
if(dblock->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between direct block and header, address = %llu", (unsigned long long)dblock->addr)
dblock->has_hdr_depend = FALSE;
}
break;
case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->parent, (H5AC_info_t *)dblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and parent, address = %llu", (unsigned long long)dblock->addr)
if(dblock->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and header, address = %llu", (unsigned long long)dblock->addr)
dblock->has_hdr_depend = FALSE;
}
if(dblock->top_proxy) {
if(H5AC_proxy_entry_remove_child(dblock->top_proxy, dblock) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and extensible array 'top' proxy")
dblock->top_proxy = NULL;
}
break;
case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
break;
default:
#ifdef NDEBUG
H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
#else
HDassert(0 && "Unknown action?!?");
#endif
}
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblock_free_icr(void *thing))
HDassert(thing);
if(H5EA__dblock_dest((H5EA_dblock_t *)thing) < 0)
H5E_THROW(H5E_CANTFREE, "can't free extensible array data block")
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_dblock_fsf_size(const void *_thing, hsize_t *fsf_size))
const H5EA_dblock_t *dblock = (const H5EA_dblock_t *)_thing;
HDassert(dblock);
HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
HDassert(dblock->cache_info.type == H5AC_EARRAY_DBLOCK);
HDassert(fsf_size);
*fsf_size = dblock->size;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_dblk_page_get_initial_load_size(void *_udata, size_t *image_len))
H5EA_dblk_page_cache_ud_t *udata = (H5EA_dblk_page_cache_ud_t *)_udata;
HDassert(udata);
HDassert(udata->hdr);
HDassert(image_len);
*image_len = (size_t)H5EA_DBLK_PAGE_SIZE(udata->hdr);
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
htri_t, TRUE, -,
H5EA__cache_dblk_page_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
uint32_t computed_chksum;
HDassert(image);
H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
if(stored_chksum != computed_chksum)
ret_value = FALSE;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
void *, NULL, NULL,
H5EA__cache_dblk_page_deserialize(const void *_image, size_t len,
void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
H5EA_dblk_page_t *dblk_page = NULL;
H5EA_dblk_page_cache_ud_t *udata = (H5EA_dblk_page_cache_ud_t *)_udata;
const uint8_t *image = (const uint8_t *)_image;
uint32_t stored_chksum;
HDassert(udata);
HDassert(udata->hdr);
HDassert(udata->parent);
HDassert(H5F_addr_defined(udata->dblk_page_addr));
if(NULL == (dblk_page = H5EA__dblk_page_alloc(udata->hdr, udata->parent)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block page")
dblk_page->addr = udata->dblk_page_addr;
if((udata->hdr->cparam.cls->decode)(image, dblk_page->elmts, udata->hdr->dblk_page_nelmts, udata->hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTDECODE, "can't decode extensible array data elements")
image += (udata->hdr->dblk_page_nelmts * udata->hdr->cparam.raw_elmt_size);
HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
dblk_page->size = len;
UINT32DECODE(image, stored_chksum);
HDassert((size_t)(image - (const uint8_t *)_image) == dblk_page->size);
ret_value = dblk_page;
CATCH
if(!ret_value)
if(dblk_page && H5EA__dblk_page_dest(dblk_page) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block page")
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_dblk_page_image_len(const void *_thing, size_t *image_len))
const H5EA_dblk_page_t *dblk_page = (const H5EA_dblk_page_t *)_thing;
HDassert(dblk_page);
HDassert(image_len);
*image_len = dblk_page->size;
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblk_page_serialize(const H5F_t H5_ATTR_NDEBUG_UNUSED *f, void *_image, size_t H5_ATTR_UNUSED len,
void *_thing))
H5EA_dblk_page_t *dblk_page = (H5EA_dblk_page_t *)_thing;
uint8_t *image = (uint8_t *)_image;
uint32_t metadata_chksum;
HDassert(f);
HDassert(image);
HDassert(dblk_page);
HDassert(dblk_page->hdr);
if((dblk_page->hdr->cparam.cls->encode)(image, dblk_page->elmts, dblk_page->hdr->dblk_page_nelmts, dblk_page->hdr->cb_ctx) < 0)
H5E_THROW(H5E_CANTENCODE, "can't encode extensible array data elements")
image += (dblk_page->hdr->dblk_page_nelmts * dblk_page->hdr->cparam.raw_elmt_size);
metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
UINT32ENCODE(image, metadata_chksum);
HDassert((size_t)(image - (uint8_t *)_image) == len);
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblk_page_notify(H5AC_notify_action_t action, void *_thing))
H5EA_dblk_page_t *dblk_page = (H5EA_dblk_page_t *)_thing;
HDassert(dblk_page);
switch(action) {
case H5AC_NOTIFY_ACTION_AFTER_INSERT:
case H5AC_NOTIFY_ACTION_AFTER_LOAD:
if(H5EA__create_flush_depend((H5AC_info_t *)dblk_page->parent, (H5AC_info_t *)dblk_page) < 0)
H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block page and parent, address = %llu", (unsigned long long)dblk_page->addr)
break;
case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
if(dblk_page->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->hdr, (H5AC_info_t *)dblk_page) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and header, address = %llu", (unsigned long long)dblk_page->addr)
dblk_page->has_hdr_depend = FALSE;
}
break;
case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->parent, (H5AC_info_t *)dblk_page) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and parent, address = %llu", (unsigned long long)dblk_page->addr)
if(dblk_page->has_hdr_depend) {
if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->hdr, (H5AC_info_t *)dblk_page) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and header, address = %llu", (unsigned long long)dblk_page->addr)
dblk_page->has_hdr_depend = FALSE;
}
if(dblk_page->top_proxy) {
if(H5AC_proxy_entry_remove_child(dblk_page->top_proxy, dblk_page) < 0)
H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and extensible array 'top' proxy")
dblk_page->top_proxy = NULL;
}
break;
case H5AC_NOTIFY_ACTION_ENTRY_DIRTIED:
case H5AC_NOTIFY_ACTION_ENTRY_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_DIRTIED:
case H5AC_NOTIFY_ACTION_CHILD_CLEANED:
case H5AC_NOTIFY_ACTION_CHILD_UNSERIALIZED:
case H5AC_NOTIFY_ACTION_CHILD_SERIALIZED:
break;
default:
#ifdef NDEBUG
H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
#else
HDassert(0 && "Unknown action?!?");
#endif
}
CATCH
END_FUNC(STATIC)
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_dblk_page_free_icr(void *thing))
HDassert(thing);
if(H5EA__dblk_page_dest((H5EA_dblk_page_t *)thing) < 0)
H5E_THROW(H5E_CANTFREE, "can't free extensible array data block page")
CATCH
END_FUNC(STATIC)