diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2009-09-24 20:30:47 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2009-09-24 20:30:47 (GMT) |
commit | 74c6507d9fcdb1c9d7057ac07dd04fac038b599e (patch) | |
tree | 80eddf92875cd2b2951b4da985942b07188c0101 /src | |
parent | d67bb5f13077b54ef8fd1e61520f60a5103cdcaa (diff) | |
download | hdf5-74c6507d9fcdb1c9d7057ac07dd04fac038b599e.zip hdf5-74c6507d9fcdb1c9d7057ac07dd04fac038b599e.tar.gz hdf5-74c6507d9fcdb1c9d7057ac07dd04fac038b599e.tar.bz2 |
[svn-r17518] Description:
Bring most of Vailin's changes to the fixed array data structure back
to the trunk, including new regression test for data structure.
Tested on:
FreeBSD/32 6.3 (duty) in debug mode
FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (jam) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/Intel compilers w/default API=1.6.x,
w/C++ & FORTRAN, in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in debug mode
Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode
Mac OS X/32 10.5.8 (amazon) in debug mode
Mac OS X/32 10.5.8 (amazon) w/C++ & FORTRAN, w/threadsafe,
in production mode
Diffstat (limited to 'src')
-rw-r--r-- | src/H5FA.c | 22 | ||||
-rw-r--r-- | src/H5FAcache.c | 19 | ||||
-rw-r--r-- | src/H5FAdbg.c | 74 | ||||
-rw-r--r-- | src/H5FAhdr.c | 4 | ||||
-rw-r--r-- | src/H5FApkg.h | 1 | ||||
-rw-r--r-- | src/H5FAprivate.h | 2 | ||||
-rw-r--r-- | src/H5FAtest.c | 3 |
7 files changed, 56 insertions, 69 deletions
@@ -361,16 +361,16 @@ HDfprintf(stderr, "%s: fixed array data block address not defined!\n", FUNC, idx else { /* paging */ size_t page_idx; /* Index of page within data block */ size_t dblk_page_nelmts; /* # of elements in a data block page */ - hsize_t elmt_idx; /* Element index within the page */ + size_t elmt_idx; /* Element index within the page */ haddr_t dblk_page_addr; /* Address of data block page */ /* Compute the page & element index */ - page_idx = (size_t)idx / dblock->dblk_page_nelmts; - elmt_idx = (size_t)idx % dblock->dblk_page_nelmts; + page_idx = (size_t)(idx / dblock->dblk_page_nelmts); + elmt_idx = (size_t)(idx % dblock->dblk_page_nelmts); /* Get the address of the data block page */ dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock) + - (page_idx * dblock->dblk_page_size); + ((hsize_t)page_idx * dblock->dblk_page_size); /* Check for using last page, to set the number of elements on the page */ if((page_idx + 1) == dblock->npages) @@ -378,7 +378,7 @@ HDfprintf(stderr, "%s: fixed array data block address not defined!\n", FUNC, idx else dblk_page_nelmts = dblock->dblk_page_nelmts; - /* Check if the page has been create yet */ + /* Check if the page has been created yet */ if(!H5V_bit_get(dblock->dblk_page_init, page_idx)) { /* Create the data block page */ if(H5FA__dblk_page_create(hdr, dxpl_id, dblk_page_addr, dblk_page_nelmts) < 0) @@ -468,7 +468,7 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx); size_t page_idx; /* Index of page within data block */ /* Compute the page index */ - page_idx = (size_t)idx / dblock->dblk_page_nelmts; + page_idx = (size_t)(idx / dblock->dblk_page_nelmts); /* Check if the page is defined yet */ if(!H5V_bit_get(dblock->dblk_page_init, page_idx)) { @@ -480,15 +480,15 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx); H5_LEAVE(SUCCEED) } /* end if */ else { /* get the page */ - hsize_t elmt_idx; /* Element index within the page */ - haddr_t dblk_page_addr; /* Address of data block page */ - size_t dblk_page_nelmts; /* # of elements in a data block page */ + size_t dblk_page_nelmts; /* # of elements in a data block page */ + size_t elmt_idx; /* Element index within the page */ + haddr_t dblk_page_addr; /* Address of data block page */ /* Compute the element index */ - elmt_idx = (size_t)idx % dblock->dblk_page_nelmts; + elmt_idx = (size_t)(idx % dblock->dblk_page_nelmts); /* Compute the address of the data block */ - dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock) + (page_idx * dblock->dblk_page_size); + dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock) + ((hsize_t)page_idx * dblock->dblk_page_size); /* Check for using last page, to set the number of elements on the page */ if((page_idx + 1) == dblock->npages) diff --git a/src/H5FAcache.c b/src/H5FAcache.c index 7a7e867..59a81e2 100644 --- a/src/H5FAcache.c +++ b/src/H5FAcache.c @@ -230,6 +230,25 @@ H5FA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_cls, hdr->stats.nelmts = hdr->cparam.nelmts; hdr->stats.hdr_size = hdr->size = size; /* Size of header in file */ + /* Check for data block */ + if(H5F_addr_defined(hdr->dblk_addr)) { + H5FA_dblock_t dblock; /* Fake data block for computing size */ + size_t dblk_page_nelmts; /* # of elements per data block page */ + + /* Set up fake data block for computing size on disk */ + dblock.hdr = hdr; + dblock.dblk_page_init_size = 0; + dblock.npages = 0; + dblk_page_nelmts = (size_t)1 << hdr->cparam.max_dblk_page_nelmts_bits; + if(hdr->cparam.nelmts > dblk_page_nelmts) { + dblock.npages = (size_t)(((hdr->cparam.nelmts + dblk_page_nelmts) - 1) / dblk_page_nelmts); + dblock.dblk_page_init_size = (dblock.npages + 7) / 8; + } /* end if */ + + /* Compute Fixed Array data block size for hdr statistics */ + hdr->stats.dblk_size = (size_t)H5FA_DBLOCK_SIZE(&dblock); + } /* end if */ + /* Sanity check */ /* (allow for checksum not decoded yet) */ HDassert((size_t)(p - buf) == (size - H5FA_SIZEOF_CHKSUM)); diff --git a/src/H5FAdbg.c b/src/H5FAdbg.c index b882c04..c1aa3d4 100644 --- a/src/H5FAdbg.c +++ b/src/H5FAdbg.c @@ -53,13 +53,6 @@ /* Local Typedefs */ /******************/ -/* Fixed array create/open user data */ -typedef struct ctx_ud_t { - const H5F_t *f; /* Pointer to file info */ - const H5O_layout_t *layout; /* Pointer to layout info */ -} ctx_ud_t; - - /********************/ /* Package Typedefs */ /********************/ @@ -105,9 +98,7 @@ H5FA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* Local variables */ H5FA_hdr_t *hdr = NULL; /* Shared fixed array header */ - H5O_loc_t obj_loc; /* Pointer to an object's location */ - H5O_layout_t layout; /* Layout message */ - ctx_ud_t udata; /* User data */ + void *dbg_ctx = NULL; /* Fixed array debugging context */ /* Check arguments */ HDassert(f); @@ -118,28 +109,15 @@ H5FA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, HDassert(fwidth >= 0); HDassert(cls); - H5O_loc_reset(&obj_loc); - obj_loc.file = f; - obj_loc.addr = obj_addr; - - /* Open the object header where the layout message resides */ - if(H5O_open(&obj_loc) < 0) - H5E_THROW(H5E_CANTPROTECT, "unable to open object header") - - /* Read the layout message */ - if(NULL == H5O_msg_read(&obj_loc, H5O_LAYOUT_ID, &layout, dxpl_id)) - H5E_THROW(H5E_CANTPROTECT, "unable to read layout message") - - /* close the object header */ - if(H5O_close(&obj_loc) < 0) - H5E_THROW(H5E_CANTPROTECT, "unable to close object header") - - /* Create user data */ - udata.f = f; - udata.layout = &layout; + /* Check for debugging context callback available */ + if(cls->crt_dbg_ctx) { + /* Create debugging context */ + if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr))) + H5E_THROW(H5E_CANTGET, "unable to create fixed array debugging context") + } /* end if */ /* Load the fixed array header */ - if(NULL == (hdr = (H5FA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FARRAY_HDR, addr, cls, &udata, H5AC_READ))) + if(NULL == (hdr = (H5FA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FARRAY_HDR, addr, cls, dbg_ctx, H5AC_READ))) H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header") /* Print opening message */ @@ -170,6 +148,8 @@ H5FA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, "Fixed Array Data Block Address:", hdr->dblk_addr); CATCH + if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0) + H5E_THROW(H5E_CANTRELEASE, "unable to release fixed array debugging context") if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FARRAY_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header") @@ -197,10 +177,8 @@ H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int inde /* Local variables */ H5FA_hdr_t *hdr = NULL; /* Shared fixed array header */ H5FA_dblock_t *dblock = NULL; /* Fixed array data block */ + void *dbg_ctx = NULL; /* Fixed array context */ size_t u; /* Local index variable */ - H5O_loc_t obj_loc; /* Pointer to an object's location */ - H5O_layout_t layout; /* Layout message */ - ctx_ud_t udata; /* User data */ /* Check arguments */ HDassert(f); @@ -212,28 +190,15 @@ H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int inde HDassert(H5F_addr_defined(hdr_addr)); HDassert(H5F_addr_defined(obj_addr)); - H5O_loc_reset(&obj_loc); - obj_loc.file = f; - obj_loc.addr = obj_addr; - - /* Open the object header where the layout message resides */ - if(H5O_open(&obj_loc) < 0) - H5E_THROW(H5E_CANTPROTECT, "unable to open object header") - - /* Read the layout message */ - if(NULL == H5O_msg_read(&obj_loc, H5O_LAYOUT_ID, &layout, dxpl_id)) - H5E_THROW(H5E_CANTPROTECT, "unable to read layout message") - - /* close the object header */ - if(H5O_close(&obj_loc) < 0) - H5E_THROW(H5E_CANTPROTECT, "unable to close object header") - - /* Create user data */ - udata.f = f; - udata.layout = &layout; + /* Check for debugging context callback available */ + if(cls->crt_dbg_ctx) { + /* Create debugging context */ + if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr))) + H5E_THROW(H5E_CANTGET, "unable to create fixed array debugging context") + } /* end if */ /* Load the fixed array header */ - if(NULL == (hdr = (H5FA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FARRAY_HDR, hdr_addr, cls, &udata, H5AC_READ))) + if(NULL == (hdr = (H5FA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FARRAY_HDR, hdr_addr, cls, dbg_ctx, H5AC_READ))) H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header") /* Protect data block */ @@ -243,7 +208,6 @@ H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int inde /* Print opening message */ HDfprintf(stream, "%*sFixed Array data Block...\n", indent, ""); - /* Print the values */ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Array class ID:", hdr->cparam.cls->name); @@ -312,6 +276,8 @@ H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int inde } /* end else */ CATCH + if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0) + H5E_THROW(H5E_CANTRELEASE, "unable to release fixed array debugging context") if(dblock && H5FA__dblock_unprotect(dblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block") if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FARRAY_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0) diff --git a/src/H5FAhdr.c b/src/H5FAhdr.c index 150742d..e6231d4 100644 --- a/src/H5FAhdr.c +++ b/src/H5FAhdr.c @@ -167,6 +167,10 @@ HDfprintf(stderr, "%s: Called\n", FUNC); /* Check for valid parameters */ if(cparam->raw_elmt_size == 0) H5E_THROW(H5E_BADVALUE, "element size must be greater than zero") + if(cparam->max_dblk_page_nelmts_bits == 0) + H5E_THROW(H5E_BADVALUE, "max. # of elements bits must be greater than zero") + if(cparam->nelmts == 0) + H5E_THROW(H5E_BADVALUE, "# of elements must be greater than zero") } #endif /* NDEBUG */ diff --git a/src/H5FApkg.h b/src/H5FApkg.h index 16d2518..1ba8f84 100644 --- a/src/H5FApkg.h +++ b/src/H5FApkg.h @@ -203,7 +203,6 @@ typedef struct H5FA_dblk_page_load_ud_t { } H5FA_dblk_page_load_ud_t; - /*****************************/ /* Package Private Variables */ /*****************************/ diff --git a/src/H5FAprivate.h b/src/H5FAprivate.h index 2450218..16397fd 100644 --- a/src/H5FAprivate.h +++ b/src/H5FAprivate.h @@ -70,6 +70,8 @@ typedef struct H5FA_class_t { herr_t (*encode)(void *raw, const void *elmt, size_t nelmts, void *ctx); /* Encode elements from native form to disk storage form */ herr_t (*decode)(const void *raw, void *elmt, size_t nelmts, void *ctx); /* Decode elements from disk storage form to native form */ herr_t (*debug)(FILE *stream, int indent, int fwidth, hsize_t idx, const void *elmt); /* Print an element for debugging */ + void *(*crt_dbg_ctx)(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr); /* Create debugging context */ + herr_t (*dst_dbg_ctx)(void *dbg_ctx); /* Destroy debugging context */ } H5FA_class_t; /* Fixed array creation parameters */ diff --git a/src/H5FAtest.c b/src/H5FAtest.c index c76c80b..70e21dc 100644 --- a/src/H5FAtest.c +++ b/src/H5FAtest.c @@ -134,9 +134,6 @@ H5FA__test_crt_context(void UNUSED *udata)) /* Local variables */ H5FA__test_ctx_t *ctx; /* Context for callbacks */ - /* Sanity checks */ - HDassert(udata); - /* Allocate new context structure */ if(NULL == (ctx = H5FL_MALLOC(H5FA__test_ctx_t))) H5E_THROW(H5E_CANTALLOC, "can't allocate fixed array client callback context") |