summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/H5EA.c69
-rw-r--r--src/H5EAcache.c10
-rw-r--r--src/H5EAhdr.c11
-rw-r--r--src/H5EApkg.h9
-rw-r--r--src/H5EAprivate.h27
-rw-r--r--src/H5EAtest.c123
6 files changed, 238 insertions, 11 deletions
diff --git a/src/H5EA.c b/src/H5EA.c
index d25a16c..06a11d2 100644
--- a/src/H5EA.c
+++ b/src/H5EA.c
@@ -164,6 +164,75 @@ END_FUNC(PRIV) /* end H5EA_create() */
/*-------------------------------------------------------------------------
+ * Function: H5EA_open
+ *
+ * Purpose: Opens an existing extensible array in the file.
+ *
+ * Return: Pointer to array wrapper on success
+ * NULL on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@hdfgroup.org
+ * Aug 28 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+H5EA_t *, NULL, NULL,
+H5EA_open(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr))
+
+ /* Local variables */
+ H5EA_t *ea = NULL; /* Pointer to new extensible array wrapper */
+ H5EA_hdr_t *hdr = NULL; /* The extensible array header information */
+
+ /*
+ * Check arguments.
+ */
+ HDassert(f);
+ HDassert(H5F_addr_defined(ea_addr));
+
+ /* Load the array header into memory */
+#ifdef QAK
+HDfprintf(stderr, "%s: ea_addr = %a\n", FUNC, ea_addr);
+#endif /* QAK */
+ if(NULL == (hdr = (H5EA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_EARRAY_HDR, ea_addr, NULL, NULL, H5AC_READ)))
+ H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header, address = %llu", (unsigned long_long)ea_addr)
+
+ /* Check for pending array deletion */
+ if(hdr->pending_delete)
+ H5E_THROW(H5E_CANTOPENOBJ, "can't open extensible array pending deletion")
+
+ /* Create fractal heap info */
+ if(NULL == (ea = H5FL_MALLOC(H5EA_t)))
+ H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array info")
+
+ /* Point extensible array wrapper at header */
+ ea->hdr = hdr;
+ if(H5EA__hdr_incr(ea->hdr) < 0)
+ H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+
+ /* Increment # of files using this array header */
+ if(H5EA__hdr_fuse_incr(ea->hdr) < 0)
+ H5E_THROW(H5E_CANTINC, "can't increment file reference count on shared array header")
+
+ /* Set file pointer for this array open context */
+ ea->f = f;
+
+ /* Set the return value */
+ ret_value = ea;
+
+CATCH
+
+ if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_EARRAY_HDR, ea_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+ H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+ if(!ret_value)
+ if(ea && H5EA_close(ea, dxpl_id) < 0)
+ H5E_THROW(H5E_CLOSEERROR, "unable to close extensible array")
+
+END_FUNC(PRIV) /* end H5EA_open() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5EA_get_nelmts
*
* Purpose: Query the current number of elements in array
diff --git a/src/H5EAcache.c b/src/H5EAcache.c
index 3fc408d..a6e8178 100644
--- a/src/H5EAcache.c
+++ b/src/H5EAcache.c
@@ -169,8 +169,9 @@ H5EA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED *u
if(*p++ != H5EA_HDR_VERSION)
H5E_THROW(H5E_VERSION, "wrong extensible array header version")
- /* General array information */
- hdr->elmt_size = *p++; /* Element size (in bytes) */
+ /* General array creation/configuration information */
+ hdr->raw_elmt_size = *p++; /* Element size in file (in bytes) */
+ hdr->max_nelmts_bits = *p++; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
hdr->idx_blk_elmts = *p++; /* # of elements to store in index block */
hdr->data_blk_min_elmts = *p++; /* Min. # of elements per data block */
hdr->sup_blk_min_data_ptrs = *p++; /* Min. # of data block pointers for a super block */
@@ -263,8 +264,9 @@ H5EA__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5
/* Version # */
*p++ = H5EA_HDR_VERSION;
- /* General array information */
- *p++ = hdr->elmt_size; /* Element size (in bytes) */
+ /* General array creation/configuration information */
+ *p++ = hdr->raw_elmt_size; /* Element size in file (in bytes) */
+ *p++ = hdr->max_nelmts_bits; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
*p++ = hdr->idx_blk_elmts; /* # of elements to store in index block */
*p++ = hdr->data_blk_min_elmts; /* Min. # of elements per data block */
*p++ = hdr->sup_blk_min_data_ptrs; /* Min. # of data block pointers for a super block */
diff --git a/src/H5EAhdr.c b/src/H5EAhdr.c
index 2f14e6c..5fbcaf9 100644
--- a/src/H5EAhdr.c
+++ b/src/H5EAhdr.c
@@ -49,6 +49,8 @@
/* Local Macros */
/****************/
+/* Max. # of bits for max. nelmts index */
+#define H5EA_MAX_NELMTS_IDX_MAX 64
/******************/
/* Local Typedefs */
@@ -157,8 +159,12 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
#ifndef NDEBUG
/* Check for valid parameters */
- if(cparam->elmt_size == 0)
+ if(cparam->raw_elmt_size == 0)
H5E_THROW(H5E_BADVALUE, "element size must be greater than zero")
+ if(cparam->max_nelmts_bits == 0)
+ H5E_THROW(H5E_BADVALUE, "max. # of nelmts bitsmust be greater than zero")
+ if(cparam->max_nelmts_bits > H5EA_MAX_NELMTS_IDX_MAX)
+ H5E_THROW(H5E_BADVALUE, "element size must be <= %u", (unsigned)H5EA_MAX_NELMTS_IDX_MAX)
if(!POWER_OF_TWO(cparam->sup_blk_min_data_ptrs))
H5E_THROW(H5E_BADVALUE, "min # of data block pointers in super block not power of two")
if(!POWER_OF_TWO(cparam->data_blk_min_elmts))
@@ -172,7 +178,8 @@ HDfprintf(stderr, "%s: Called\n", FUNC);
/* Set the internal parameters for the array */
/* Set the creation parameters for the array */
- hdr->elmt_size = cparam->elmt_size;
+ hdr->raw_elmt_size = cparam->raw_elmt_size;
+ hdr->max_nelmts_bits = cparam->max_nelmts_bits;
hdr->idx_blk_elmts = cparam->idx_blk_elmts;
hdr->sup_blk_min_data_ptrs = cparam->sup_blk_min_data_ptrs;
hdr->data_blk_min_elmts = cparam->data_blk_min_elmts;
diff --git a/src/H5EApkg.h b/src/H5EApkg.h
index 95e5c60..33131bd 100644
--- a/src/H5EApkg.h
+++ b/src/H5EApkg.h
@@ -363,6 +363,7 @@ func_init_failed: \
\
/* General heap information */ \
+ 1 /* Element Size */ \
+ + 1 /* Max. # of elements bits */ \
+ 1 /* # of elements to store in index block */ \
+ 1 /* Min. # elements per data block */ \
+ 1 /* Min. # of data block pointers for a super block */ \
@@ -382,7 +383,8 @@ typedef struct H5EA_hdr_t {
H5AC_info_t cache_info;
/* Extensible array configuration/creation parameters (stored) */
- uint8_t elmt_size; /* Element size (in bytes) */
+ uint8_t raw_elmt_size; /* Element size in file (in bytes) */
+ uint8_t max_nelmts_bits; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
uint8_t idx_blk_elmts; /* # of elements to store in index block */
uint8_t data_blk_min_elmts; /* Min. # of elements per data block */
uint8_t sup_blk_min_data_ptrs; /* Min. # of data block pointers for a super block */
@@ -413,6 +415,11 @@ H5_DLLVAR const H5AC_class_t H5AC_EARRAY_HDR[1];
/* Declare a free list to manage the H5EA_hdr_t struct */
H5FL_EXTERN(H5EA_hdr_t);
+/* Internal extensible array testing class */
+#ifdef H5EA_TESTING
+H5_DLLVAR const H5EA_class_t H5EA_CLS_TEST[1];
+#endif /* H5EA_TESTING */
+
/******************************/
/* Package Private Prototypes */
diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h
index 6a7fc67..e39cefe 100644
--- a/src/H5EAprivate.h
+++ b/src/H5EAprivate.h
@@ -46,9 +46,33 @@
/* Library Private Typedefs */
/****************************/
+/* Extensible array class IDs */
+typedef enum H5EA_cls_id_t {
+ /* Start real class IDs at 0 -QAK */
+ H5EA_CLS_TEST_ID, /* Extensible array is for testing (do not use for actual data) */
+ H5EA_NUM_CLS_ID /* Number of Extensible Array class IDs (must be last) */
+} H5EA_cls_id_t;
+
+/*
+ * Each type of element that can be stored in an extesible array has a
+ * variable of this type that contains class variables and methods.
+ */
+typedef struct H5EA_class_t {
+ H5EA_cls_id_t id; /* ID of Extensible Array class, as found in file */
+ size_t nat_elmt_size; /* Size of native (memory) element */
+
+ /* Extensible array client callback methods */
+ herr_t (*fill)(uint8_t *raw_blk, size_t nelmts); /* Fill array of elements with encoded form of "missing element" value */
+ herr_t (*encode)(uint8_t *raw, const void *elmt); /* Encode element from native form to disk storage form */
+ herr_t (*decode)(const uint8_t *raw, void *elmt); /* Decode element from disk storage form to native form */
+ herr_t (*debug)(FILE *stream, int indent, int fwidth, const void *elmt); /* Print an element for debugging */
+} H5EA_class_t;
+
/* Extensible array creation parameters */
typedef struct H5EA_create_t {
- uint8_t elmt_size; /* Element size (in bytes) */
+ const H5EA_class_t *cls; /* Class of extensible array to create */
+ uint8_t raw_elmt_size; /* Element size in file (in bytes) */
+ uint8_t max_nelmts_bits; /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
uint8_t idx_blk_elmts; /* # of elements to store in index block */
uint8_t data_blk_min_elmts; /* Min. # of elements per data block */
uint8_t sup_blk_min_data_ptrs; /* Min. # of data block pointers for a super block */
@@ -75,6 +99,7 @@ typedef struct H5EA_t H5EA_t;
/* General routines */
H5_DLL H5EA_t *H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam);
+H5_DLL H5EA_t *H5EA_open(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr);
H5_DLL herr_t H5EA_get_nelmts(const H5EA_t *ea, hsize_t *nelmts);
H5_DLL herr_t H5EA_get_addr(const H5EA_t *ea, haddr_t *addr);
H5_DLL herr_t H5EA_delete(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr);
diff --git a/src/H5EAtest.c b/src/H5EAtest.c
index c05084d..0096d9c 100644
--- a/src/H5EAtest.c
+++ b/src/H5EAtest.c
@@ -60,11 +60,27 @@
/* Local Prototypes */
/********************/
+/* Extensible array class callbacks */
+static herr_t H5EA_test_fill(uint8_t *raw_blk, size_t nelmts);
+static herr_t H5EA_test_encode(uint8_t *raw, const void *elmt);
+static herr_t H5EA_test_decode(const uint8_t *raw, void *elmt);
+static herr_t H5EA_test_debug(FILE *stream, int indent, int fwidth, const void *elmt);
+
/*********************/
/* Package Variables */
/*********************/
+/* Extensible array testing class information */
+const H5EA_class_t H5EA_CLS_TEST[1]={{
+ H5EA_CLS_TEST_ID, /* Type of Extensible array */
+ sizeof(haddr_t), /* Size of native record */
+ H5EA_test_fill, /* Fill block of missing elements callback */
+ H5EA_test_encode, /* Element encoding callback */
+ H5EA_test_decode, /* Element decoding callback */
+ H5EA_test_debug /* Element debugging callback */
+}};
+
/*****************************/
/* Library Private Variables */
@@ -78,6 +94,102 @@
/*-------------------------------------------------------------------------
+ * Function: H5EA_test_fill
+ *
+ * Purpose: Fill "missing elements" in block of elements
+ *
+ * Return: Success: non-negative
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA_test_fill(uint8_t *raw_blk, size_t nelmts))
+
+ /* Sanity checks */
+ HDassert(raw_blk);
+ HDassert(nelmts);
+
+END_FUNC(STATIC) /* end H5EA_test_fill() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5EA_test_encode
+ *
+ * Purpose: Encode an element from "native" to "raw" form
+ *
+ * Return: Success: non-negative
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA_test_encode(uint8_t *raw, const void *elmt))
+
+ /* Sanity checks */
+ HDassert(raw);
+ HDassert(elmt);
+
+END_FUNC(STATIC) /* end H5EA_test_encode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5EA_test_decode
+ *
+ * Purpose: Decode an element from "raw" to "native" form
+ *
+ * Return: Success: non-negative
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA_test_decode(const uint8_t *raw, void *elmt))
+
+ /* Sanity checks */
+ HDassert(raw);
+ HDassert(elmt);
+
+END_FUNC(STATIC) /* end H5EA_test_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5EA_test_debug
+ *
+ * Purpose: Display an element for debugging
+ *
+ * Return: Success: non-negative
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA_test_debug(FILE *stream, int indent, int fwidth, const void *elmt))
+
+ /* Sanity checks */
+ HDassert(stream);
+ HDassert(elmt);
+
+END_FUNC(STATIC) /* end H5EA_test_debug() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5EA_get_cparam_test
*
* Purpose: Retrieve the parameters used to create the extensible array
@@ -99,7 +211,8 @@ H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam))
HDassert(cparam);
/* Get extensible array creation parameters */
- cparam->elmt_size = ea->hdr->elmt_size;
+ cparam->raw_elmt_size = ea->hdr->raw_elmt_size;
+ cparam->max_nelmts_bits = ea->hdr->max_nelmts_bits;
cparam->idx_blk_elmts = ea->hdr->idx_blk_elmts;
cparam->sup_blk_min_data_ptrs = ea->hdr->sup_blk_min_data_ptrs;
cparam->data_blk_min_elmts = ea->hdr->data_blk_min_elmts;
@@ -129,9 +242,13 @@ H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2)
HDassert(cparam2);
/* Compare creation parameters for array */
- if(cparam1->elmt_size < cparam2->elmt_size)
+ if(cparam1->raw_elmt_size < cparam2->raw_elmt_size)
+ H5_LEAVE(-1)
+ else if(cparam1->raw_elmt_size > cparam2->raw_elmt_size)
+ H5_LEAVE(1)
+ if(cparam1->max_nelmts_bits < cparam2->max_nelmts_bits)
H5_LEAVE(-1)
- else if(cparam1->elmt_size > cparam2->elmt_size)
+ else if(cparam1->max_nelmts_bits > cparam2->max_nelmts_bits)
H5_LEAVE(1)
if(cparam1->idx_blk_elmts < cparam2->idx_blk_elmts)
H5_LEAVE(-1)