[svn-r15549] Description:

Initial checkin of extensible array data structure prototype code and
regression tests.

	Initial definitions for revised FUNC_ENTER/LEAVE and error reporting
macros, which are being vetted in the extensible array code.

	Minor warning and formatting cleanups in other sections of code.

Tested on:
        Mac OS X/32 10.5.4 (amazon) in debug mode
        Mac OS X/32 10.5.4 (amazon) w/C++ & FORTRAN, w/threadsafe,
                                in production mode
        FreeBSD/32 6.3 (duty) in debug mode
        FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
        Linux/32 2.6 (kagiso) 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 production mode
        Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode
This commit is contained in:
Quincey Koziol 2008-08-28 09:57:13 -05:00
parent d78821d619
commit aa03e8bc94
28 changed files with 2620 additions and 108 deletions

View File

@ -495,6 +495,13 @@
./src/H5Epubgen.h
./src/H5Epublic.h
./src/H5Eterm.h
./src/H5EA.c
./src/H5EAcache.c
./src/H5EAhdr.c
./src/H5EAint.c
./src/H5EApkg.h
./src/H5EAprivate.h
./src/H5EAtest.c
./src/H5F.c
./src/H5Fdbg.c
./src/H5Ffake.c
@ -767,6 +774,7 @@
./test/dt_arith.c
./test/dtypes.c
./test/dtransform.c
./test/earray.c
./test/enum.c
./test/extend.c
./test/external.c

View File

@ -491,6 +491,7 @@ static const char * H5AC_entry_type_names[H5AC_NTYPES] =
"free space sections",
"shared OH message master table",
"shared OH message index",
"extensible array headers",
"test entry" /* for testing only -- not used for actual files */
};

View File

@ -62,6 +62,7 @@ typedef enum {
H5AC_FSPACE_SINFO_ID,/*free space sections */
H5AC_SOHM_TABLE_ID, /*shared object header message master table */
H5AC_SOHM_LIST_ID, /*shared message index stored as a list */
H5AC_EARRAY_HDR_ID, /*extensible array header */
H5AC_TEST_ID, /*test entry -- not used for actual files */
H5AC_NTYPES /* Number of types, must be last */
} H5AC_type_t;

View File

@ -802,7 +802,7 @@
****************************************************************************/
#define H5C__H5C_T_MAGIC 0x005CAC0E
#define H5C__MAX_NUM_TYPE_IDS 16
#define H5C__MAX_NUM_TYPE_IDS 17
#define H5C__PREFIX_LEN 32
struct H5C_t

View File

@ -1301,6 +1301,11 @@ H5Epush2(hid_t err_stack, const char *file, const char *func, unsigned line,
if(maj_ptr->cls != min_ptr->cls)
HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "major and minor errors not from same error class")
/* Note that the variable-argument parsing for the format is identical in
* the H5E_printf_stack() routine - correct errors and make changes in both
* places. -QAK
*/
/* Format the description */
va_start(ap, fmt);

403
src/H5EA.c Normal file
View File

@ -0,0 +1,403 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5EA.c
* Jun 17 2008
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Implements an "extensible array" for storing elements
* in an array whose high bounds can extend and shrink.
*
* Please see the documentation in:
* doc/html/TechNotes/ExtensibleArray.html for a full
* description of how they work, etc.
*
*-------------------------------------------------------------------------
*/
/**********************/
/* Module Declaration */
/**********************/
#define H5EA_MODULE
/***********************/
/* Other Packages Used */
/***********************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5EApkg.h" /* Extensible Arrays */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/*********************/
/* Package Variables */
/*********************/
/* HDF5 API Entered variable */
/* (move to H5.c when new FUNC_ENTER macros in actual use -QAK) */
hbool_t H5_api_entered_g = FALSE;
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/* Declare a free list to manage the H5EA_t struct */
H5FL_DEFINE_STATIC(H5EA_t);
/*-------------------------------------------------------------------------
* Function: H5EA_create
*
* Purpose: Creates a new empty extensible array in the file.
*
* Return: Pointer to earray wrapper on success
* NULL on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Jun 17 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, ERR,
H5EA_t *, NULL, NULL,
H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam))
/* Local variables */
H5EA_t *ea = NULL; /* Pointer to new extensible array */
H5EA_hdr_t *hdr = NULL; /* The extensible array header information */
haddr_t ea_addr; /* Array header address */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(f);
HDassert(cparam);
/* Create extensible array header */
if(HADDR_UNDEF == (ea_addr = H5EA__hdr_create(f, dxpl_id, cparam)))
H5E_THROW(H5E_CANTINIT, "can't create extensible array header")
/* Allocate extensible array wrapper */
if(NULL == (ea = H5FL_MALLOC(H5EA_t)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array info")
/* Lock the array header into memory */
if(NULL == (hdr = (H5EA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_EARRAY_HDR, ea_addr, NULL, NULL, H5AC_WRITE)))
H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
/* Point extensible array wrapper at header and bump it's ref count */
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_create() */
/*-------------------------------------------------------------------------
* Function: H5EA_get_nelmts
*
* Purpose: Query the current number of elements in array
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 21 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, NOERR,
herr_t, SUCCEED, -,
H5EA_get_nelmts(const H5EA_t *ea, hsize_t *nelmts))
/* Local variables */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(ea);
HDassert(nelmts);
/* Placeholder value */
*nelmts = 0;
END_FUNC(PRIV) /* end H5EA_get_nelmts() */
/*-------------------------------------------------------------------------
* Function: H5EA_get_addr
*
* Purpose: Query the address of the array
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 21 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, NOERR,
herr_t, SUCCEED, -,
H5EA_get_addr(const H5EA_t *ea, haddr_t *addr))
/* Local variables */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(ea);
HDassert(ea->hdr);
HDassert(addr);
/* Retrieve the address of the extensible array's header */
*addr = ea->hdr->addr;
END_FUNC(PRIV) /* end H5EA_get_addr() */
/*-------------------------------------------------------------------------
* Function: H5EA_get_stats
*
* Purpose: Query the metadata stats of an array
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 21 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, NOERR,
herr_t, SUCCEED, -,
H5EA_get_stats(const H5EA_t *ea, H5EA_stat_t *stats))
/* Local variables */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(ea);
HDassert(stats);
/* Placeholder value */
HDmemset(stats, 0, sizeof(*stats));
END_FUNC(PRIV) /* end H5EA_get_stats() */
/*-------------------------------------------------------------------------
* Function: H5EA_delete
*
* Purpose: Delete an extensible array
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 28 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, ERR,
herr_t, SUCCEED, FAIL,
H5EA_delete(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr))
/* Local variables */
H5EA_hdr_t *hdr = NULL; /* The fractal heap header information */
/*
* Check arguments.
*/
HDassert(f);
HDassert(H5F_addr_defined(ea_addr));
/* Lock 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_WRITE)))
H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array header, address = %llu", (unsigned long_long)ea_addr)
/* Check for files using shared array header */
if(hdr->file_rc)
hdr->pending_delete = TRUE;
else {
/* Set the shared array header's file context for this operation */
hdr->f = f;
/* Delete array now, starting with header (unprotects header) */
if(H5EA__hdr_delete(hdr, dxpl_id) < 0)
H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array")
hdr = NULL;
} /* end if */
CATCH
/* Unprotect the header, if an error occurred */
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")
END_FUNC(PRIV) /* end H5EA_delete() */
/*-------------------------------------------------------------------------
* Function: H5EA_close
*
* Purpose: Close an extensible array
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 21 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, ERR,
herr_t, SUCCEED, FAIL,
H5EA_close(H5EA_t *ea, hid_t dxpl_id))
/* Local variables */
hbool_t pending_delete = FALSE; /* Whether the array is pending deletion */
haddr_t ea_addr = HADDR_UNDEF; /* Address of array (for deletion) */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(ea);
/* Decrement file reference & check if this is the last open extensible array using the shared array header */
if(0 == H5EA__hdr_fuse_decr(ea->hdr)) {
/* Set the shared array header's file context for this operation */
ea->hdr->f = ea->f;
/* Shut down anything that can't be put in the header's 'flush' callback */
/* Check for pending array deletion */
if(ea->hdr->pending_delete) {
/* Set local info, so array deletion can occur after decrementing the
* header's ref count
*/
pending_delete = TRUE;
ea_addr = ea->hdr->addr;
} /* end if */
} /* end if */
/* Decrement the reference count on the array header */
/* (don't put in H5EA_hdr_fuse_decr() as the array header may be evicted
* immediately -QAK)
*/
if(H5EA__hdr_decr(ea->hdr) < 0)
H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
/* Check for pending array deletion */
if(pending_delete) {
H5EA_hdr_t *hdr; /* Another pointer to extensible array header */
/* Lock the array header into memory */
if(NULL == (hdr = (H5EA_hdr_t *)H5AC_protect(ea->f, dxpl_id, H5AC_EARRAY_HDR, ea_addr, NULL, NULL, H5AC_WRITE)))
H5E_THROW(H5E_CANTLOAD, "unable to load extensible array header")
/* Set the shared array header's file context for this operation */
hdr->f = ea->f;
/* Delete array, starting with header (unprotects header) */
if(H5EA__hdr_delete(hdr, dxpl_id) < 0)
H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array")
} /* end if */
/* Release the extensible array wrapper */
(void)H5FL_FREE(H5EA_t, ea);
CATCH
END_FUNC(PRIV) /* end H5EA_close() */

392
src/H5EAcache.c Normal file
View File

@ -0,0 +1,392 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5EAcache.c
* Aug 26 2008
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Implement extensible array metadata cache methods.
*
*-------------------------------------------------------------------------
*/
/**********************/
/* Module Declaration */
/**********************/
#define H5EA_MODULE
/***********************/
/* Other Packages Used */
/***********************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5EApkg.h" /* Extensible Arrays */
#include "H5MFprivate.h" /* File memory management */
#include "H5WBprivate.h" /* Wrapped Buffers */
/****************/
/* Local Macros */
/****************/
/* Fractal heap format version #'s */
#define H5EA_HDR_VERSION 0 /* Header */
/* Size of stack buffer for serialized headers */
#define H5EA_HDR_BUF_SIZE 512
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/* Metadata cache (H5AC) callbacks */
static H5EA_hdr_t *H5EA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *udata, void *udata2);
static herr_t H5EA__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5EA_hdr_t *hdr, unsigned UNUSED * flags_ptr);
static herr_t H5EA__cache_hdr_clear(H5F_t *f, H5EA_hdr_t *hdr, hbool_t destroy);
static herr_t H5EA__cache_hdr_size(const H5F_t *f, const H5EA_hdr_t *hdr, size_t *size_ptr);
/*********************/
/* Package Variables */
/*********************/
/* H5EA header inherits cache-like properties from H5AC */
const H5AC_class_t H5AC_EARRAY_HDR[1] = {{
H5AC_EARRAY_HDR_ID,
(H5AC_load_func_t)H5EA__cache_hdr_load,
(H5AC_flush_func_t)H5EA__cache_hdr_flush,
(H5AC_dest_func_t)H5EA__cache_hdr_dest,
(H5AC_clear_func_t)H5EA__cache_hdr_clear,
(H5AC_size_func_t)H5EA__cache_hdr_size,
}};
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/*-------------------------------------------------------------------------
* Function: H5EA_cache_hdr_load
*
* Purpose: Loads an extensible array header from the disk.
*
* Return: Success: Pointer to a new extensible array
* Failure: NULL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(STATIC, ERR,
H5EA_hdr_t *, NULL, NULL,
H5EA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED *udata1, void UNUSED *udata2))
H5EA_hdr_t *hdr = NULL; /* Fractal heap info */
size_t size; /* Header size */
H5WB_t *wb = NULL; /* Wrapped buffer for header data */
uint8_t hdr_buf[H5EA_HDR_BUF_SIZE]; /* Buffer for header */
uint8_t *buf; /* Pointer to header buffer */
const uint8_t *p; /* Pointer into raw data buffer */
uint32_t stored_chksum; /* Stored metadata checksum value */
uint32_t computed_chksum; /* Computed metadata checksum value */
/* Check arguments */
HDassert(f);
HDassert(H5F_addr_defined(addr));
/* Allocate space for the extensible array data structure */
if(NULL == (hdr = H5EA__hdr_alloc(f)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
/* Set the extensible array header's address */
hdr->addr = addr;
/* Wrap the local buffer for serialized header info */
if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
H5E_THROW(H5E_CANTINIT, "can't wrap buffer")
/* Compute the 'base' size of the fractal heap header on disk */
size = H5EA_HEADER_SIZE(hdr);
/* Get a pointer to a buffer that's large enough for serialized header */
if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
H5E_THROW(H5E_CANTGET, "can't get actual buffer")
/* Read header from disk */
if(H5F_block_read(f, H5FD_MEM_EARRAY_HDR, addr, size, dxpl_id, buf) < 0)
H5E_THROW(H5E_READERROR, "can't read extensible array header")
/* Get temporary pointer to serialized header */
p = buf;
/* Magic number */
if(HDmemcmp(p, H5EA_HDR_MAGIC, (size_t)H5EA_SIZEOF_MAGIC))
H5E_THROW(H5E_BADVALUE, "wrong extensible array header signature")
p += H5EA_SIZEOF_MAGIC;
/* Version */
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) */
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 */
/* Sanity check */
/* (allow for checksum not decoded yet) */
HDassert((size_t)(p - buf) == (size - H5EA_SIZEOF_CHKSUM));
/* Set the array header's size */
hdr->size = size;
/* Compute checksum on entire header */
/* (including the filter information, if present) */
computed_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
/* Metadata checksum */
UINT32DECODE(p, stored_chksum);
/* Sanity check */
HDassert((size_t)(p - buf) == hdr->size);
/* Verify checksum */
if(stored_chksum != computed_chksum)
H5E_THROW(H5E_BADVALUE, "incorrect metadata checksum for extensible array header")
/* Set return value */
ret_value = hdr;
CATCH
/* Release resources */
if(wb && H5WB_unwrap(wb) < 0)
H5E_THROW(H5E_CLOSEERROR, "can't close wrapped buffer")
if(!ret_value)
if(hdr && H5EA__cache_hdr_dest(f, hdr) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
END_FUNC(STATIC) /* end H5EA__cache_hdr_load() */
/*-------------------------------------------------------------------------
* Function: H5EA__cache_hdr_flush
*
* Purpose: Flushes a dirty extensible array header to disk.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5EA_hdr_t *hdr, unsigned UNUSED * flags_ptr))
H5WB_t *wb = NULL; /* Wrapped buffer for header data */
uint8_t hdr_buf[H5EA_HDR_BUF_SIZE]; /* Buffer for header */
/* check arguments */
HDassert(f);
HDassert(H5F_addr_defined(addr));
HDassert(hdr);
if(hdr->cache_info.is_dirty) {
uint8_t *buf; /* Temporary raw data buffer */
uint8_t *p; /* Pointer into raw data buffer */
size_t size; /* Header size on disk */
uint32_t metadata_chksum; /* Computed metadata checksum value */
/* Wrap the local buffer for serialized header info */
if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
H5E_THROW(H5E_CANTINIT, "can't wrap buffer")
/* Compute the size of the heap header on disk */
size = hdr->size;
/* Get a pointer to a buffer that's large enough for serialized header */
if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
H5E_THROW(H5E_CANTGET, "can't get actual buffer")
/* Get temporary pointer to serialized header */
p = buf;
/* Magic number */
HDmemcpy(p, H5EA_HDR_MAGIC, (size_t)H5EA_SIZEOF_MAGIC);
p += H5EA_SIZEOF_MAGIC;
/* Version # */
*p++ = H5EA_HDR_VERSION;
/* General array information */
*p++ = hdr->elmt_size; /* Element size (in bytes) */
*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 */
/* Compute metadata checksum */
metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
/* Metadata checksum */
UINT32ENCODE(p, metadata_chksum);
/* Write the array header. */
HDassert((size_t)(p - buf) == size);
if(H5F_block_write(f, H5FD_MEM_EARRAY_HDR, addr, size, dxpl_id, buf) < 0)
H5E_THROW(H5E_WRITEERROR, "unable to save extensible array header to disk")
hdr->cache_info.is_dirty = FALSE;
} /* end if */
if(destroy)
if(H5EA__cache_hdr_dest(f, hdr) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
CATCH
/* Release resources */
if(wb && H5WB_unwrap(wb) < 0)
H5E_THROW(H5E_CLOSEERROR, "can't close wrapped buffer")
END_FUNC(STATIC) /* end H5EA__cache_hdr_flush() */
/*-------------------------------------------------------------------------
* Function: H5EA__cache_hdr_dest
*
* Purpose: Destroys a extensible array header in memory.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
/* ARGSUSED */
BEGIN_FUNC(PKG, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_hdr_dest(H5F_t UNUSED *f, H5EA_hdr_t *hdr))
/*
* Check arguments.
*/
HDassert(hdr);
HDassert(hdr->rc == 0);
/* Free the shared info itself */
(void)H5FL_FREE(H5EA_hdr_t, hdr);
END_FUNC(PKG) /* end H5EA__cache_hdr_dest() */
/*-------------------------------------------------------------------------
* Function: H5EA__cache_hdr_clear
*
* Purpose: Mark a extensible array header in memory as non-dirty.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(STATIC, ERR,
herr_t, SUCCEED, FAIL,
H5EA__cache_hdr_clear(H5F_t *f, H5EA_hdr_t *hdr, hbool_t destroy))
/*
* Check arguments.
*/
HDassert(hdr);
/* Reset the dirty flag. */
hdr->cache_info.is_dirty = FALSE;
if(destroy)
if(H5EA__cache_hdr_dest(f, hdr) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
CATCH
END_FUNC(STATIC) /* end H5EA__cache_hdr_clear() */
/*-------------------------------------------------------------------------
* Function: H5EA__cache_hdr_size
*
* Purpose: Compute the size in bytes of a extensible array header
* on disk, and return it in *size_ptr. On failure,
* the value of *size_ptr is undefined.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
/* ARGSUSED */
BEGIN_FUNC(STATIC, NOERR,
herr_t, SUCCEED, -,
H5EA__cache_hdr_size(const H5F_t UNUSED *f, const H5EA_hdr_t *hdr, size_t *size_ptr))
/* check arguments */
HDassert(f);
HDassert(hdr);
HDassert(size_ptr);
/* Set size value */
*size_ptr = hdr->size;
END_FUNC(STATIC) /* end H5EA__cache_hdr_size() */

413
src/H5EAhdr.c Normal file
View File

@ -0,0 +1,413 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5EAhdr.c
* Aug 26 2008
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Array header routines for extensible arrays.
*
*-------------------------------------------------------------------------
*/
/**********************/
/* Module Declaration */
/**********************/
#define H5EA_MODULE
/***********************/
/* Other Packages Used */
/***********************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5EApkg.h" /* Extensible Arrays */
#include "H5MFprivate.h" /* File memory management */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/*********************/
/* Package Variables */
/*********************/
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/* Declare a free list to manage the H5EA_hdr_t struct */
H5FL_DEFINE(H5EA_hdr_t);
/*-------------------------------------------------------------------------
* Function: H5EA__hdr_alloc
*
* Purpose: Allocate shared extensible array header
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, ERR,
H5EA_hdr_t *, NULL, NULL,
H5EA__hdr_alloc(H5F_t *f))
H5EA_hdr_t *hdr = NULL; /* Shared fractal heap header */
/*
* Check arguments.
*/
HDassert(f);
/* Allocate space for the shared information */
if(NULL == (hdr = H5FL_CALLOC(H5EA_hdr_t)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
/* Set the internal parameters for the array */
hdr->f = f;
/* Set the return value */
ret_value = hdr;
CATCH
if(!ret_value)
if(hdr && H5EA__cache_hdr_dest(f, hdr) < 0)
H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
END_FUNC(PKG) /* end H5EA__hdr_alloc() */
/*-------------------------------------------------------------------------
* Function: H5EA_hdr_create
*
* Purpose: Creates a new extensible array header in the file
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Jun 17 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, ERR,
haddr_t, HADDR_UNDEF, HADDR_UNDEF,
H5EA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam))
H5EA_hdr_t *hdr; /* Extensible array header */
#ifdef QAK
HDfprintf(stderr, "%s: Called\n", FUNC);
#endif /* QAK */
/*
* Check arguments.
*/
HDassert(f);
HDassert(cparam);
#ifndef NDEBUG
/* Check for valid parameters */
if(cparam->elmt_size == 0)
H5E_THROW(H5E_BADVALUE, "element size must be greater than zero")
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))
H5E_THROW(H5E_BADVALUE, "min # of elements per data block not power of two")
#endif /* NDEBUG */
/* Allocate space for the shared information */
if(NULL == (hdr = H5EA__hdr_alloc(f)))
H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
/* Set the internal parameters for the array */
/* Set the creation parameters for the array */
hdr->elmt_size = cparam->elmt_size;
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;
/* Set size of header on disk */
hdr->size = H5EA_HEADER_SIZE(hdr);
/* Allocate space for the header on disk */
if(HADDR_UNDEF == (hdr->addr = H5MF_alloc(f, H5FD_MEM_EARRAY_HDR, dxpl_id, hdr->size)))
H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array header")
/* Cache the new extensible array header */
if(H5AC_set(f, dxpl_id, H5AC_EARRAY_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
H5E_THROW(H5E_CANTINSERT, "can't add extensible array header to cache")
/* Set address of array header to return */
ret_value = hdr->addr;
CATCH
END_FUNC(PKG) /* end H5EA__hdr_create() */
/*-------------------------------------------------------------------------
* Function: H5EA_hdr_incr
*
* Purpose: Increment component reference count on shared array header
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, ERR,
herr_t, SUCCEED, FAIL,
H5EA__hdr_incr(H5EA_hdr_t *hdr))
/* Sanity check */
HDassert(hdr);
/* Mark header as un-evictable when something is depending on it */
if(hdr->rc == 0)
if(H5AC_pin_protected_entry(hdr->f, hdr) < 0)
H5E_THROW(H5E_CANTPIN, "unable to pin extensible array header")
/* Increment reference count on shared header */
hdr->rc++;
CATCH
END_FUNC(PKG) /* end H5EA__hdr_incr() */
/*-------------------------------------------------------------------------
* Function: H5EA_hdr_decr
*
* Purpose: Decrement component reference count on shared array header
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, ERR,
herr_t, SUCCEED, FAIL,
H5EA__hdr_decr(H5EA_hdr_t *hdr))
/* Sanity check */
HDassert(hdr);
HDassert(hdr->rc);
/* Decrement reference count on shared header */
hdr->rc--;
/* Mark header as evictable again when nothing depend on it */
if(hdr->rc == 0) {
HDassert(hdr->file_rc == 0);
if(H5AC_unpin_entry(hdr->f, hdr) < 0)
H5E_THROW(H5E_CANTUNPIN, "unable to unpin extensible array header")
} /* end if */
CATCH
END_FUNC(PKG) /* end H5EA__hdr_decr() */
/*-------------------------------------------------------------------------
* Function: H5EA_hdr_fuse_incr
*
* Purpose: Increment file reference count on shared array header
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, NOERR,
herr_t, SUCCEED, -,
H5EA__hdr_fuse_incr(H5EA_hdr_t *hdr))
/* Sanity check */
HDassert(hdr);
/* Increment file reference count on shared header */
hdr->file_rc++;
END_FUNC(PKG) /* end H5EA__hdr_fuse_incr() */
/*-------------------------------------------------------------------------
* Function: H5EA_hdr_fuse_decr
*
* Purpose: Decrement file reference count on shared array header
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, NOERR,
size_t, 0, -,
H5EA__hdr_fuse_decr(H5EA_hdr_t *hdr))
/* Sanity check */
HDassert(hdr);
HDassert(hdr->file_rc);
/* Decrement file reference count on shared header */
hdr->file_rc--;
/* Set return value */
ret_value = hdr->file_rc;
END_FUNC(PKG) /* end H5EA__hdr_fuse_decr() */
/*-------------------------------------------------------------------------
* Function: H5EA__hdr_delete
*
* Purpose: Delete an extensible array, starting with the header
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* koziol@hdfgroup.org
* Aug 26 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PKG, ERR,
herr_t, SUCCEED, FAIL,
H5EA__hdr_delete(H5EA_hdr_t *hdr, hid_t dxpl_id))
/*
* Check arguments.
*/
HDassert(hdr);
HDassert(!hdr->file_rc);
#ifndef NDEBUG
{
unsigned hdr_status = 0; /* Array header's status in the metadata cache */
/* Check the array header's status in the metadata cache */
if(H5AC_get_entry_status(hdr->f, hdr->addr, &hdr_status) < 0)
H5E_THROW(H5E_CANTGET, "unable to check metadata cache status for array header")
/* Sanity checks on array header */
HDassert(hdr_status & H5AC_ES__IN_CACHE);
HDassert(hdr_status & H5AC_ES__IS_PROTECTED);
} /* end block */
#endif /* NDEBUG */
#ifdef LATER
/* Check for root direct/indirect block */
if(H5F_addr_defined(hdr->man_dtable.table_addr)) {
#ifdef QAK
HDfprintf(stderr, "%s: hdr->man_dtable.table_addr = %a\n", FUNC, hdr->man_dtable.table_addr);
#endif /* QAK */
if(hdr->man_dtable.curr_root_rows == 0) {
hsize_t dblock_size; /* Size of direct block */
/* Check for I/O filters on this heap */
if(hdr->filter_len > 0) {
dblock_size = (hsize_t)hdr->pline_root_direct_size;
#ifdef QAK
HDfprintf(stderr, "%s: hdr->pline_root_direct_size = %Zu\n", FUNC, hdr->pline_root_direct_size);
#endif /* QAK */
/* Reset the header's pipeline information */
hdr->pline_root_direct_size = 0;
hdr->pline_root_direct_filter_mask = 0;
} /* end else */
else
dblock_size = (hsize_t)hdr->man_dtable.cparam.start_block_size;
/* Delete root direct block */
if(H5HF_man_dblock_delete(hdr->f, dxpl_id, hdr->man_dtable.table_addr, dblock_size) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap root direct block")
} /* end if */
else {
/* Delete root indirect block */
if(H5HF_man_iblock_delete(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.curr_root_rows, NULL, 0) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap root indirect block")
} /* end else */
} /* end if */
#endif /* LATER */
/* Release header's disk space */
if(H5MF_xfree(hdr->f, H5FD_MEM_EARRAY_HDR, dxpl_id, hdr->addr, (hsize_t)hdr->size) < 0)
H5E_THROW(H5E_CANTFREE, "unable to release extensible array header")
/* Finished deleting header */
if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_HDR, hdr->addr, hdr, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG) < 0)
H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
hdr = NULL;
CATCH
/* Unprotect the header, if an error occurred */
if(hdr && H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
END_FUNC(PKG) /* end H5EA__hdr_delete() */

81
src/H5EAint.c Normal file
View File

@ -0,0 +1,81 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5EAint.c
* Jun 17 2008
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Internal routines for extnsible arrays.
*
*-------------------------------------------------------------------------
*/
/**********************/
/* Module Declaration */
/**********************/
#define H5EA_MODULE
/***********************/
/* Other Packages Used */
/***********************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5EApkg.h" /* Extensible Arrays */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/*********************/
/* Package Variables */
/*********************/
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/

440
src/H5EApkg.h Normal file
View File

@ -0,0 +1,440 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Programmer: Quincey Koziol <koziol@hdfgroup.org>
* Tuesday, June 17, 2008
*
* Purpose: This file contains declarations which are visible only within
* the H5EA package. Source files outside the H5EA package should
* include H5EAprivate.h instead.
*/
#if !(defined(H5EA_PACKAGE) | defined(H5EA_MODULE))
#error "Do not include this file outside the H5EA package!"
#endif
#ifndef _H5EApkg_H
#define _H5EApkg_H
/* Get package's private header */
#include "H5EAprivate.h"
/* Other private headers needed by this file */
#include "H5ACprivate.h" /* Metadata cache */
#include "H5FLprivate.h" /* Free Lists */
/************************************************/
/* Revisions to FUNC_ENTER/LEAVE & Error Macros */
/************************************************/
#ifndef NDEBUG
/* `S' is the name of a function which is being tested to check if it's */
/* a public API function */
#define H5_IS_PUB(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && HDislower(S[2])) || \
((HDisdigit(S[2]) || HDisupper(S[2])) && HDislower(S[3])) || \
(!S[4] || ((HDisdigit(S[3]) || HDisupper(S[3])) && HDislower(S[4]))))
/* `S' is the name of a function which is being tested to check if it's */
/* a private library function */
#define H5_IS_PRIV(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && '_' == S[2] && HDislower(S[3])) || \
((HDisdigit(S[2]) || HDisupper(S[2])) && '_' == S[3] && HDislower(S[4])) || \
((HDisdigit(S[3]) || HDisupper(S[3])) && '_' == S[4] && HDislower(S[5])))
/* `S' is the name of a function which is being tested to check if it's */
/* a package private function */
#define H5_IS_PKG(S) (((HDisdigit(S[1]) || HDisupper(S[1])) && '_' == S[2] && '_' == S[3] && HDislower(S[4])) || \
((HDisdigit(S[2]) || HDisupper(S[2])) && '_' == S[3] && '_' == S[4] && HDislower(S[5])) || \
((HDisdigit(S[3]) || HDisupper(S[3])) && '_' == S[4] && '_' == S[5] && HDislower(S[6])))
#define FUNC_ENTER_NAME_CHECK(asrt) \
{ \
static hbool_t func_check = FALSE; \
\
if(!func_check) { \
/* Check function naming status */ \
HDassert(asrt); \
\
/* Don't check again */ \
func_check = TRUE; \
} /* end if */ \
} /* end scope */
#else /* NDEBUG */
#define FUNC_ENTER_NAME_CHECK(asrt)
#define H5_IS_PUB(S)
#define H5_IS_PRIV(S)
#define H5_IS_PKG(S)
#endif /* NDEBUG */
/* Macro for referencing package initialization variables */
#define H5_PACKAGE_INIT_VAR(x) H5_GLUE3(H5_, x, _init_g)
/* Macros to check if a package is initialized */
#define H5_CHECK_PACKAGE_INIT_REG_YES(asrt) HDassert(H5_PACKAGE_INIT_VAR(pkg));
#define H5_CHECK_PACKAGE_INIT_REG_NO(asrt)
#define H5_CHECK_PACKAGE_INIT_INIT_YES(asrt)
#define H5_CHECK_PACKAGE_INIT_INIT_NO(asrt)
/* Macros to initialize package, if a package initialization routine is defined */
#define H5_PKG_YES_INIT(pkg) \
if(!H5_PACKAGE_INIT_VAR(pkg)) { \
if(H5_GLUE(pkg, _pkg_init)() < 0) { \
/* (Can't use H5E_THROW here) */ \
H5E_PRINTF(H5E_CANTINIT, "interface initialization failed"); \
ret_value = fail_value; \
goto func_init_failed; \
} /* end if */ \
} /* end if */
#define H5_PKG_NO_INIT(pkg)
/* Macros to declare package initialization variable, if a package initialization routine is defined */
#define H5_PKG_YES_INIT_VAR(pkg) extern hbool_t H5_PACKAGE_INIT_VAR(H5_MY_PKG);
#define H5_PKG_NO_INIT_VAR(pkg)
/* Declare package initialization variable (if in a package) */
#define H5_DECLARE_PKG_VAR(pkg_init, pkg) H5_GLUE3(H5_PKG_, pkg_init, _INIT_VAR)(pkg)
#ifdef H5_MY_PKG
H5_DECLARE_PKG_VAR(H5_MY_PKG_INIT, H5_MY_PKG)
#endif /* H5_MY_PKG */
/* API re-entrance variable */
extern hbool_t H5_api_entered_g; /* Has library already been entered through API? */
/* Macros for entering different scopes of routines */
#define H5_PACKAGE_ENTER(pkg, pkg_init, init) \
FUNC_ENTER_NAME_CHECK(H5_IS_PKG(__func__)) \
\
/* The library should be initialized already */ \
HDassert(H5_INIT_GLOBAL); \
\
/* This interface should be initialized already */ \
/* (except for package initialization routines :-) */ \
H5_GLUE4(H5_CHECK_PACKAGE_INIT_, init, _, pkg_init)(pkg) \
\
/* Push the name of this function on the function stack */ \
H5_PUSH_FUNC(__func__) \
\
/* Enter scope for this type of function */ \
{
#define H5_PRIVATE_ENTER(pkg, pkg_init) \
FUNC_ENTER_NAME_CHECK(H5_IS_PRIV(__func__)) \
\
/* The library should be initialized already */ \
HDassert(H5_INIT_GLOBAL); \
\
/* Initialize this interface if desired */ \
H5_GLUE3(H5_PKG_, pkg_init, _INIT)(pkg) \
\
/* Push the name of this function on the function stack */ \
H5_PUSH_FUNC(__func__) \
\
/* Enter scope for this type of function */ \
{{
/* Remove this shim and change H5TRACE* macros when this change is permanent -QAK */
#ifdef H5_DEBUG_API
#define FUNC __func__
#endif
#define H5_PUBLIC_ENTER(pkg, pkg_init) \
FUNC_ENTER_API_VARS(__func__) \
FUNC_ENTER_API_THREADSAFE; \
FUNC_ENTER_NAME_CHECK(H5_IS_PUB(__func__)) \
\
/* Clear thread error stack when entering public functions */ \
H5E_clear_stack(NULL); \
\
/* Initialize the library or bust */ \
if(!(H5_INIT_GLOBAL)) { \
H5_INIT_GLOBAL = TRUE; \
if(H5_init_library() < 0) { \
/* (Can't use H5E_THROW here) */ \
H5E_PRINTF(H5E_CANTINIT, "interface initialization failed"); \
ret_value = fail_value; \
goto func_init_failed; \
} /* end if */ \
} /* end if */ \
\
/* Initialize this interface if desired */ \
H5_GLUE3(H5_PKG_, pkg_init, _INIT)(pkg) \
\
/* Check for re-entering API routine */ \
HDassert(!H5_api_entered_g); \
H5_api_entered_g = TRUE; \
\
/* Start logging MPI's MPE information */ \
BEGIN_MPE_LOG(__func__) \
\
/* Push the name of this function on the function stack */ \
H5_PUSH_FUNC(__func__) \
\
/* Enter scope for this type of function */ \
{{{
/* Macros for substituting the package name */
#define FUNC_ENTER_STATIC H5_PACKAGE_ENTER(H5_MY_PKG, H5_MY_PKG_INIT, REG)
#define FUNC_ENTER_PKGINIT H5_PACKAGE_ENTER(H5_MY_PKG, H5_MY_PKG_INIT, INIT)
#define FUNC_ENTER_PKG H5_PACKAGE_ENTER(H5_MY_PKG, H5_MY_PKG_INIT, REG)
#define FUNC_ENTER_PRIV H5_PRIVATE_ENTER(H5_MY_PKG, H5_MY_PKG_INIT)
#define FUNC_ENTER_PUB H5_PUBLIC_ENTER(H5_MY_PKG, H5_MY_PKG_INIT)
/* Macros for substituting a function prefix */
#define FUNC_PREFIX_STATIC static
#define FUNC_PREFIX_PKGINIT
#define FUNC_PREFIX_PKG
#define FUNC_PREFIX_PRIV
#define FUNC_PREFIX_PUB
/* Macros for declaring error variables */
#define FUNC_ERR_VAR_ERR(ret_typ, err) \
hbool_t past_catch = FALSE; \
ret_typ fail_value = err;
#define FUNC_ERR_VAR_ERRCATCH(ret_typ, err) \
hbool_t past_catch = FALSE;
#define FUNC_ERR_VAR_NOERR(ret_typ, err)
/* Use this macro when entering all functions */
#define BEGIN_FUNC(scope, use_err, ret_typ, ret_init, err, func) \
H5_GLUE(FUNC_PREFIX_, scope) \
ret_typ \
func \
/* Open function */ \
{ \
ret_typ ret_value = ret_init; \
H5_GLUE(FUNC_ERR_VAR_, use_err)(ret_typ, err) \
H5_GLUE(FUNC_ENTER_, scope)
/* Macros for label when a function initialization can fail */
#define H5_PRIV_YES_FUNC_INIT_FAILED func_init_failed:
#define H5_PRIV_NO_FUNC_INIT_FAILED
#define H5_PRIV_FUNC_INIT_FAILED(pkg_init) H5_GLUE3(H5_PRIV_, pkg_init, _FUNC_INIT_FAILED)
/* Macros for leaving different scopes of routines */
#define FUNC_LEAVE_STATIC \
/* Leave scope for this type of function */ \
} \
\
/* Pop the name of this function off the function stack */ \
H5_POP_FUNC
#define FUNC_LEAVE_PKG \
/* Leave scope for this type of function */ \
} \
\
/* Pop the name of this function off the function stack */ \
H5_POP_FUNC
#define FUNC_LEAVE_PRIV \
/* Leave scope for this type of function */ \
}} \
\
/* Label for errors during FUNC_ENTER */ \
H5_PRIV_FUNC_INIT_FAILED(H5_MY_PKG_INIT) \
\
/* Pop the name of this function off the function stack */ \
H5_POP_FUNC
#define FUNC_LEAVE_PUB \
/* Leave scope for this type of function */ \
}}} \
\
/* Label for errors during FUNC_ENTER */ \
func_init_failed: \
\
/* Dump error stack if an error occurred during API routine */ \
if(ret_value == fail_value) \
(void)H5E_dump_api_stack(TRUE); \
\
/* Finish the API tracing info */ \
H5TRACE_RETURN(ret_value); \
\
/* Pop the name of this function off the function stack */ \
H5_POP_FUNC \
\
/* Finish the MPE tracing info */ \
FINISH_MPE_LOG; \
\
/* Check for leaving API routine */ \
HDassert(H5_api_entered_g); \
H5_api_entered_g = FALSE; \
\
/* Release thread-safety semaphore */ \
FUNC_LEAVE_API_THREADSAFE
/* Use this macro when leaving all functions */
#define END_FUNC(scope) \
/* Scope-specific function conclusion */ \
H5_GLUE(FUNC_LEAVE_, scope) \
\
/* Leave routine */ \
return(ret_value); \
\
/* Close Function */ \
}
/*
* H5E_PRINTF macro, used to facilitate error reporting between a BEGIN_FUNC()
* and an END_FUNC() within a function body. The arguments are the minor
* error number, a description of the error (as a printf-like format string),
* and an optional set of arguments for the printf format arguments.
*/
#define H5E_PRINTF(...) H5E_printf_stack(NULL, __FILE__, __func__, __LINE__, H5E_ERR_CLS_g, H5_MY_PKG_ERR, __VA_ARGS__)
/*
* H5_LEAVE macro, used to facilitate control flow between a
* BEGIN_FUNC() and an END_FUNC() within a function body. The argument is
* the return value.
* The return value is assigned to a variable `ret_value' and control branches
* to the `catch' label, if we're not already past it.
*/
#define H5_LEAVE(v) { \
ret_value = v; \
if(!past_catch) \
goto catch; \
}
/*
* H5E_THROW macro, used to facilitate error reporting between a
* FUNC_ENTER() and a FUNC_LEAVE() within a function body. The arguments are
* the minor error number, and an error string.
* The return value is assigned to a variable `ret_value' and control branches
* to the `catch' label, if we're not already past it.
*/
#define H5E_THROW(...) { \
H5E_PRINTF(__VA_ARGS__); \
H5_LEAVE(fail_value) \
}
/* Macro for "catching" flow of control when an error occurs. Note that the
* H5_LEAVE macro won't jump back here once it's past this point.
*/
#define CATCH past_catch = TRUE; catch:;
/**************************/
/* Package Private Macros */
/**************************/
/* If this package header is being included in one of the H5EA modules, define
* the proper control macros for the generic FUNC_ENTER/LEAVE and error
* reporting macros.
*/
#ifdef H5EA_MODULE
#define H5_MY_PKG H5EA
#define H5_MY_PKG_ERR H5E_EARRAY
#define H5_MY_PKG_INIT NO
#endif /* H5EA_MODULE */
/* Size of signature information (on disk) */
#define H5EA_SIZEOF_MAGIC 4
/* Fractal heap signatures */
#define H5EA_HDR_MAGIC "EAHD" /* Header */
/* Size of checksum information (on disk) */
#define H5EA_SIZEOF_CHKSUM 4
/* "Standard" size of prefix information for extensible array metadata */
#define H5EA_METADATA_PREFIX_SIZE(c) ( \
H5EA_SIZEOF_MAGIC /* Signature */ \
+ 1 /* Version */ \
+ ((c) ? H5EA_SIZEOF_CHKSUM : 0) /* Metadata checksum */ \
)
/* Size of the extensible array header on disk */
#define H5EA_HEADER_SIZE(h) ( \
/* General metadata fields */ \
H5EA_METADATA_PREFIX_SIZE(TRUE) \
\
/* Extensible Array Header specific fields */ \
\
/* General heap information */ \
+ 1 /* Element Size */ \
+ 1 /* # of elements to store in index block */ \
+ 1 /* Min. # elements per data block */ \
+ 1 /* Min. # of data block pointers for a super block */ \
)
/****************************/
/* Package Private Typedefs */
/****************************/
/* The extensible array header information */
/* (Each extensible array header has certain information that is shared across
* all the blocks in that extensible array)
*/
typedef struct H5EA_hdr_t {
/* Information for H5AC cache functions, _must_ be first field in structure */
H5AC_info_t cache_info;
/* Extensible array configuration/creation parameters (stored) */
uint8_t elmt_size; /* Element size (in bytes) */
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 */
/* Computed/cached values */
size_t rc; /* Reference count of heap's components using heap header */
haddr_t addr; /* Address of header in file */
size_t size; /* Size of header in file */
H5F_t *f; /* Pointer to file for extensible array */
size_t file_rc; /* Reference count of files using array header */
hbool_t pending_delete; /* Array is pending deletion */
} H5EA_hdr_t;
/* Extensible array */
struct H5EA_t {
H5EA_hdr_t *hdr; /* Pointer to internal extensible array header info */
H5F_t *f; /* Pointer to file for extensible array */
};
/*****************************/
/* Package Private Variables */
/*****************************/
/* H5EA header inherits cache-like properties from H5AC */
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);
/******************************/
/* Package Private Prototypes */
/******************************/
/* Header routines */
H5_DLL H5EA_hdr_t *H5EA__hdr_alloc(H5F_t *f);
H5_DLL haddr_t H5EA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam);
H5_DLL herr_t H5EA__hdr_incr(H5EA_hdr_t *hdr);
H5_DLL herr_t H5EA__hdr_decr(H5EA_hdr_t *hdr);
H5_DLL herr_t H5EA__hdr_fuse_incr(H5EA_hdr_t *hdr);
H5_DLL size_t H5EA__hdr_fuse_decr(H5EA_hdr_t *hdr);
H5_DLL herr_t H5EA__hdr_delete(H5EA_hdr_t *hdr, hid_t dxpl_id);
/* Metadata cache callbacks */
H5_DLL herr_t H5EA__cache_hdr_dest(H5F_t *f, H5EA_hdr_t *hdr);
/* Testing routines */
#ifdef H5EA_TESTING
H5_DLL herr_t H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam);
H5_DLL int H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2);
#endif /* H5EA_TESTING */
#endif /* _H5EApkg_H */

91
src/H5EAprivate.h Normal file
View File

@ -0,0 +1,91 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5EAprivate.h
* Jun 17 2008
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Private header for library accessible extensible
* array routines.
*
*-------------------------------------------------------------------------
*/
#ifndef _H5EAprivate_H
#define _H5EAprivate_H
/* Include package's public header */
#ifdef NOT_YET
#include "H5EApublic.h"
#endif /* NOT_YET */
/* Private headers needed by this file */
#include "H5Fprivate.h" /* File access */
/**************************/
/* Library Private Macros */
/**************************/
/****************************/
/* Library Private Typedefs */
/****************************/
/* Extensible array creation parameters */
typedef struct H5EA_create_t {
uint8_t elmt_size; /* Element size (in bytes) */
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 */
} H5EA_create_t;
/* Extensible array metadata statistics info */
typedef struct H5EA_stat_t {
hsize_t nsuper_blks; /* # of super blocks */
hsize_t ndata_blks; /* # of data blocks */
} H5EA_stat_t;
/* Extensible array info (forward decl - defined in H5EApkg.h) */
typedef struct H5EA_t H5EA_t;
/*****************************/
/* Library-private Variables */
/*****************************/
/***************************************/
/* Library-private Function Prototypes */
/***************************************/
/* General routines */
H5_DLL H5EA_t *H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam);
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);
H5_DLL herr_t H5EA_close(H5EA_t *ea, hid_t dxpl_id);
/* Statistics routines */
H5_DLL herr_t H5EA_get_stats(const H5EA_t *ea, H5EA_stat_t *stats);
/* Debugging routines */
#ifdef H5EA_DEBUGGING
#endif /* H5EA_DEBUGGING */
#endif /* _H5EAprivate_H */

152
src/H5EAtest.c Normal file
View File

@ -0,0 +1,152 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Programmer: Quincey Koziol <koziol@hdfgroup.org>
* Thursday, August 28, 2008
*
* Purpose: Extensible array testing functions.
*
*/
/**********************/
/* Module Declaration */
/**********************/
#define H5EA_MODULE
#define H5EA_TESTING
/***********************/
/* Other Packages Used */
/***********************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5EApkg.h" /* Extensible Arrays */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/*********************/
/* Package Variables */
/*********************/
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/*-------------------------------------------------------------------------
* Function: H5EA_get_cparam_test
*
* Purpose: Retrieve the parameters used to create the extensible array
*
* Return: Success: non-negative
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, August 28, 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, NOERR,
herr_t, SUCCEED, -,
H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam))
/* Check arguments. */
HDassert(ea);
HDassert(cparam);
/* Get extensible array creation parameters */
cparam->elmt_size = ea->hdr->elmt_size;
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;
END_FUNC(PRIV) /* end H5EA_get_cparam_test() */
/*-------------------------------------------------------------------------
* Function: H5EA_cmp_cparam_test
*
* Purpose: Compare the parameters used to create the extensible array
*
* Return: Success: non-negative
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, August 28, 2008
*
*-------------------------------------------------------------------------
*/
BEGIN_FUNC(PRIV, ERRCATCH,
int, 0, -,
H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2))
/* Check arguments. */
HDassert(cparam1);
HDassert(cparam2);
/* Compare creation parameters for array */
if(cparam1->elmt_size < cparam2->elmt_size)
H5_LEAVE(-1)
else if(cparam1->elmt_size > cparam2->elmt_size)
H5_LEAVE(1)
if(cparam1->idx_blk_elmts < cparam2->idx_blk_elmts)
H5_LEAVE(-1)
else if(cparam1->idx_blk_elmts > cparam2->idx_blk_elmts)
H5_LEAVE(1)
if(cparam1->sup_blk_min_data_ptrs < cparam2->sup_blk_min_data_ptrs)
H5_LEAVE(-1)
else if(cparam1->sup_blk_min_data_ptrs > cparam2->sup_blk_min_data_ptrs)
H5_LEAVE(1)
if(cparam1->data_blk_min_elmts < cparam2->data_blk_min_elmts)
H5_LEAVE(-1)
else if(cparam1->data_blk_min_elmts > cparam2->data_blk_min_elmts)
H5_LEAVE(1)
CATCH
END_FUNC(PRIV) /* end H5EA_cmp_cparam_test() */

View File

@ -47,6 +47,7 @@ hid_t H5E_SLIST_g = FAIL; /* Skip Lists */
hid_t H5E_EFL_g = FAIL; /* External file list */
hid_t H5E_TST_g = FAIL; /* Ternary Search Trees */
hid_t H5E_ARGS_g = FAIL; /* Invalid arguments to routine */
hid_t H5E_EARRAY_g = FAIL; /* Extensible Array */
hid_t H5E_ERROR_g = FAIL; /* Error API */
hid_t H5E_PLINE_g = FAIL; /* Data filters */
hid_t H5E_FSPACE_g = FAIL; /* Free Space Manager */

View File

@ -154,6 +154,11 @@ if((msg = H5E_create_msg(cls, H5E_MAJOR, "Invalid arguments to routine"))==NULL)
HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
if((H5E_ARGS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
assert(H5E_EARRAY_g==(-1));
if((msg = H5E_create_msg(cls, H5E_MAJOR, "Extensible Array"))==NULL)
HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
if((H5E_EARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
assert(H5E_ERROR_g==(-1));
if((msg = H5E_create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")

View File

@ -658,6 +658,107 @@ H5E_set_auto(H5E_t *estack, const H5E_auto_op_t *op, void *client_data)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5E_set_auto() */
/*-------------------------------------------------------------------------
* Function: H5E_printf_stack
*
* Purpose: Printf-like wrapper around H5E_push_stack.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* Tuesday, August 12, 2008
*
*-------------------------------------------------------------------------
*/
herr_t
H5E_printf_stack(H5E_t *estack, const char *file, const char *func, unsigned line,
hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...)
{
va_list ap; /* Varargs info */
#ifndef H5_HAVE_VASPRINTF
int tmp_len; /* Current size of description buffer */
int desc_len; /* Actual length of description when formatted */
#endif /* H5_HAVE_VASPRINTF */
char *tmp = NULL; /* Buffer to place formatted description in */
herr_t ret_value = SUCCEED; /* Return value */
/*
* WARNING: We cannot call HERROR() from within this function or else we
* could enter infinite recursion. Furthermore, we also cannot
* call any other HDF5 macro or function which might call
* HERROR(). HERROR() is called by HRETURN_ERROR() which could
* be called by FUNC_ENTER().
*/
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5E_printf_stack)
/* Sanity check */
HDassert(cls_id > 0);
HDassert(maj_id > 0);
HDassert(min_id > 0);
HDassert(fmt);
/* Note that the variable-argument parsing for the format is identical in
* the H5Epush2() routine - correct errors and make changes in both
* places. -QAK
*/
/* Start the variable-argument parsing */
va_start(ap, fmt);
#ifdef H5_HAVE_VASPRINTF
/* Use the vasprintf() routine, since it does what we're trying to do below */
if(HDvasprintf(&tmp, fmt, ap) < 0)
HGOTO_DONE(FAIL)
#else /* H5_HAVE_VASPRINTF */
/* Allocate space for the formatted description buffer */
tmp_len = 128;
if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
HGOTO_DONE(FAIL)
/* If the description doesn't fit into the initial buffer size, allocate more space and try again */
while((desc_len = HDvsnprintf(tmp, (size_t)tmp_len, fmt, ap))
#ifdef H5_VSNPRINTF_WORKS
>
#else /* H5_VSNPRINTF_WORKS */
>=
#endif /* H5_VSNPRINTF_WORKS */
(tmp_len - 1)
#ifndef H5_VSNPRINTF_WORKS
|| (desc_len < 0)
#endif /* H5_VSNPRINTF_WORKS */
) {
/* shutdown & restart the va_list */
va_end(ap);
va_start(ap, fmt);
/* Release the previous description, it's too small */
H5MM_xfree(tmp);
/* Allocate a description of the appropriate length */
#ifdef H5_VSNPRINTF_WORKS
tmp_len = desc_len + 1;
#else /* H5_VSNPRINTF_WORKS */
tmp_len = 2 * tmp_len;
#endif /* H5_VSNPRINTF_WORKS */
if(NULL == (tmp = H5MM_malloc((size_t)tmp_len)))
HGOTO_DONE(FAIL)
} /* end while */
#endif /* H5_HAVE_VASPRINTF */
va_end(ap);
/* Push the error on the stack */
if(H5E_push_stack(estack, file, func, line, cls_id, maj_id, min_id, tmp) < 0)
HGOTO_DONE(FAIL)
done:
if(tmp)
H5MM_xfree(tmp);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5E_printf_stack() */
/*-------------------------------------------------------------------------
* Function: H5E_push_stack
@ -886,7 +987,7 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5E_dump_api_stack(int is_api)
H5E_dump_api_stack(hbool_t is_api)
{
herr_t ret_value = SUCCEED; /* Return value */

View File

@ -40,7 +40,7 @@ typedef struct H5E_t H5E_t;
*/
#define HCOMMON_ERROR(maj, min, str) \
HERROR(maj, min, str); \
(void)H5E_dump_api_stack((int)H5_IS_API(FUNC));
(void)H5E_dump_api_stack((hbool_t)H5_IS_API(FUNC));
/*
* HDONE_ERROR macro, used to facilitate error reporting between a
@ -78,10 +78,12 @@ typedef struct H5E_t H5E_t;
/* Library-private functions defined in H5E package */
H5_DLL herr_t H5E_init(void);
H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func, unsigned line,
hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc);
H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func,
unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc);
H5_DLL herr_t H5E_printf_stack(H5E_t *estack, const char *file, const char *func,
unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...);
H5_DLL herr_t H5E_clear_stack(H5E_t *estack);
H5_DLL herr_t H5E_dump_api_stack(int is_api);
H5_DLL herr_t H5E_dump_api_stack(hbool_t is_api);
/*
* Macros handling system error messages as described in C standard.

View File

@ -50,6 +50,7 @@
#define H5E_EFL (H5OPEN H5E_EFL_g)
#define H5E_TST (H5OPEN H5E_TST_g)
#define H5E_ARGS (H5OPEN H5E_ARGS_g)
#define H5E_EARRAY (H5OPEN H5E_EARRAY_g)
#define H5E_ERROR (H5OPEN H5E_ERROR_g)
#define H5E_PLINE (H5OPEN H5E_PLINE_g)
#define H5E_FSPACE (H5OPEN H5E_FSPACE_g)
@ -80,6 +81,7 @@ H5_DLLVAR hid_t H5E_SLIST_g; /* Skip Lists */
H5_DLLVAR hid_t H5E_EFL_g; /* External file list */
H5_DLLVAR hid_t H5E_TST_g; /* Ternary Search Trees */
H5_DLLVAR hid_t H5E_ARGS_g; /* Invalid arguments to routine */
H5_DLLVAR hid_t H5E_EARRAY_g; /* Extensible Array */
H5_DLLVAR hid_t H5E_ERROR_g; /* Error API */
H5_DLLVAR hid_t H5E_PLINE_g; /* Data filters */
H5_DLLVAR hid_t H5E_FSPACE_g; /* Free Space Manager */

View File

@ -48,6 +48,7 @@ H5E_SLIST_g=
H5E_EFL_g=
H5E_TST_g=
H5E_ARGS_g=
H5E_EARRAY_g=
H5E_ERROR_g=
H5E_PLINE_g=
H5E_FSPACE_g=

View File

@ -89,6 +89,14 @@ typedef enum H5FD_mem_t {
#define H5FD_MEM_SOHM_TABLE H5FD_MEM_OHDR
#define H5FD_MEM_SOHM_INDEX H5FD_MEM_BTREE
/* Map "extensible array" header blocks to 'ohdr' type file memory, since its
* a fair amount of work to add a new kind of file memory and they are similar
* enough to object headers and probably too minor to deserve their own type.
*
* -QAK
*/
#define H5FD_MEM_EARRAY_HDR H5FD_MEM_OHDR
/*
* A free-list map which maps all types of allocation requests to a single
* free list. This is useful for drivers that don't really care about

View File

@ -847,6 +847,9 @@ HDfprintf(stderr, "%s; After iterator reset fh->hdr->rc = %Zu\n", FUNC, fh->hdr-
} /* end if */
/* Decrement the reference count on the heap header */
/* (don't put in H5HF_hdr_fuse_decr() as the heap header may be evicted
* immediately -QAK)
*/
if(H5HF_hdr_decr(fh->hdr) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
@ -912,6 +915,9 @@ HDfprintf(stderr, "%s: fh_addr = %a\n", FUNC, fh_addr);
if(hdr->file_rc)
hdr->pending_delete = TRUE;
else {
/* Set the shared heap header's file context for this operation */
hdr->f = f;
/* Delete heap now, starting with header (unprotects header) */
if(H5HF_hdr_delete(hdr, dxpl_id) < 0)
HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to delete fractal heap")

View File

@ -74,6 +74,7 @@ MAJOR, H5E_ERROR, Error API
MAJOR, H5E_SLIST, Skip Lists
MAJOR, H5E_FSPACE, Free Space Manager
MAJOR, H5E_SOHM, Shared Object Header Messages
MAJOR, H5E_EARRAY, Extensible Array
MAJOR, H5E_NONE_MAJOR, No error
# Sections (for grouping minor errors)

View File

@ -1612,8 +1612,8 @@ extern hbool_t H5_libinit_g; /* Has the library been initialized? */
/* Include required function stack header */
#include "H5CSprivate.h"
#define H5_PUSH_FUNC(func_name) H5CS_push(#func_name)
#define H5_POP_FUNC H5CS_pop()
#define H5_PUSH_FUNC(func_name) H5CS_push(func_name);
#define H5_POP_FUNC H5CS_pop();
#else /* H5_HAVE_CODESTACK */
#define H5_PUSH_FUNC(func_name) /* void */
#define H5_POP_FUNC /* void */
@ -1723,7 +1723,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
FUNC_ENTER_API_VARS(func_name) \
FUNC_ENTER_COMMON(func_name,H5_IS_API(#func_name)); \
FUNC_ENTER_API_THREADSAFE; \
H5_PUSH_FUNC(func_name); \
H5_PUSH_FUNC(#func_name) \
BEGIN_MPE_LOG(func_name); \
{
@ -1763,7 +1763,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
*/
#define FUNC_ENTER_NOAPI_NOINIT(func_name) { \
FUNC_ENTER_COMMON(func_name,!H5_IS_API(#func_name)); \
H5_PUSH_FUNC(func_name); \
H5_PUSH_FUNC(#func_name) \
{
/*
@ -1780,7 +1780,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
*/
#define FUNC_ENTER_NOAPI_NOINIT_NOFUNC(func_name) { \
FUNC_ENTER_COMMON_NOFUNC(func_name,!H5_IS_API(#func_name)); \
H5_PUSH_FUNC(func_name); \
H5_PUSH_FUNC(#func_name) \
{
/*
@ -1809,7 +1809,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
H5_INTERFACE_INIT(err) \
\
/* Push the name of this function on the function stack */ \
H5_PUSH_FUNC(func_name); \
H5_PUSH_FUNC(#func_name) \
\
BEGIN_MPE_LOG(func_name)
@ -1819,7 +1819,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
H5_INTERFACE_INIT(err) \
\
/* Push the name of this function on the function stack */ \
H5_PUSH_FUNC(func_name);
H5_PUSH_FUNC(#func_name)
/*-------------------------------------------------------------------------
* Purpose: Register function exit for code profiling. This should be
@ -1840,7 +1840,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
#define FUNC_LEAVE_API(ret_value) \
FINISH_MPE_LOG; \
H5TRACE_RETURN(ret_value); \
H5_POP_FUNC; \
H5_POP_FUNC \
FUNC_LEAVE_API_THREADSAFE \
return (ret_value); \
} /*end scope from end of FUNC_ENTER*/ \
@ -1855,13 +1855,13 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
}} /*end scope from beginning of FUNC_ENTER*/
#define FUNC_LEAVE_NOAPI(ret_value) \
H5_POP_FUNC; \
H5_POP_FUNC \
return (ret_value); \
} /*end scope from end of FUNC_ENTER*/ \
} /*end scope from beginning of FUNC_ENTER*/
#define FUNC_LEAVE_NOAPI_VOID \
H5_POP_FUNC; \
H5_POP_FUNC \
return; \
} /*end scope from end of FUNC_ENTER*/ \
} /*end scope from beginning of FUNC_ENTER*/
@ -1880,6 +1880,7 @@ static herr_t H5_INTERFACE_INIT_FUNC(void);
/* Macro for "glueing" together items, for re-scanning macros */
#define H5_GLUE(x,y) x##y
#define H5_GLUE3(x,y,z) x##y##z
#define H5_GLUE4(w,x,y,z) w##x##y##z
/* Compile-time "assert" macro */
#define HDcompile_assert(e) do { enum { compile_assert__ = 1 / (e) }; } while(0)

View File

@ -51,6 +51,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5Dio.c \
H5Distore.c H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \
H5E.c H5Edeprec.c H5Eint.c \
H5EA.c H5EAcache.c H5EAhdr.c H5EAint.c H5EAtest.c \
H5F.c H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5Ftest.c \
H5FD.c H5FDcore.c \
H5FDdirect.c H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \

View File

@ -86,16 +86,16 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo H5Defl.lo H5Dfill.lo \
H5Dint.lo H5Dio.lo H5Distore.lo H5Dmpio.lo H5Doh.lo \
H5Dscatgath.lo H5Dselect.lo H5Dtest.lo H5E.lo H5Edeprec.lo \
H5Eint.lo H5F.lo H5Fdbg.lo H5Ffake.lo H5Fmount.lo H5Fsfile.lo \
H5Fsuper.lo H5Ftest.lo H5FD.lo H5FDcore.lo H5FDdirect.lo \
H5FDfamily.lo H5FDlog.lo H5FDmpi.lo H5FDmpio.lo \
H5FDmpiposix.lo H5FDmulti.lo H5FDsec2.lo H5FDspace.lo \
H5FDstdio.lo H5FL.lo H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo \
H5FSsection.lo H5G.lo H5Gbtree2.lo H5Gcompact.lo H5Gdense.lo \
H5Gdeprec.lo H5Gent.lo H5Gint.lo H5Glink.lo H5Gloc.lo \
H5Gname.lo H5Gnode.lo H5Gobj.lo H5Goh.lo H5Gstab.lo H5Gtest.lo \
H5Gtraverse.lo H5HF.lo H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo \
H5HFdblock.lo H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo \
H5Eint.lo H5EA.lo H5EAcache.lo H5EAhdr.lo H5EAint.lo H5EAtest.lo H5F.lo H5Fdbg.lo H5Ffake.lo \
H5Fmount.lo H5Fsfile.lo H5Fsuper.lo H5Ftest.lo H5FD.lo \
H5FDcore.lo H5FDdirect.lo H5FDfamily.lo H5FDlog.lo H5FDmpi.lo \
H5FDmpio.lo H5FDmpiposix.lo H5FDmulti.lo H5FDsec2.lo \
H5FDspace.lo H5FDstdio.lo H5FL.lo H5FO.lo H5FS.lo H5FScache.lo \
H5FSdbg.lo H5FSsection.lo H5G.lo H5Gbtree2.lo H5Gcompact.lo \
H5Gdense.lo H5Gdeprec.lo H5Gent.lo H5Gint.lo H5Glink.lo \
H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo H5Goh.lo H5Gstab.lo \
H5Gtest.lo H5Gtraverse.lo H5HF.lo H5HFbtree2.lo H5HFcache.lo \
H5HFdbg.lo H5HFdblock.lo H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo \
H5HFiblock.lo H5HFiter.lo H5HFman.lo H5HFsection.lo \
H5HFspace.lo H5HFstat.lo H5HFtest.lo H5HFtiny.lo H5HG.lo \
H5HGdbg.lo H5HL.lo H5HLdbg.lo H5HP.lo H5I.lo H5L.lo \
@ -429,6 +429,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5Dio.c \
H5Distore.c H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \
H5E.c H5Edeprec.c H5Eint.c \
H5EA.c H5EAcache.c H5EAhdr.c H5EAint.c H5EAtest.c \
H5F.c H5Fdbg.c H5Ffake.c H5Fmount.c H5Fsfile.c H5Fsuper.c H5Ftest.c \
H5FD.c H5FDcore.c \
H5FDdirect.c H5FDfamily.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
@ -638,6 +639,11 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Dselect.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Dtest.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5E.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EA.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAcache.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAhdr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAint.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5EAtest.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Edeprec.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Eint.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5F.Plo@am__quote@

View File

@ -42,7 +42,7 @@ TEST_PROG=testhdf5 lheap ohdr stab gheap cache cache_api \
fillval mount flush1 flush2 app_ref enum \
set_extent ttsafe \
getname vfd ntypes dangle dtransform reserved cross_read \
btree2 fheap
btree2 fheap earray
# List programs to be built when testing here. error_test and err_compat are
# built at the same time as the other tests, but executed by testerror.sh.
@ -120,7 +120,7 @@ CHECK_CLEANFILES+=cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offset.h5 \
new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 err_compat.h5 \
dtransform.h5 test_filters.h5 get_file_name.h5 tstint[1-2].h5 \
unlink_chunked.h5 btree2.h5 objcopy_src.h5 objcopy_dst.h5 \
objcopy_ext.dat trefer1.h5 trefer2.h5 app_ref.h5
objcopy_ext.dat trefer1.h5 trefer2.h5 app_ref.h5 earray.h5
# Sources for testhdf5 executable
testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \

View File

@ -80,7 +80,8 @@ am__EXEEXT_1 = testhdf5$(EXEEXT) lheap$(EXEEXT) ohdr$(EXEEXT) \
app_ref$(EXEEXT) enum$(EXEEXT) set_extent$(EXEEXT) \
ttsafe$(EXEEXT) getname$(EXEEXT) vfd$(EXEEXT) ntypes$(EXEEXT) \
dangle$(EXEEXT) dtransform$(EXEEXT) reserved$(EXEEXT) \
cross_read$(EXEEXT) btree2$(EXEEXT) fheap$(EXEEXT)
cross_read$(EXEEXT) btree2$(EXEEXT) fheap$(EXEEXT) \
earray$(EXEEXT)
am__EXEEXT_2 = gen_bad_ohdr$(EXEEXT) gen_bogus$(EXEEXT) \
gen_cross$(EXEEXT) gen_deflate$(EXEEXT) gen_filters$(EXEEXT) \
gen_new_array$(EXEEXT) gen_new_fill$(EXEEXT) \
@ -141,6 +142,10 @@ dtypes_SOURCES = dtypes.c
dtypes_OBJECTS = dtypes.$(OBJEXT)
dtypes_LDADD = $(LDADD)
dtypes_DEPENDENCIES = libh5test.la $(LIBHDF5)
earray_SOURCES = earray.c
earray_OBJECTS = earray.$(OBJEXT)
earray_LDADD = $(LDADD)
earray_DEPENDENCIES = libh5test.la $(LIBHDF5)
enum_SOURCES = enum.c
enum_OBJECTS = enum.$(OBJEXT)
enum_LDADD = $(LDADD)
@ -337,7 +342,7 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libh5test_la_SOURCES) app_ref.c big.c bittests.c btree2.c \
cache.c cache_api.c cmpd_dset.c cross_read.c dangle.c dsets.c \
dt_arith.c dtransform.c dtypes.c enum.c err_compat.c \
dt_arith.c dtransform.c dtypes.c earray.c enum.c err_compat.c \
error_test.c extend.c external.c fheap.c fillval.c flush1.c \
flush2.c gen_bad_ohdr.c gen_bogus.c gen_cross.c gen_deflate.c \
gen_filters.c gen_new_array.c gen_new_fill.c gen_new_group.c \
@ -349,16 +354,16 @@ SOURCES = $(libh5test_la_SOURCES) app_ref.c big.c bittests.c btree2.c \
vfd.c
DIST_SOURCES = $(libh5test_la_SOURCES) app_ref.c big.c bittests.c \
btree2.c cache.c cache_api.c cmpd_dset.c cross_read.c dangle.c \
dsets.c dt_arith.c dtransform.c dtypes.c enum.c err_compat.c \
error_test.c extend.c external.c fheap.c fillval.c flush1.c \
flush2.c gen_bad_ohdr.c gen_bogus.c gen_cross.c gen_deflate.c \
gen_filters.c gen_new_array.c gen_new_fill.c gen_new_group.c \
gen_new_mtime.c gen_new_super.c gen_noencoder.c \
gen_nullspace.c gen_udlinks.c getname.c gheap.c hyperslab.c \
istore.c lheap.c links.c mount.c mtime.c ntypes.c objcopy.c \
ohdr.c pool.c reserved.c set_extent.c space_overflow.c stab.c \
$(testhdf5_SOURCES) testmeta.c $(ttsafe_SOURCES) unlink.c \
vfd.c
dsets.c dt_arith.c dtransform.c dtypes.c earray.c enum.c \
err_compat.c error_test.c extend.c external.c fheap.c \
fillval.c flush1.c flush2.c gen_bad_ohdr.c gen_bogus.c \
gen_cross.c gen_deflate.c gen_filters.c gen_new_array.c \
gen_new_fill.c gen_new_group.c gen_new_mtime.c gen_new_super.c \
gen_noencoder.c gen_nullspace.c gen_udlinks.c getname.c \
gheap.c hyperslab.c istore.c lheap.c links.c mount.c mtime.c \
ntypes.c objcopy.c ohdr.c pool.c reserved.c set_extent.c \
space_overflow.c stab.c $(testhdf5_SOURCES) testmeta.c \
$(ttsafe_SOURCES) unlink.c vfd.c
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@ -633,7 +638,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog cmpd_dset.h5 \
err_compat.h5 dtransform.h5 test_filters.h5 get_file_name.h5 \
tstint[1-2].h5 unlink_chunked.h5 btree2.h5 objcopy_src.h5 \
objcopy_dst.h5 objcopy_ext.dat trefer1.h5 trefer2.h5 \
app_ref.h5
app_ref.h5 earray.h5
INCLUDES = -I$(top_srcdir)/src -I$(top_builddir)/src
# Test script for error_test and err_compat
@ -654,7 +659,7 @@ TEST_PROG = testhdf5 lheap ohdr stab gheap cache cache_api \
fillval mount flush1 flush2 app_ref enum \
set_extent ttsafe \
getname vfd ntypes dangle dtransform reserved cross_read \
btree2 fheap
btree2 fheap earray
# These programs generate test files for the tests. They don't need to be
@ -807,6 +812,9 @@ dtransform$(EXEEXT): $(dtransform_OBJECTS) $(dtransform_DEPENDENCIES)
dtypes$(EXEEXT): $(dtypes_OBJECTS) $(dtypes_DEPENDENCIES)
@rm -f dtypes$(EXEEXT)
$(LINK) $(dtypes_OBJECTS) $(dtypes_LDADD) $(LIBS)
earray$(EXEEXT): $(earray_OBJECTS) $(earray_DEPENDENCIES)
@rm -f earray$(EXEEXT)
$(LINK) $(earray_OBJECTS) $(earray_LDADD) $(LIBS)
enum$(EXEEXT): $(enum_OBJECTS) $(enum_DEPENDENCIES)
@rm -f enum$(EXEEXT)
$(LINK) $(enum_OBJECTS) $(enum_LDADD) $(LIBS)
@ -957,6 +965,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dt_arith.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtransform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtypes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/earray.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enum.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err_compat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error_test.Po@am__quote@

381
test/earray.c Normal file
View File

@ -0,0 +1,381 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Programmer: Quincey Koziol <koziol@hdfgroup.org>
* Tuesday, June 17, 2008
*/
#include "h5test.h"
/*
* This file needs to access private datatypes from the H5EA package.
* This file also needs to access the extensible array testing code.
*/
#define H5EA_PACKAGE
#define H5EA_TESTING
#include "H5EApkg.h" /* Extensible Arrays */
/* Other private headers that this test requires */
#include "H5Iprivate.h" /* IDs */
/* Local macros */
/* Max. testfile name length */
#define EARRAY_FILENAME_LEN 1024
/* Extensible array creation values */
#define ELMT_SIZE sizeof(haddr_t)
#define IDX_BLK_ELMTS 4
#define SUP_BLK_MIN_DATA_PTRS 4
#define DATA_BLK_MIN_ELMTS 16
/* Local typedefs */
/* Types of tests to perform */
typedef enum {
EARRAY_TEST_NORMAL, /* "Normal" test, with no testing parameters set */
EARRAY_TEST_REOPEN, /* Set the reopen_array flag */
EARRAY_TEST_NTESTS /* The number of test types, must be last */
} earray_test_type_t;
/* Whether to compress data blocks */
typedef enum {
EARRAY_TEST_NO_COMPRESS, /* Don't compress data blocks */
EARRAY_TEST_COMPRESS, /* Compress data blocks */
EARRAY_TEST_COMP_N /* The number of different ways to test compressing array blocks, must be last */
} earray_test_comp_t;
/* Testing parameters */
typedef struct earray_test_param_t {
earray_test_type_t reopen_array; /* Whether to re-open the array during the test */
earray_test_comp_t comp; /* Whether to compress the blocks or not */
} earray_test_param_t;
/* Extensible array state information */
typedef struct earray_state_t {
hsize_t nsuper_blks; /* # of super blocks */
hsize_t ndata_blks; /* # of data blocks */
} earray_state_t;
/* Local variables */
const char *FILENAME[] = {
"earray",
NULL
};
/* Local routines */
/*-------------------------------------------------------------------------
* Function: init_cparam
*
* Purpose: Initialize array creation parameter structure
*
* Return: Success: 0
* Failure: 1
*
* Programmer: Quincey Koziol
* Thursday, August 21, 2008
*
*-------------------------------------------------------------------------
*/
static int
init_cparam(H5EA_create_t *cparam)
{
/* Wipe out background */
HDmemset(cparam, 0, sizeof(*cparam));
/* General parameters */
cparam->elmt_size = ELMT_SIZE;
cparam->idx_blk_elmts = IDX_BLK_ELMTS;
cparam->sup_blk_min_data_ptrs = SUP_BLK_MIN_DATA_PTRS;
cparam->data_blk_min_elmts = DATA_BLK_MIN_ELMTS;
return(0);
} /* init_cparam() */
/*-------------------------------------------------------------------------
* Function: check_stats
*
* Purpose: Verify stats for an extensible array
*
* Return: Success: 0
* Failure: 1
*
* Programmer: Quincey Koziol
* Thursday, August 21, 2008
*
*-------------------------------------------------------------------------
*/
static int
check_stats(const H5EA_t *ea, const earray_state_t *state)
{
H5EA_stat_t earray_stats; /* Statistics about the array */
/* Get statistics for extensible array and verify they are correct */
if(H5EA_get_stats(ea, &earray_stats) < 0)
FAIL_STACK_ERROR
/* Compare information */
if(earray_stats.nsuper_blks != state->nsuper_blks) {
HDfprintf(stdout, "earray_stats.nsuper_blks = %Hu, state->nsuper_blks = %Hu\n", earray_stats.nsuper_blks, state->nsuper_blks);
TEST_ERROR
} /* end if */
if(earray_stats.ndata_blks != state->ndata_blks) {
HDfprintf(stdout, "earray_stats.ndata_blks = %Hu, state->ndata_blks = %Hu\n", earray_stats.ndata_blks, state->ndata_blks);
TEST_ERROR
} /* end if */
/* All tests passed */
return(0);
error:
return(1);
} /* check_stats() */
/*-------------------------------------------------------------------------
* Function: test_basic
*
* Purpose: Basic tests for extensible arrays
*
* Return: Success: 0
* Failure: 1
*
* Programmer: Quincey Koziol
* Thursday, August 7, 2008
*
*-------------------------------------------------------------------------
*/
static unsigned
test_create(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t UNUSED *tparam)
{
hid_t file = -1; /* File ID */
char filename[EARRAY_FILENAME_LEN]; /* Filename to use */
H5F_t *f = NULL; /* Internal file object pointer */
H5EA_create_t test_cparam; /* Creation parameters for array */
H5EA_t *ea = NULL; /* Extensible array wrapper */
haddr_t ea_addr; /* Array address in file */
hsize_t nelmts; /* Number of elements in array */
earray_state_t state; /* State of extensible array */
h5_stat_size_t empty_size; /* File size, w/o array */
h5_stat_size_t file_size; /* File size, after deleting array */
/* Set the filename to use for this test (dependent on fapl) */
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
/* Create the file to work on */
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
FAIL_STACK_ERROR
/* Close file */
if(H5Fclose(file) < 0)
FAIL_STACK_ERROR
/* Get the size of a file w/empty heap*/
if((empty_size = h5_get_file_size(filename)) < 0)
TEST_ERROR
/* Re-open the file */
if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/*
* Display testing message
*/
TESTING("invalid extensible array creation parameters");
#ifndef NDEBUG
/* Set invalid element size */
HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
test_cparam.elmt_size = 0;
H5E_BEGIN_TRY {
ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam);
} H5E_END_TRY;
if(ea) {
/* Close opened extensible array */
H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
/* Indicate error */
TEST_ERROR
} /* end if */
/* Set invalid min. # of data block pointers in super blocks */
HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
test_cparam.sup_blk_min_data_ptrs = 0;
H5E_BEGIN_TRY {
ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam);
} H5E_END_TRY;
if(ea) {
/* Close opened extensible array */
H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
/* Indicate error */
TEST_ERROR
} /* end if */
/* Set invalid min. # of elements per data block */
HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
test_cparam.data_blk_min_elmts = 0;
H5E_BEGIN_TRY {
ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam);
} H5E_END_TRY;
if(ea) {
/* Close opened extensible array */
H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
/* Indicate error */
TEST_ERROR
} /* end if */
PASSED()
#else /* NDEBUG */
SKIPPED();
puts(" Not tested when assertions are disabled");
#endif /* NDEBUG */
/*
* Display testing message
*/
TESTING("extensible array creation");
if(NULL == (ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, cparam)))
FAIL_STACK_ERROR
nelmts = 0;
if(H5EA_get_nelmts(ea, &nelmts) < 0)
FAIL_STACK_ERROR
if(nelmts > 0)
TEST_ERROR
if(H5EA_get_addr(ea, &ea_addr) < 0)
FAIL_STACK_ERROR
if(!H5F_addr_defined(ea_addr))
TEST_ERROR
HDmemset(&state, 0, sizeof(state));
if(check_stats(ea, &state))
TEST_ERROR
PASSED()
/* Query the type of address mapping */
TESTING("query array creation parameters");
HDmemset(&test_cparam, 0, sizeof(H5EA_create_t));
if(H5EA_get_cparam_test(ea, &test_cparam) < 0)
FAIL_STACK_ERROR
if(H5EA_cmp_cparam_test(cparam, &test_cparam))
TEST_ERROR
/* Close the extensible array */
if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
FAIL_STACK_ERROR
/* Delete array */
if(H5EA_delete(f, H5P_DATASET_XFER_DEFAULT, ea_addr) < 0)
FAIL_STACK_ERROR
/* Close the file */
if(H5Fclose(file) < 0)
FAIL_STACK_ERROR
/* Get the size of the file */
if((file_size = h5_get_file_size(filename)) < 0)
TEST_ERROR
/* Verify the file is correct size */
if(file_size != empty_size)
TEST_ERROR
/* All tests passed */
PASSED()
return 0;
error:
H5E_BEGIN_TRY {
if(ea)
H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
H5Fclose(file);
} H5E_END_TRY;
return 1;
} /* end test_create() */
/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Test the extensible array code
*
* Return: Success: 0
* Failure: 1
*
* Programmer: Quincey Koziol
* Tuesday, June 17, 2008
*
*-------------------------------------------------------------------------
*/
int
main(void)
{
H5EA_create_t cparam; /* Creation parameters for extensible array */
earray_test_param_t tparam; /* Testing parameters */
hid_t fapl = -1; /* File access property list for data files */
unsigned nerrors = 0; /* Cumulative error count */
int ExpressMode; /* Test express value */
const char *envval; /* File Driver value from environment */
/* Reset library */
h5_reset();
fapl = h5_fileaccess();
ExpressMode = GetTestExpress();
if(ExpressMode > 1)
printf("***Express test mode on. Some tests may be skipped\n");
if(NULL == (envval = HDgetenv("HDF5_DRIVER")))
envval = "nomatch";
/* Initialize extensible array creation parameters */
init_cparam(&cparam);
/* Clear the testing parameters */
HDmemset(&tparam, 0, sizeof(tparam));
/* Tests */
nerrors = test_create(fapl, &cparam, &tparam);
if(nerrors)
goto error;
puts("All extensible array tests passed.");
/* Clean up file used */
h5_cleanup(FILENAME, fapl);
return 0;
error:
puts("*** TESTS FAILED ***");
H5E_BEGIN_TRY {
H5Pclose(fapl);
} H5E_END_TRY;
return 1;
} /* end main() */

View File

@ -27,7 +27,7 @@
#include "H5HFpkg.h" /* Fractal heaps */
/* Other private headers that this test requires */
#include "H5Iprivate.h"
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5Vprivate.h" /* Vectors and arrays */
@ -125,7 +125,7 @@ typedef struct fheap_test_param_t {
fheap_test_del_drain_t drain_half; /* Whether to drain half of the objects & refill, when deleting objects */
fheap_test_fill_t fill; /* How to "bulk" fill heap blocks */
size_t actual_id_len; /* The actual length of heap IDs for a test */
fheap_test_comp_t comp; /* Whether to compressed the blocks or not */
fheap_test_comp_t comp; /* Whether to compress the blocks or not */
} fheap_test_param_t;
/* Heap state information */
@ -586,7 +586,7 @@ reopen_file(hid_t *file, H5F_t **f, const char *filename, hid_t fapl, hid_t dxpl
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (*f = H5I_object(*file)))
if(NULL == (*f = (H5F_t *)H5I_object(*file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -633,7 +633,7 @@ open_heap(char *filename, hid_t fapl, hid_t dxpl, const H5HF_create_t *cparam,
/* Check for deleting the entire heap */
if(tparam->del_dir != FHEAP_DEL_HEAP) {
/* Get a pointer to the internal file object */
if(NULL == (*f = H5I_object(*file)))
if(NULL == (*f = (H5F_t *)H5I_object(*file)))
FAIL_STACK_ERROR
/* Create absolute heap */
@ -671,7 +671,7 @@ open_heap(char *filename, hid_t fapl, hid_t dxpl, const H5HF_create_t *cparam,
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (*f = H5I_object(*file)))
if(NULL == (*f = (H5F_t *)H5I_object(*file)))
FAIL_STACK_ERROR
/* Check for deleting the entire heap */
@ -1839,7 +1839,7 @@ test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t UNUSED *tparam
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/*
@ -1939,7 +1939,7 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t UNUSED *tparam
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/*
@ -2038,7 +2038,7 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t UNUSED *tp
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Re-open the file */
@ -2046,7 +2046,7 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t UNUSED *tp
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f2 = H5I_object(file2)))
if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
FAIL_STACK_ERROR
/*
@ -2184,7 +2184,7 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t UNUSED *t
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Display test banner */
@ -2321,7 +2321,7 @@ test_id_limits(hid_t fapl, H5HF_create_t *cparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Display testing message */
@ -2660,7 +2660,7 @@ test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Display testing message */
@ -2701,7 +2701,7 @@ test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -2779,7 +2779,7 @@ test_size(hid_t fapl, H5HF_create_t *cparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Display testing message */
@ -2829,7 +2829,7 @@ test_size(hid_t fapl, H5HF_create_t *cparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -2914,7 +2914,7 @@ test_man_insert_weird(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Create absolute heap */
@ -3020,7 +3020,7 @@ test_man_insert_first(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Create absolute heap */
@ -3117,7 +3117,7 @@ test_man_insert_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tp
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3210,7 +3210,7 @@ test_man_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3305,7 +3305,7 @@ test_man_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_par
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3407,7 +3407,7 @@ test_man_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3510,7 +3510,7 @@ test_man_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3617,7 +3617,7 @@ test_man_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3709,7 +3709,7 @@ test_man_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3808,7 +3808,7 @@ test_man_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -3905,7 +3905,7 @@ test_man_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4012,7 +4012,7 @@ test_man_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4105,7 +4105,7 @@ test_man_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4197,7 +4197,7 @@ test_man_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4295,7 +4295,7 @@ test_man_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhe
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4401,7 +4401,7 @@ test_man_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4500,7 +4500,7 @@ test_man_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4607,7 +4607,7 @@ test_man_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4711,7 +4711,7 @@ test_man_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4809,7 +4809,7 @@ test_man_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -4914,7 +4914,7 @@ test_man_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5013,7 +5013,7 @@ test_man_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5119,7 +5119,7 @@ test_man_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5226,7 +5226,7 @@ test_man_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5329,7 +5329,7 @@ test_man_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5433,7 +5433,7 @@ test_man_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5544,7 +5544,7 @@ test_man_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5660,7 +5660,7 @@ test_man_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5768,7 +5768,7 @@ test_man_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -5879,7 +5879,7 @@ test_man_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6009,7 +6009,7 @@ test_man_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6158,7 +6158,7 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6195,7 +6195,7 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -6314,7 +6314,7 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6351,7 +6351,7 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -6499,7 +6499,7 @@ test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6536,7 +6536,7 @@ test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -6660,7 +6660,7 @@ test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6697,7 +6697,7 @@ test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -6896,7 +6896,7 @@ test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
TEST_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
STACK_ERROR
/* Create absolute heap */
@ -6933,7 +6933,7 @@ test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open heap */
@ -13279,7 +13279,7 @@ test_filtered_huge(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14455,7 +14455,7 @@ test_filtered_man_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14636,7 +14636,7 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14696,7 +14696,7 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14728,7 +14728,7 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14761,7 +14761,7 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -14793,7 +14793,7 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -15431,7 +15431,7 @@ test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -15589,7 +15589,7 @@ test_bug1(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */
@ -15615,7 +15615,7 @@ test_bug1(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
FAIL_STACK_ERROR
/* Get a pointer to the internal file object */
if(NULL == (f = H5I_object(file)))
if(NULL == (f = (H5F_t *)H5I_object(file)))
FAIL_STACK_ERROR
/* Re-open the heap */