diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5EA.c | 69 | ||||
-rw-r--r-- | src/H5EAcache.c | 10 | ||||
-rw-r--r-- | src/H5EAhdr.c | 11 | ||||
-rw-r--r-- | src/H5EApkg.h | 9 | ||||
-rw-r--r-- | src/H5EAprivate.h | 27 | ||||
-rw-r--r-- | src/H5EAtest.c | 123 |
6 files changed, 238 insertions, 11 deletions
@@ -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) |