From b6da4ea427fabe5b1440586dd53667f77809854d Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Wed, 24 Oct 2001 13:02:27 -0500 Subject: [svn-r4569] Purpose: Generic Property List Change Description: Changed file access list to the new generic list. Platforms tested: IRIX64, SunOS5.7, FreeBSD --- c++/src/H5PropList.cpp | 1 - src/H5.c | 6 - src/H5F.c | 479 +++++++++++++++++++++++++++++++++++++++---------- src/H5FD.c | 80 +++++---- src/H5FDfamily.c | 31 +++- src/H5FDmpio.c | 31 +++- src/H5Fpkg.h | 2 +- src/H5Fprivate.h | 81 +++++++-- src/H5P.c | 338 +++++++++++++++++++--------------- src/H5Pprivate.h | 2 +- src/H5Ppublic.h | 36 ++-- test/lheap.c | 4 +- 12 files changed, 745 insertions(+), 346 deletions(-) diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index 42d0c29..907791a 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -31,7 +31,6 @@ Description: PropList::PropList( const hid_t plist_id ) : IdComponent(0) { if (H5I_GENPROP_CLS == H5Iget_type(plist_id) - || plist_id==H5P_FILE_ACCESS || plist_id==H5P_MOUNT) { // call C routine to create the new property id = H5Pcreate(plist_id); diff --git a/src/H5.c b/src/H5.c index 1e1a6ff..1eb156b 100644 --- a/src/H5.c +++ b/src/H5.c @@ -1974,9 +1974,6 @@ H5_trace (hbool_t returning, const char *func, const char *type, ...) /* property lists are converted to generic property */ /* lists -QAK */ switch (H5P_get_class(id_type)) { - case H5P_FILE_ACCESS_OLD: - fprintf(out, "H5P_FILE_ACCESS"); - break; case H5P_MOUNT_OLD: fprintf(out, "H5P_MOUNT"); break; @@ -2137,9 +2134,6 @@ H5_trace (hbool_t returning, const char *func, const char *type, ...) case H5P_NO_CLASS_OLD: fprintf (out, "H5P_NO_CLASS"); break; - case H5P_FILE_ACCESS_OLD: - fprintf (out, "H5P_FILE_ACCESS"); - break; case H5P_MOUNT_OLD: fprintf (out, "H5P_MOUNT"); break; diff --git a/src/H5F.c b/src/H5F.c index 4ac87dc..7477acf 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -1,17 +1,17 @@ /**************************************************************************** -* NCSA HDF * -* Software Development Group * -* National Center for Supercomputing Applications * -* University of Illinois at Urbana-Champaign * -* 605 E. Springfield, Champaign IL 61820 * -* * -* For conditions of distribution and use, see the accompanying * -* hdf/COPYING file. * -* -* MODIFICATIONS -* Robb Matzke, 30 Aug 1997 -* Added `ERRORS' fields to function prologues. -* +* NCSA HDF * +* Software Development Group * +* National Center for Supercomputing Applications * +* University of Illinois at Urbana-Champaign * +* 605 E. Springfield, Champaign IL 61820 * +* * +* For conditions of distribution and use, see the accompanying * +* hdf/COPYING file. * +* * +* MODIFICATIONS * +* Robb Matzke, 30 Aug 1997 * +* Added `ERRORS' fields to function prologues. * +* * ****************************************************************************/ /* $Id$ */ @@ -48,13 +48,6 @@ #define PABLO_MASK H5F_mask - -/* - * Define the default file access property list. The template is initialized - * by H5F_init_interface(). - */ -H5F_access_t H5F_access_dflt; - /* * Define the default mount property list. */ @@ -171,6 +164,32 @@ H5F_init_interface(void) int freespace_ver = H5F_CRT_FREESPACE_VERS_DEF; int objectdir_ver = H5F_CRT_OBJ_DIR_VERS_DEF; int sharedheader_ver = H5F_CRT_SHARE_HEAD_VERS_DEF; + /* File access property class variables. In sequence, they are + * - Size of meta data cache(elements) + * - Size of raw data chunk cache(elements) + * - Size of raw data chunk cache(bytes) + * - Preemption for reading chunks + * - Threshold for alignment + * - Alignment + * - Minimum metadata allocation block size + * - Maximum sieve buffer size + * - Garbage-collect reference + * - File driver ID + * - File driver info + */ + H5P_genclass_t *acs_pclass; + int mdc_nelmts = H5F_ACS_META_CACHE_SIZE_DEF; + size_t rdcc_nelmts = H5F_ACS_DATA_CACHE_ELMT_SIZE_DEF; + size_t rdcc_nbytes = H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF; + double rdcc_w0 = H5F_ACS_PREEMPT_READ_CHUNKS_DEF; + hsize_t threshold = H5F_ACS_ALIGN_THRHD_DEF; + hsize_t alignment = H5F_ACS_ALIGN_DEF; + size_t meta_block_size = H5F_ACS_META_BLOCK_SIZE_DEF; + size_t sieve_buf_size = H5F_ACS_SIEVE_BUF_SIZE_DEF; + unsigned gc_ref = H5F_ACS_GARBG_COLCT_REF_DEF; + hid_t driver_id = H5F_ACS_FILE_DRV_ID_DEF; + void *driver_info = H5F_ACS_FILE_DRV_INFO_DEF; + FUNC_ENTER(H5F_init_interface, FAIL); @@ -197,11 +216,9 @@ H5F_init_interface(void) HRETURN_ERROR (H5E_FILE, H5E_CANTINIT, FAIL, "unable to initialize interface"); } - - - assert(H5P_CLS_FILE_CREATE_g!=-1); /* ========== File Creation Property Class Initialization ============*/ + assert(H5P_CLS_FILE_CREATE_g!=-1); /* Get the pointer to file creation class */ if(H5I_GENPROP_CLS != H5I_get_type(H5P_CLS_FILE_CREATE_g) || NULL == (crt_pclass = H5I_object(H5P_CLS_FILE_CREATE_g))) @@ -271,9 +288,6 @@ H5F_init_interface(void) HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't insert property into class"); - -/* Register the default file access properties */ - /* Register predefined file drivers */ H5E_BEGIN_TRY { if ((status=H5FD_SEC2)<0) goto end_registration; @@ -304,18 +318,72 @@ H5F_init_interface(void) "file driver registration failed"); } - /* Initialize the default file access property list */ - H5F_access_dflt.mdc_nelmts = H5AC_NSLOTS; - H5F_access_dflt.rdcc_nelmts = 521; - H5F_access_dflt.rdcc_nbytes = 1024*1024; /*1MB*/ - H5F_access_dflt.rdcc_w0 = 0.75; /*preempt fully read chunks*/ - H5F_access_dflt.threshold = 1; /*alignment applies to everything*/ - H5F_access_dflt.alignment = 1; /*no alignment*/ - H5F_access_dflt.gc_ref = 0; /*don't garbage-collect references*/ - H5F_access_dflt.meta_block_size = 2048; /* set metadata block allocations to 2KB */ - H5F_access_dflt.sieve_buf_size = 64*1024; /* set sieve buffer allocation to 64KB */ - H5F_access_dflt.driver_id = H5FD_SEC2; /*default driver*/ - H5F_access_dflt.driver_info = NULL; /*driver file access properties*/ + /* ========== File Access Property Class Initialization ============*/ + assert(H5P_CLS_FILE_ACCESS_g!=-1); + /* Get the pointer to file creation class */ + if(H5I_GENPROP_CLS != H5I_get_type(H5P_CLS_FILE_ACCESS_g) || + NULL == (acs_pclass = H5I_object(H5P_CLS_FILE_ACCESS_g))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class"); + + /* Register the size of meta data cache(elements) */ + if(H5P_register(acs_pclass,H5F_ACS_META_CACHE_SIZE_NAME,H5F_ACS_META_CACHE_SIZE_SIZE, &mdc_nelmts,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the size of raw data chunk cache (elements) */ + if(H5P_register(acs_pclass,H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME,H5F_ACS_DATA_CACHE_ELMT_SIZE_SIZE, &rdcc_nelmts,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the size of raw data chunk cache(bytes) */ + if(H5P_register(acs_pclass,H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME,H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the preemption for reading chunks */ + if(H5P_register(acs_pclass,H5F_ACS_PREEMPT_READ_CHUNKS_NAME,H5F_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the threshold for alignment */ + if(H5P_register(acs_pclass,H5F_ACS_ALIGN_THRHD_NAME,H5F_ACS_ALIGN_THRHD_SIZE, &threshold,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the alignment */ + if(H5P_register(acs_pclass,H5F_ACS_ALIGN_NAME,H5F_ACS_ALIGN_SIZE, &alignment,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the minimum metadata allocation block size */ + if(H5P_register(acs_pclass,H5F_ACS_META_BLOCK_SIZE_NAME,H5F_ACS_META_BLOCK_SIZE_SIZE, &meta_block_size,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the maximum sieve buffer size */ + if(H5P_register(acs_pclass,H5F_ACS_SIEVE_BUF_SIZE_NAME,H5F_ACS_SIEVE_BUF_SIZE_SIZE, &sieve_buf_size,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the garbage collection reference */ + if(H5P_register(acs_pclass,H5F_ACS_GARBG_COLCT_REF_NAME,H5F_ACS_GARBG_COLCT_REF_SIZE, &gc_ref,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the file driver ID */ + if(H5P_register(acs_pclass,H5F_ACS_FILE_DRV_ID_NAME,H5F_ACS_FILE_DRV_ID_SIZE, &driver_id,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the file driver info */ + if(H5P_register(acs_pclass,H5F_ACS_FILE_DRV_INFO_NAME,H5F_ACS_FILE_DRV_INFO_SIZE, &driver_info,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, + "can't insert property into class"); + + /* Register the default file access property list */ + if((H5P_LST_FILE_ACCESS_g = H5Pcreate_list(H5P_CLS_FILE_ACCESS_g))<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, + "can't insert property into class"); done: FUNC_LEAVE(ret_value); @@ -361,6 +429,157 @@ H5F_term_interface(void) } +/*---------------------------------------------------------------------------- + * Function: H5F_acs_create + * + * Purpose: Callback routine which is called whenever a file access + * property list is closed. This routine performs any generic + * initialization needed on the properties the library put into + * the list. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Raymond Lu + * Tuesday, Oct 23, 2001 + * + * Modifications: + * + *---------------------------------------------------------------------------- + */ +herr_t +H5F_acs_create(hid_t fapl_id, void UNUSED *copy_data) +{ + hid_t driver_id; + void* driver_info; + herr_t ret_value = SUCCEED; + + FUNC_ENTER(H5F_acs_create, FAIL); + + /* Check argument */ + if(H5I_GENPROP_LST != H5I_get_type(fapl_id)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); + + /* Retrieve properties */ + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver ID"); + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver info"); + + if(driver_id > 0) { + /* Increment the reference count on driver and copy driver info */ + H5I_inc_ref(driver_id); + driver_info = H5FD_fapl_copy(driver_id, driver_info); + /* Set the driver properties for the list */ + if(H5P_set(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver ID"); + if(H5P_set(fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver info"); + } + +done: + FUNC_LEAVE(ret_value); +} + + +/*-------------------------------------------------------------------------- + * Function: H5F_acs_close + * + * Purpose: Callback routine which is called whenever a file access + * property list is closed. This routine performs any generic + * cleanup needed on the properties. + * + * Return: Success: Non-negative + * + * Failure: Negative + * + * Programmer: Raymond Lu + * Tuesday, Oct 23, 2001 + * + * Modifications: + * + *--------------------------------------------------------------------------- + */ +herr_t +H5F_acs_close(hid_t fapl_id, void UNUSED *close_data) +{ + hid_t driver_id; + void *driver_info; + herr_t ret_value = SUCCEED; + + /* Can't use FUNC_ENTER when library is shutting down */ + + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_DONE(FAIL); /* Can't return errors when library is shutting down */ + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_DONE(FAIL); /* Can't return errors when library is shutting down */ + + if(driver_id > 0) { + /* Free memory for driver info and decrement reference count for driver */ + H5FD_fapl_free(driver_id, driver_info); + H5I_dec_ref(driver_id); + driver_info = NULL; + driver_id = -1; + if(H5P_set(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_DONE(FAIL); /* Can't return errors when library is shutting down */ + if(H5P_set(fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_DONE(FAIL); /* Can't return errors when library is shutting down */ + } + +done: + /* Can't use FUNC_LEAVE when library is shutting down */ + return(ret_value); +} + + +/*-------------------------------------------------------------------------- + * Function: H5F_acs_copy + * + * Purpose: Callback routine which is called whenever a file access + * property list is copied. This routine performs any generic + * copy needed on the properties. + * + * Return: Success: Non-negative + * Failure: Negative + * Programmer: Raymond Lu + * Tuesday, Oct 23, 2001 + * + * Modifications: + * + *-------------------------------------------------------------------------- + */ +herr_t +H5F_acs_copy(hid_t new_fapl_id, hid_t old_fapl_id, void UNUSED *copy_data) +{ + hid_t driver_id; + void* driver_info; + herr_t ret_value = SUCCEED; + + FUNC_ENTER(H5F_acs_copy, FAIL); + + if(H5I_GENPROP_LST != H5I_get_type(new_fapl_id) || H5I_GENPROP_LST != + H5I_get_type(old_fapl_id)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); + + if(H5P_get(old_fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver ID"); + if(H5P_get(old_fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver info"); + + if(driver_id > 0) { + H5I_inc_ref(driver_id); + driver_info = H5FD_fapl_copy(driver_id, driver_info); + if(H5P_set(new_fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver ID"); + if(H5P_set(new_fapl_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver info"); + } + +done: + FUNC_LEAVE(ret_value); +} + + /*------------------------------------------------------------------------- * Function: H5F_flush_all_cb * @@ -539,15 +758,17 @@ H5Fget_create_plist(hid_t file_id) * Wednesday, February 18, 1998 * * Modifications: - * + * Raymond Lu, Oct 23, 2001 + * Changed file access property list to the new generic + * property list. + * *------------------------------------------------------------------------- */ hid_t H5Fget_access_plist(hid_t file_id) { H5F_t *f = NULL; - H5F_access_t _fapl; - H5P_t *plist=NULL; + H5P_t *plist=NULL; hid_t ret_value = FAIL; FUNC_ENTER(H5Fget_access_plist, FAIL); @@ -558,35 +779,59 @@ H5Fget_access_plist(hid_t file_id) HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); } - /* Initialize the property list */ - HDmemset(&_fapl, 0, sizeof _fapl); - _fapl.mdc_nelmts = f->shared->mdc_nelmts; - _fapl.rdcc_nelmts = f->shared->rdcc_nelmts; - _fapl.rdcc_nbytes = f->shared->rdcc_nbytes; - _fapl.rdcc_w0 = f->shared->rdcc_w0; - _fapl.threshold = f->shared->threshold; - _fapl.alignment = f->shared->alignment; - _fapl.gc_ref = f->shared->gc_ref; - _fapl.meta_block_size = f->shared->lf->def_meta_block_size; - _fapl.sieve_buf_size = f->shared->sieve_buf_size; - _fapl.driver_id = f->shared->lf->driver_id; - _fapl.driver_info = NULL; /*just for now */ - - /* Copy properties */ - if (NULL==(plist=H5P_copy(H5P_FILE_ACCESS, &_fapl))) { - HRETURN_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, - "unable to copy file access properties"); - } - - /* Get the properties for the file driver */ - plist->u.faccess.driver_info = H5FD_fapl_get(f->shared->lf); - - /* Create an atom */ - if ((ret_value = H5P_create(H5P_FILE_ACCESS, plist))<0) { - H5P_close(plist); - HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, - "unable to register property list"); - } + /* Make a copy of the default file access property list */ + if((ret_value=H5P_copy_new(H5P_LST_FILE_ACCESS_g)) < 0) + HRETURN_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, + "can't copy file access property list"); + + /* Copy properties of the file access property list */ + if(H5P_set(ret_value, H5F_ACS_META_CACHE_SIZE_NAME, + &(f->shared->mdc_nelmts)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set meta data cache size"); + if(H5P_set(ret_value, H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME, + &(f->shared->rdcc_nelmts)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set data cache element size"); + if(H5P_set(ret_value, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, + &(f->shared->rdcc_nbytes)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set data cache byte size"); + + if(H5P_set(ret_value, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, + &(f->shared->rdcc_w0)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set preempt read chunks"); + if(H5P_set(ret_value, H5F_ACS_ALIGN_THRHD_NAME, + &(f->shared->threshold)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set alignment threshold"); + if(H5P_set(ret_value, H5F_ACS_ALIGN_NAME, + &(f->shared->alignment)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set alignment"); + + if(H5P_set(ret_value, H5F_ACS_GARBG_COLCT_REF_NAME, + &(f->shared->gc_ref)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set garbage collect reference"); + if(H5P_set(ret_value, H5F_ACS_META_BLOCK_SIZE_NAME, + &(f->shared->lf->def_meta_block_size)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set meta data cache size"); + if(H5P_set(ret_value, H5F_ACS_SIEVE_BUF_SIZE_NAME, + &(f->shared->sieve_buf_size)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't sieve buffer size"); + + if(H5P_set(ret_value, H5F_ACS_FILE_DRV_ID_NAME, + &(f->shared->lf->driver_id)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set file driver ID"); + if(H5P_set(ret_value, H5F_ACS_FILE_DRV_INFO_NAME, + H5FD_fapl_get(f->shared->lf)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set file driver info"); FUNC_LEAVE(ret_value); } @@ -764,17 +1009,18 @@ H5Fis_hdf5(const char *name) * Modifications: * * Raymond Lu, Oct 14, 2001 - * Changed to generic property list. + * Changed the file creation and access property list to the + * new generic property list. * *------------------------------------------------------------------------- */ static H5F_t * H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id) { - H5F_t *f=NULL, *ret_value=NULL; + H5F_t *f=NULL, *ret_value=NULL; int n; - const H5F_access_t *fapl=NULL; - + hid_t driver_id = -1; + FUNC_ENTER(H5F_new, NULL); if (NULL==(f=H5FL_ALLOC(H5F_t,1))) { @@ -804,15 +1050,43 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id) f->shared->fcpl_id = H5P_copy_new(fcpl_id); - fapl = (H5P_DEFAULT==fapl_id)? &H5F_access_dflt : (const H5F_access_t *)H5I_object(fapl_id); - f->shared->mdc_nelmts = fapl->mdc_nelmts; - f->shared->rdcc_nelmts = fapl->rdcc_nelmts; - f->shared->rdcc_nbytes = fapl->rdcc_nbytes; - f->shared->rdcc_w0 = fapl->rdcc_w0; - f->shared->threshold = fapl->threshold; - f->shared->alignment = fapl->alignment; - f->shared->gc_ref = fapl->gc_ref; - f->shared->sieve_buf_size = fapl->sieve_buf_size; + if(H5P_DEFAULT == fapl_id) + fapl_id = H5P_FILE_ACCESS_DEFAULT; + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, + "not file access property list"); + + if(H5P_get(fapl_id, H5F_ACS_META_CACHE_SIZE_NAME, + &(f->shared->mdc_nelmts)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get meta data cache size"); + if(H5P_get(fapl_id, H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME, + &(f->shared->rdcc_nelmts)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get data cache element size"); + if(H5P_get(fapl_id, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, + &(f->shared->rdcc_nbytes)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get data cache cache size"); + if(H5P_get(fapl_id, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, + &(f->shared->rdcc_w0)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get preempt read chunk"); + + if(H5P_get(fapl_id, H5F_ACS_ALIGN_THRHD_NAME, &(f->shared->threshold))<0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get alignment threshold"); + if(H5P_get(fapl_id, H5F_ACS_ALIGN_NAME, &(f->shared->alignment)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment"); + if(H5P_get(fapl_id, H5F_ACS_GARBG_COLCT_REF_NAME,&(f->shared->gc_ref))<0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get garbage collect reference"); + if(H5P_get(fapl_id, H5F_ACS_SIEVE_BUF_SIZE_NAME, + &(f->shared->sieve_buf_size)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get sieve buffer size"); + #ifdef H5_HAVE_PARALLEL /* @@ -820,7 +1094,9 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id) * does not permit caching. (maybe able to relax it for * read only open.) */ - if (H5FD_MPIO==fapl->driver_id){ + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID"); + if (H5FD_MPIO==driver_id){ f->shared->rdcc_nbytes = 0; f->shared->mdc_nelmts = 0; } @@ -1030,7 +1306,8 @@ done: * arguments would be the same. * * Raymond Lu, 2001-10-14 - * Changed to generic property list. + * Changed the file creation and access property lists to the + * new generic property list. * *------------------------------------------------------------------------- */ @@ -1470,7 +1747,8 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id) * to the H5F_open() as object IDs. * * Raymond Lu, 2001-10-14 - * Changed to generic property list. + * Changed the file creation and access property list to the + * new generic property list. * *------------------------------------------------------------------------- */ @@ -1481,7 +1759,10 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, H5F_t *new_file = NULL; /*file struct for new file */ hid_t ret_value = FAIL; /*return value */ + size_t meta_block_size = 0; + hid_t driver_id=-1; + FUNC_ENTER(H5Fcreate, FAIL); H5TRACE4("i","sIuii",filename,flags,fcpl_id,fapl_id); @@ -1497,6 +1778,7 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, "mutually exclusive flags for file creation"); } + /* Check file creation property list */ if(H5P_DEFAULT == fcpl_id) fcpl_id = H5P_FILE_CREATE_DEFAULT; if(H5I_GENPROP_LST != H5I_get_type(fcpl_id) || @@ -1504,12 +1786,13 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file create property list"); - if (H5P_DEFAULT!=fapl_id && - (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) || - NULL==H5I_object(fapl_id))) { - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + /* Check the file access property list */ + if(H5P_DEFAULT == fapl_id) + fapl_id = H5P_FILE_ACCESS_DEFAULT; + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not file access property list"); /* * Adjust bit flags by turning on the creation bit and making sure that @@ -1597,12 +1880,12 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id) (flags & H5F_ACC_TRUNC) || (flags & H5F_ACC_EXCL)) { HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags"); } - if (H5P_DEFAULT!=fapl_id && - (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) || - NULL==H5I_object(fapl_id))) { - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if(H5P_DEFAULT == fapl_id) + fapl_id = H5P_FILE_ACCESS_DEFAULT; + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not file access property list"); /* Open the file */ if (NULL==(new_file=H5F_open(filename, flags, H5P_DEFAULT, fapl_id))) { diff --git a/src/H5FD.c b/src/H5FD.c index 62a866f..ef7d756 100644 --- a/src/H5FD.c +++ b/src/H5FD.c @@ -277,38 +277,35 @@ H5FDunregister(hid_t driver_id) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ H5FD_class_t * H5FD_get_class(hid_t id) { H5FD_class_t *ret_value=NULL; - H5F_access_t *fapl=NULL; - + hid_t driver_id = -1; + FUNC_ENTER(H5FD_get_class, NULL); - if (H5P_DEFAULT==id) { - ret_value = H5FD_get_class(H5F_access_dflt.driver_id); - } else if (H5I_VFL==H5I_get_type(id)) { + if (H5I_VFL==H5I_get_type(id)) { ret_value = H5I_object(id); } else if (H5I_GENPROP_LST == H5I_get_type(id) && - TRUE==H5Pisa_class(id,H5P_DATASET_XFER)) { + TRUE==H5Pisa_class(id,H5P_FILE_ACCESS)) { + if(H5P_get(id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID"); + ret_value = H5FD_get_class(driver_id); + } else if (H5I_GENPROP_LST == H5I_get_type(id) && + TRUE==H5Pisa_class(id,H5P_DATASET_XFER)) { ret_value = H5FD_get_class(H5P_peek_hid_t(id,H5D_XFER_VFL_ID_NAME)); } else { - switch (H5P_get_class(id)) { - case H5P_FILE_ACCESS_OLD: - if (NULL==(fapl=H5I_object(id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, - "not a file access property list"); - } - ret_value = H5FD_get_class(fapl->driver_id); - break; - - default: - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, - "not a driver id, file access property list or " + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, + "not a driver id, file access property list or " "data transfer property list"); - } } FUNC_LEAVE(ret_value); } @@ -733,33 +730,42 @@ H5FDopen(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ H5FD_t * H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) { - const H5F_access_t *fapl=NULL; H5FD_class_t *driver; H5FD_t *file=NULL; + hid_t driver_id = -1; + size_t meta_block_size=0; FUNC_ENTER(H5FD_open, NULL); /* Check arguments */ - if (H5P_DEFAULT==fapl_id) { - fapl = &H5F_access_dflt; - } else if (H5P_FILE_ACCESS != H5P_get_class(fapl_id) || - NULL == (fapl = H5I_object(fapl_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, - "not a file access property list"); - } + if(H5P_DEFAULT == fapl_id) + fapl_id = H5P_FILE_ACCESS_DEFAULT; + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, + "not a file access property list"); + if (0==maxaddr) { HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "zero format address range"); } + if(H5P_get(fapl_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID"); + /* Get driver info */ - if (H5I_VFL!=H5I_get_type(fapl->driver_id) || - NULL==(driver=H5I_object(fapl->driver_id))) { + if (H5I_VFL!=H5I_get_type(driver_id) || + NULL==(driver=H5I_object(driver_id))) { HRETURN_ERROR(H5E_VFL, H5E_BADVALUE, NULL, "invalid driver ID in file access property list"); } @@ -778,16 +784,22 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) * Fill in public fields. We must increment the reference count on the * driver ID to prevent it from being freed while this file is open. */ - file->driver_id = fapl->driver_id; + file->driver_id = driver_id; H5I_inc_ref(file->driver_id); file->cls = driver; file->maxaddr = maxaddr; HDmemset(file->fl, 0, sizeof(file->fl)); - file->def_meta_block_size = fapl->meta_block_size; + if(H5P_get(fapl_id, H5F_ACS_META_BLOCK_SIZE_NAME, + &(meta_block_size)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get meta data block size"); + file->def_meta_block_size = meta_block_size; file->accum_loc = HADDR_UNDEF; - file->threshold = fapl->threshold; - file->alignment = fapl->alignment; - + if(H5P_get(fapl_id, H5F_ACS_ALIGN_THRHD_NAME, &(file->threshold)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, + "can't get alignment threshold"); + if(H5P_get(fapl_id, H5F_ACS_ALIGN_NAME, &(file->alignment)) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get alignment"); /* Retrieve the VFL driver feature flags */ if (H5FD_query(file, &(file->feature_flags))<0) HRETURN_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "unable to query file driver"); diff --git a/src/H5FDfamily.c b/src/H5FDfamily.c index 5f67f03..db492b3 100644 --- a/src/H5FDfamily.c +++ b/src/H5FDfamily.c @@ -164,6 +164,11 @@ H5FD_family_init(void) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t @@ -176,11 +181,13 @@ H5Pset_fapl_family(hid_t fapl_id, hsize_t memb_size, hid_t memb_fapl_id) H5TRACE3("e","ihi",fapl_id,memb_size,memb_fapl_id); /* Check arguments */ - if (H5P_FILE_ACCESS!=H5Pget_class(fapl_id)) - HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl"); - if (H5P_DEFAULT!=memb_fapl_id && - H5P_FILE_ACCESS!=H5Pget_class(memb_fapl_id)) - HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl"); + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a file access property list"); + if(H5P_DEFAULT != memb_fapl_id && + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list"); /* * Initialize driver specific information. No need to copy it into the FA @@ -210,6 +217,11 @@ H5Pset_fapl_family(hid_t fapl_id, hsize_t memb_size, hid_t memb_fapl_id) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t @@ -221,14 +233,15 @@ H5Pget_fapl_family(hid_t fapl_id, hsize_t *memb_size/*out*/, FUNC_ENTER(H5Pget_fapl_family, FAIL); H5TRACE3("e","ixx",fapl_id,memb_size,memb_fapl_id); - if (H5P_FILE_ACCESS!=H5Pget_class(fapl_id)) - HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl"); + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list"); if (H5FD_FAMILY!=H5P_get_driver(fapl_id)) HRETURN_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver"); if (NULL==(fa=H5Pget_driver_info(fapl_id))) HRETURN_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info"); if (memb_size) *memb_size = fa->memb_size; - if (memb_fapl_id) *memb_fapl_id = H5Pcopy(fa->memb_fapl_id); + if (memb_fapl_id) *memb_fapl_id = H5P_copy_new(fa->memb_fapl_id); FUNC_LEAVE(SUCCEED); } @@ -423,7 +436,7 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) { H5FD_family_t *file=NULL; - H5FD_t *ret_value=NULL; + H5FD_t *ret_value=NULL; char memb_name[4096], temp[4096]; hsize_t eof; unsigned t_flags = flags & ~H5F_ACC_CREAT; diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c index 76a6662..7448117 100644 --- a/src/H5FDmpio.c +++ b/src/H5FDmpio.c @@ -226,6 +226,12 @@ H5FD_mpio_init(void) * * Robb Matzke, 1999-08-06 * Modified to work with the virtual file layer. + * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t @@ -238,8 +244,11 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info) H5TRACE3("e","iMcMi",fapl_id,comm,info); /* Check arguments */ - if (H5P_FILE_ACCESS!=H5Pget_class(fapl_id)) - HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl"); + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list"); + + #ifdef LATER #warning "We need to verify that COMM and INFO contain sensible information." #endif @@ -275,10 +284,15 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info) * * Modifications: * - * Albert Cheng, Apr 16, 1998 - * Removed the access_mode argument. The access_mode is changed - * to be controlled by data transfer property list during data - * read/write calls. + * Albert Cheng, Apr 16, 1998 + * Removed the access_mode argument. The access_mode is changed + * to be controlled by data transfer property list during data + * read/write calls. + * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. * *------------------------------------------------------------------------- */ @@ -290,8 +304,9 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/) FUNC_ENTER(H5Pget_fapl_mpio, FAIL); H5TRACE3("e","ixx",fapl_id,comm,info); - if (H5P_FILE_ACCESS!=H5Pget_class(fapl_id)) - HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a fapl"); + if(H5I_GENPROP_LST != H5I_GET_TYPE(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list"); if (H5FD_MPIO!=H5P_get_driver(fapl_id)) HRETURN_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver"); if (NULL==(fa=H5Pget_driver_info(fapl_id))) diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index bcb569b..22cae65 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -94,7 +94,7 @@ typedef struct H5F_file_t { haddr_t driver_addr; /* File driver information block address*/ struct H5AC_t *cache; /* The object cache */ hid_t fcpl_id; /* File creation property list ID */ - int mdc_nelmts; /* Size of meta data cache (elements) */ + int mdc_nelmts; /* Size of meta data cache (elements) */ size_t rdcc_nelmts; /* Size of raw data chunk cache (elmts) */ size_t rdcc_nbytes; /* Size of raw data chunk cache (bytes) */ double rdcc_w0; /* Preempt read chunks first? [0.0..1.0]*/ diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index 77af814..aaa29de 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -288,23 +288,63 @@ __DLL__ size_t H5F_sizeof_size(const H5F_t *f); #define H5F_CRT_SHARE_HEAD_VERS_SIZE sizeof(int) #define H5F_CRT_SHARE_HEAD_VERS_DEF HDF5_SHAREDHEADER_VERSION - -/* - * File-access property list. - */ -typedef struct H5F_access_t { - int mdc_nelmts; /* Size of meta data cache (elements) */ - size_t rdcc_nelmts; /* Size of raw data chunk cache (elmts) */ - size_t rdcc_nbytes; /* Size of raw data chunk cache (bytes) */ - double rdcc_w0; /* Preempt read chunks first? [0.0..1.0]*/ - hsize_t threshold; /* Threshold for alignment */ - hsize_t alignment; /* Alignment */ - size_t meta_block_size; /* Minimum metadata allocation block size (when aggregating metadata allocations) */ - size_t sieve_buf_size; /* Maximum sieve buffer size (when data sieving is allowed by file driver) */ - unsigned gc_ref; /* Garbage-collect references? */ - hid_t driver_id; /* File driver ID */ - void *driver_info; /* File driver specific information */ -} H5F_access_t; +/* ========= File Access properties ============ */ +/* Definitions for size of meta data cache(elements) */ +#define H5F_ACS_META_CACHE_SIZE_NAME "mdc_nelmts" +#define H5F_ACS_META_CACHE_SIZE_SIZE sizeof(int) +#define H5F_ACS_META_CACHE_SIZE_DEF H5AC_NSLOTS + +/* Definitions for size of raw data chunk cache(elements) */ +#define H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME "rdcc_nelmts" +#define H5F_ACS_DATA_CACHE_ELMT_SIZE_SIZE sizeof(size_t) +#define H5F_ACS_DATA_CACHE_ELMT_SIZE_DEF 521 + +/* Definition for size of raw data chunk cache(bytes) */ +#define H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME "rdcc_nbytes" +#define H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE sizeof(size_t) +#define H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF 1024*1024 + +/* Definition for preemption read chunks first */ +#define H5F_ACS_PREEMPT_READ_CHUNKS_NAME "rdcc_w0" +#define H5F_ACS_PREEMPT_READ_CHUNKS_SIZE sizeof(double) +#define H5F_ACS_PREEMPT_READ_CHUNKS_DEF 0.75 + +/* Definition for threshold for alignment */ +#define H5F_ACS_ALIGN_THRHD_NAME "threshold" +#define H5F_ACS_ALIGN_THRHD_SIZE sizeof(hsize_t) +#define H5F_ACS_ALIGN_THRHD_DEF 1 + +/* Definition for alignment */ +#define H5F_ACS_ALIGN_NAME "align" +#define H5F_ACS_ALIGN_SIZE sizeof(hsize_t) +#define H5F_ACS_ALIGN_DEF 1 + +/* Definition for minimum metadata allocation block size(when + aggregating metadata allocations. */ +#define H5F_ACS_META_BLOCK_SIZE_NAME "meta_block_size" +#define H5F_ACS_META_BLOCK_SIZE_SIZE sizeof(size_t) +#define H5F_ACS_META_BLOCK_SIZE_DEF 2048 + +/* Definition for maximum sieve buffer size (when data sieving + is allowed by file driver */ +#define H5F_ACS_SIEVE_BUF_SIZE_NAME "sieve_buf_size" +#define H5F_ACS_SIEVE_BUF_SIZE_SIZE sizeof(size_t) +#define H5F_ACS_SIEVE_BUF_SIZE_DEF 64*1024 + +/* Definition for garbage-collect references */ +#define H5F_ACS_GARBG_COLCT_REF_NAME "gc_ref" +#define H5F_ACS_GARBG_COLCT_REF_SIZE sizeof(unsigned) +#define H5F_ACS_GARBG_COLCT_REF_DEF 0 + +/* Definition for file driver ID */ +#define H5F_ACS_FILE_DRV_ID_NAME "driver_id" +#define H5F_ACS_FILE_DRV_ID_SIZE sizeof(hid_t) +#define H5F_ACS_FILE_DRV_ID_DEF H5FD_SEC2 + +/* Definition for file driver info */ +#define H5F_ACS_FILE_DRV_INFO_NAME "driver_info" +#define H5F_ACS_FILE_DRV_INFO_SIZE sizeof(void*) +#define H5F_ACS_FILE_DRV_INFO_DEF NULL /* Mount property list */ typedef struct H5F_mprop_t { @@ -312,7 +352,6 @@ typedef struct H5F_mprop_t { } H5F_mprop_t; /* library variables */ -__DLLVAR__ H5F_access_t H5F_access_dflt; __DLLVAR__ const H5F_mprop_t H5F_mount_dflt; /* Forward declarations for prototypes arguments */ @@ -398,4 +437,10 @@ __DLL__ void H5F_addr_decode(H5F_t *, const uint8_t** /*in,out*/, __DLL__ herr_t H5F_addr_pack(H5F_t *f, haddr_t *addr_p /*out*/, const unsigned long objno[2]); +/* callback Functions for file access class */ +__DLL__ herr_t H5F_acs_create(hid_t fapl_id, void UNUSED *close_data); +__DLL__ herr_t H5F_acs_close(hid_t fapl_id, void UNUSED *close_data); +__DLL__ herr_t H5F_acs_copy(hid_t new_fapl_id, hid_t old_fapl_id, + void UNUSED *close_data); + #endif diff --git a/src/H5P.c b/src/H5P.c index 6371505..7737913 100644 --- a/src/H5P.c +++ b/src/H5P.c @@ -38,7 +38,6 @@ static herr_t H5P_init_interface(void); /* These go away as each old-style property list is converted to a generic */ /* property list -QAK */ hid_t H5P_NO_CLASS=(hid_t)H5P_NO_CLASS_OLD; -hid_t H5P_FILE_ACCESS=(hid_t)H5P_FILE_ACCESS_OLD; hid_t H5P_MOUNT=(hid_t)H5P_MOUNT_OLD; /* @@ -222,7 +221,7 @@ H5P_init_interface(void) HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class"); /* Allocate the file access class */ - if (NULL==(pclass = H5P_create_class (root_class,"file access",H5P_FILE_ACCESS_HASH_SIZE,1,NULL,NULL,NULL,NULL,NULL,NULL))) + if (NULL==(pclass = H5P_create_class (root_class,"file access",H5P_FILE_ACCESS_HASH_SIZE,1,H5F_acs_create,NULL,H5F_acs_copy,NULL,H5F_acs_close,NULL))) HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed"); /* Register the file access class */ @@ -343,14 +342,10 @@ H5Pcreate(hid_t type) else { /* Set the type of the property list to create for older property lists */ old_type=(H5P_class_t_old)type; - assert( old_type==H5P_FILE_ACCESS_OLD || - old_type==H5P_MOUNT_OLD); + assert( old_type == H5P_MOUNT_OLD); /* Allocate a new property list and initialize it with default values */ switch (old_type) { - case H5P_FILE_ACCESS_OLD: - src = &H5F_access_dflt; - break; case H5P_MOUNT_OLD: src = &H5F_mount_dflt; break; @@ -487,7 +482,6 @@ herr_t H5P_close(void *_plist) { H5P_t *plist=(H5P_t *)_plist; - H5F_access_t *fa_list = &(plist->u.faccess); FUNC_ENTER (H5P_close, FAIL); @@ -497,15 +491,6 @@ H5P_close(void *_plist) /* Some property lists may need to do special things */ switch (plist->cls) { - case H5P_FILE_ACCESS_OLD: - if (fa_list->driver_id>=0) { - H5FD_fapl_free(fa_list->driver_id, fa_list->driver_info); - H5I_dec_ref(fa_list->driver_id); - fa_list->driver_info = NULL; - fa_list->driver_id = -1; - } - break; - case H5P_MOUNT_OLD: break; @@ -754,6 +739,9 @@ static hid_t H5P_copy_plist(H5P_genplist_t *old_plist, hid_t old_plist_id) if ((new_plist_id = H5I_register(H5I_GENPROP_LST, new_plist))<0) HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list"); + /* Save the property list ID in the property list struct, for use in the property class's 'close' callback */ + new_plist->plist_id=new_plist_id; + /* Call the class callback (if it exists) now that we have the property list ID */ if(new_plist->pclass->copy_func!=NULL) { if((new_plist->pclass->copy_func)(new_plist_id,old_plist_id,old_plist->pclass->copy_data)<0) { @@ -927,16 +915,11 @@ H5P_copy (H5P_class_t_old type, const void *src) { size_t size; H5P_t *dst = NULL; - H5F_access_t *fa_dst = NULL; FUNC_ENTER (H5P_copy, NULL); /* How big is the property list */ switch (type) { - case H5P_FILE_ACCESS_OLD: - size = sizeof(H5F_access_t); - break; - case H5P_MOUNT_OLD: size = sizeof(H5F_mprop_t); break; @@ -960,15 +943,6 @@ H5P_copy (H5P_class_t_old type, const void *src) /* Deep-copy pointers */ switch (type) { - case H5P_FILE_ACCESS_OLD: - fa_dst = (H5F_access_t*)dst; - - if (fa_dst->driver_id>=0) { - H5I_inc_ref(fa_dst->driver_id); - fa_dst->driver_info = H5FD_fapl_copy(fa_dst->driver_id, - fa_dst->driver_info); - } - break; case H5P_MOUNT_OLD: /* Nothing to do */ @@ -1157,30 +1131,35 @@ H5Pget_userblock(hid_t plist_id, hsize_t *size) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed file access property list mechanism to the new + * generic property list. *------------------------------------------------------------------------- */ herr_t H5Pset_alignment(hid_t fapl_id, hsize_t threshold, hsize_t alignment) { - H5F_access_t *fapl = NULL; FUNC_ENTER (H5Pset_alignment, FAIL); H5TRACE3("e","ihh",fapl_id,threshold,alignment); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a file access property list"); + if (alignment<1) { HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "alignment must be positive"); } /* Set values */ - fapl->threshold = threshold; - fapl->alignment = alignment; + if(H5P_set(fapl_id, H5F_ACS_ALIGN_THRHD_NAME, &threshold) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set threshold"); + if(H5P_set(fapl_id, H5F_ACS_ALIGN_NAME, &alignment) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set alignment"); FUNC_LEAVE (SUCCEED); } @@ -1200,29 +1179,33 @@ H5Pset_alignment(hid_t fapl_id, hsize_t threshold, hsize_t alignment) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list design to the new generic + * property list. + * *------------------------------------------------------------------------- */ herr_t H5Pget_alignment(hid_t fapl_id, hsize_t *threshold/*out*/, hsize_t *alignment/*out*/) { - H5F_access_t *fapl = NULL; - FUNC_ENTER (H5Pget_alignment, FAIL); H5TRACE3("e","ixx",fapl_id,threshold,alignment); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a file access property list"); /* Get values */ if (threshold) - *threshold = fapl->threshold; + if(H5P_get(fapl_id, H5F_ACS_ALIGN_THRHD_NAME, threshold) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get threshold"); if (alignment) - *alignment = fapl->alignment; + if(H5P_set(fapl_id, H5F_ACS_ALIGN_NAME, alignment) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get alignment"); FUNC_LEAVE (SUCCEED); } @@ -1972,12 +1955,16 @@ H5Pget_external(hid_t plist_id, int idx, size_t name_size, char *name/*out*/, * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list design to the new generic + * property list. + * *------------------------------------------------------------------------- */ herr_t H5Pset_driver(hid_t plist_id, hid_t new_driver_id, const void *new_driver_info) { - H5F_access_t *fapl=NULL; hid_t driver_id; /* VFL driver ID */ void *driver_info; /* VFL driver info */ void *tmp_driver_info; /* Temporary VFL driver info */ @@ -1989,23 +1976,27 @@ H5Pset_driver(hid_t plist_id, hid_t new_driver_id, const void *new_driver_info) if (H5I_VFL!=H5I_get_type(new_driver_id) || NULL==H5I_object(new_driver_id)) HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID"); - if (H5P_FILE_ACCESS==H5P_get_class(plist_id)) { - if (NULL==(fapl=H5I_object(plist_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if( TRUE == H5Pisa_class(plist_id, H5P_FILE_ACCESS) ) { /* Remove old driver */ - assert(fapl->driver_id>=0); - H5FD_fapl_free(fapl->driver_id, fapl->driver_info); - H5I_dec_ref(fapl->driver_id); + if(H5P_get(plist_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID"); + if(H5P_get(plist_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,FAIL,"can't get driver info"); + assert(driver_id>=0); + H5FD_fapl_free(driver_id, driver_info); + H5I_dec_ref(driver_id); /* Add new driver */ H5I_inc_ref(new_driver_id); - fapl->driver_id = new_driver_id; - fapl->driver_info = H5FD_fapl_copy(new_driver_id, new_driver_info); + driver_id = new_driver_id; + driver_info = H5FD_fapl_copy(new_driver_id, new_driver_info); + + if(H5P_set(plist_id, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver ID"); + if(H5P_set(plist_id, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET,FAIL,"can't set driver info"); - } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) { + } else if( TRUE == H5Pisa_class(plist_id, H5P_DATASET_XFER) ) { /* Get the current driver information */ if(H5P_get(plist_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0) HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID"); @@ -2035,7 +2026,7 @@ H5Pset_driver(hid_t plist_id, hid_t new_driver_id, const void *new_driver_info) /* Set the driver info for the property list */ if(H5P_set(plist_id, H5D_XFER_VFL_ID_NAME, &new_driver_id)<0) HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver ID"); - if(H5P_set(plist_id, H5D_XFER_VFL_INFO_NAME, &tmp_driver_info)<0) + if(H5P_set(plist_id, H5D_XFER_VFL_INFO_NAME, &tmp_driver_info) < 0) HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver info"); } else { @@ -2084,6 +2075,8 @@ H5Pget_driver(hid_t plist_id) FUNC_ENTER (H5Pget_driver, FAIL); H5TRACE1("i","i",plist_id); + if(H5I_GENPROP_LST != H5I_get_type(plist_id)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); ret_value = H5P_get_driver(plist_id); FUNC_LEAVE(ret_value); @@ -2111,25 +2104,30 @@ H5Pget_driver(hid_t plist_id) * Rewritten to use the virtual file layer. * * Robb Matzke, 1999-08-05 - * If the driver ID is H5FD_VFD_DEFAULT then substitute the current value - * of H5FD_SEC2. + * If the driver ID is H5FD_VFD_DEFAULT then substitute the + * current value of H5FD_SEC2. * * Quincey Koziol 2000-11-28 * Added internal function.. + * + * Raymond Lu, 2001-10-23 + * Changed the file access list design to the new generic + * property list. + * *------------------------------------------------------------------------- */ hid_t H5P_get_driver(hid_t plist_id) { - H5F_access_t *fapl=NULL; hid_t ret_value=-1; FUNC_ENTER (H5P_get_driver, FAIL); H5TRACE1("i","i",plist_id); - if (H5P_FILE_ACCESS==H5P_get_class(plist_id) && (fapl=H5I_object(plist_id))) { - ret_value = fapl->driver_id; - } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) { + if( TRUE == H5Pisa_class(plist_id, H5P_FILE_ACCESS) ) { + if(H5P_get(plist_id, H5F_ACS_FILE_DRV_ID_NAME, &ret_value) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID"); + } else if( TRUE == H5Pisa_class(plist_id, H5P_DATASET_XFER) ) { /* Get the current driver ID */ if(H5P_get(plist_id, H5D_XFER_VFL_ID_NAME, &ret_value)<0) HRETURN_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID"); @@ -2164,19 +2162,24 @@ H5P_get_driver(hid_t plist_id) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list design to the new generic + * property list. + * *------------------------------------------------------------------------- */ void * H5Pget_driver_info(hid_t plist_id) { - H5F_access_t *fapl=NULL; void *ret_value=NULL; FUNC_ENTER(H5Pget_driver_info, NULL); - if (H5P_FILE_ACCESS==H5P_get_class(plist_id) && (fapl=H5I_object(plist_id))) { - ret_value = fapl->driver_info; - } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) { + if( TRUE == H5Pisa_class(plist_id, H5P_FILE_ACCESS) ) { + if(H5P_get(plist_id, H5F_ACS_FILE_DRV_INFO_NAME, &ret_value) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,NULL,"can't get driver info"); + } else if( TRUE == H5Pisa_class(plist_id, H5P_DATASET_XFER) ) { /* Get the current driver info */ if(H5P_get(plist_id, H5D_XFER_VFL_INFO_NAME, &ret_value)<0) HRETURN_ERROR (H5E_PLIST, H5E_CANTGET, NULL, "Can't retrieve VFL driver ID"); @@ -2211,23 +2214,24 @@ H5Pget_driver_info(hid_t plist_id) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property list. + * *------------------------------------------------------------------------- */ herr_t H5Pset_cache(hid_t plist_id, int mdc_nelmts, size_t rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0) { - H5F_access_t *fapl = NULL; FUNC_ENTER (H5Pset_cache, FAIL); H5TRACE5("e","iIszzd",plist_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0); /* Check arguments */ - if (H5P_FILE_ACCESS!=H5P_get_class (plist_id) || - NULL==(fapl=H5I_object (plist_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if( H5I_GENPROP_LST != H5I_get_type(plist_id) || + TRUE != H5Pisa_class(plist_id, H5P_FILE_ACCESS) ) + if (mdc_nelmts<0) { HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "meta data cache size must be non-negative"); @@ -2239,10 +2243,18 @@ H5Pset_cache(hid_t plist_id, int mdc_nelmts, } /* Set sizes */ - fapl->mdc_nelmts = mdc_nelmts; - fapl->rdcc_nelmts = rdcc_nelmts; - fapl->rdcc_nbytes = rdcc_nbytes; - fapl->rdcc_w0 = rdcc_w0; + if(H5P_set(plist_id, H5F_ACS_META_CACHE_SIZE_NAME, &mdc_nelmts) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, + "can't set meta data cache size"); + if(H5P_set(plist_id, H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME, &rdcc_nelmts) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, + "can't set data cache element size"); + if(H5P_set(plist_id, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, &rdcc_nbytes) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, + "can't set data cache byte size"); + if(H5P_set(plist_id, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, &rdcc_w0) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, + "can't set preempt read chunks"); FUNC_LEAVE (SUCCEED); } @@ -2264,34 +2276,44 @@ H5Pset_cache(hid_t plist_id, int mdc_nelmts, * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pget_cache(hid_t plist_id, int *mdc_nelmts, size_t *rdcc_nelmts, size_t *rdcc_nbytes, double *rdcc_w0) { - H5F_access_t *fapl = NULL; FUNC_ENTER (H5Pget_cache, FAIL); H5TRACE5("e","i*Is*z*z*d",plist_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes, rdcc_w0); /* Check arguments */ - if (H5P_FILE_ACCESS!=H5P_get_class (plist_id) || - NULL==(fapl=H5I_object (plist_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if(H5I_GENPROP_LST != H5I_get_type(plist_id) || + TRUE != H5Pisa_class(plist_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Get sizes */ if (mdc_nelmts) - *mdc_nelmts = fapl->mdc_nelmts; + if(H5P_get(plist_id, H5F_ACS_META_CACHE_SIZE_NAME, mdc_nelmts) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, + "can't get meta data cache size"); if (rdcc_nelmts) - *rdcc_nelmts = fapl->rdcc_nelmts; + if(H5P_get(plist_id, H5F_ACS_DATA_CACHE_ELMT_SIZE_NAME, rdcc_nelmts) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, + "can't get data cache element size"); if (rdcc_nbytes) - *rdcc_nbytes = fapl->rdcc_nbytes; + if(H5P_get(plist_id, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, rdcc_nbytes) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, + "can't get data cache byte size"); if (rdcc_w0) - *rdcc_w0 = fapl->rdcc_w0; + if(H5P_get(plist_id, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, rdcc_w0) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, + "can't get preempt read chunks"); FUNC_LEAVE (SUCCEED); } @@ -3159,25 +3181,28 @@ done: * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref) { - H5F_access_t *fapl = NULL; - FUNC_ENTER(H5Pset_gc_references, FAIL); H5TRACE2("e","iIu",fapl_id,gc_ref); /* Check args */ - if (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) || - NULL==(fapl=H5I_object(fapl_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Set values */ - fapl->gc_ref = (gc_ref!=0); + if(H5P_set(fapl_id, H5F_ACS_GARBG_COLCT_REF_NAME, &gc_ref) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set garbage collect reference"); FUNC_LEAVE (SUCCEED); } @@ -3196,26 +3221,28 @@ H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pget_gc_references(hid_t fapl_id, unsigned *gc_ref/*out*/) { - H5F_access_t *fapl = NULL; - FUNC_ENTER(H5Pget_gc_references, FAIL); H5TRACE2("e","ix",fapl_id,gc_ref); /* Check args */ - if (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) || - NULL==(fapl=H5I_object(fapl_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Get values */ if (gc_ref) - *gc_ref = fapl->gc_ref; + if(H5P_get(fapl_id, H5F_ACS_GARBG_COLCT_REF_NAME, gc_ref) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, + "can't get garbage collect reference"); FUNC_LEAVE (SUCCEED); } @@ -3339,25 +3366,27 @@ H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func/*out*/, * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pset_meta_block_size(hid_t fapl_id, size_t size) { - H5F_access_t *fapl = NULL; - FUNC_ENTER (H5Pset_meta_block_size, FAIL); H5TRACE2("e","iz",fapl_id,size); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Set values */ - fapl->meta_block_size = size; + if(H5P_set(fapl_id, H5F_ACS_META_BLOCK_SIZE_NAME, &size) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set meta data block size"); FUNC_LEAVE (SUCCEED); } @@ -3376,26 +3405,29 @@ H5Pset_meta_block_size(hid_t fapl_id, size_t size) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pget_meta_block_size(hid_t fapl_id, size_t *size/*out*/) { - H5F_access_t *fapl = NULL; FUNC_ENTER (H5Pget_meta_block_size, FAIL); H5TRACE2("e","ix",fapl_id,size); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Get values */ if (size) - *size = fapl->meta_block_size; + if(H5P_get(fapl_id, H5F_ACS_META_BLOCK_SIZE_NAME, size) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, + "can't get meta data block size"); FUNC_LEAVE (SUCCEED); } @@ -3423,25 +3455,28 @@ H5Pget_meta_block_size(hid_t fapl_id, size_t *size/*out*/) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pset_sieve_buf_size(hid_t fapl_id, size_t size) { - H5F_access_t *fapl = NULL; FUNC_ENTER (H5Pset_sieve_buf_size, FAIL); H5TRACE2("e","iz",fapl_id,size); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Set values */ - fapl->sieve_buf_size = size; + if(H5P_set(fapl_id, H5F_ACS_SIEVE_BUF_SIZE_NAME, &size) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, + "can't set sieve buffer size"); FUNC_LEAVE (SUCCEED); } /* end H5Pset_sieve_buf_size() */ @@ -3460,26 +3495,28 @@ H5Pset_sieve_buf_size(hid_t fapl_id, size_t size) * * Modifications: * + * Raymond Lu + * Tuesday, Oct 23, 2001 + * Changed the file access list to the new generic property + * list. + * *------------------------------------------------------------------------- */ herr_t H5Pget_sieve_buf_size(hid_t fapl_id, size_t *size/*out*/) { - H5F_access_t *fapl = NULL; - FUNC_ENTER (H5Pget_sieve_buf_size, FAIL); H5TRACE2("e","ix",fapl_id,size); /* Check args */ - if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || - NULL == (fapl = H5I_object (fapl_id))) { - HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, - "not a file access property list"); - } - + if(H5I_GENPROP_LST != H5I_get_type(fapl_id) || + TRUE != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); /* Get values */ if (size) - *size = fapl->sieve_buf_size; + if(H5P_get(fapl_id, H5F_ACS_SIEVE_BUF_SIZE_NAME, size) < 0) + HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, + "can't get sieve buffer size"); FUNC_LEAVE (SUCCEED); } /* end H5Pget_sieve_buf_size() */ @@ -4381,6 +4418,9 @@ hid_t H5Pcreate_list(hid_t cls_id) if ((plist_id = H5I_register(H5I_GENPROP_LST, plist))<0) HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list"); + /* Save the property list ID in the property list struct, for use in the property class's 'close' callback */ + plist->plist_id=plist_id; + /* Call the class callback (if it exists) now that we have the property list ID */ if(plist->pclass->create_func!=NULL) { if((plist->pclass->create_func)(plist_id,plist->pclass->create_data)<0) { @@ -7341,6 +7381,12 @@ static herr_t H5P_close_list(void *_plist) assert(plist); + /* Make call to property list class close callback, if needed */ + if(plist->class_init!=0 && plist->pclass->close_func!=NULL) { + /* Call user's "close" callback function, ignoring return value */ + (plist->pclass->close_func)(plist->plist_id,plist->pclass->close_data); + } /* end if */ + /* Make calls to any property close callbacks which exist */ H5P_free_all_prop(plist->props,plist->pclass->hashsize,1); @@ -7390,12 +7436,6 @@ herr_t H5Pclose_list(hid_t plist_id) if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); - /* Make call to property list class close callback, if needed */ - if(plist->class_init!=0 && plist->pclass->close_func!=NULL) { - /* Call user's "close" callback function, ignoring return value */ - (plist->pclass->close_func)(plist_id,plist->pclass->close_data); - } /* end if */ - /* Close the property list */ if ((ret_value=H5P_close_list(plist)) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't close"); diff --git a/src/H5Pprivate.h b/src/H5Pprivate.h index 212cf4b..f6d7573 100644 --- a/src/H5Pprivate.h +++ b/src/H5Pprivate.h @@ -82,6 +82,7 @@ typedef struct H5P_genclass_tag { /* Define structure to hold property list information */ typedef struct H5P_genplist_tag { H5P_genclass_t *pclass; /* Pointer to class info */ + hid_t plist_id; /* Copy of the property list ID (for use in close callback) */ size_t nprops; /* Number of properties in class */ unsigned class_init:1; /* Whether the class initialization callback finished successfully */ @@ -93,7 +94,6 @@ typedef struct H5P_genplist_tag { typedef struct { /* Union of all the different kinds of property lists */ union { - H5F_access_t faccess; /* File access properties */ H5F_mprop_t mount; /* Mounting properties */ } u; H5P_class_t_old cls; /* Property list class */ diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index 9156065..d9a1911 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -39,8 +39,7 @@ typedef long off_t; /* Property list classes */ typedef enum H5P_class_t_old { H5P_NO_CLASS_OLD = -1, /*error return value */ - H5P_FILE_ACCESS_OLD = 0, /*file access properties */ - H5P_MOUNT_OLD = 1, /*file mounting properties */ + H5P_MOUNT_OLD = 0, /*file mounting properties */ H5P_NCLASSES_OLD /*this must be last! */ } H5P_class_t_old; @@ -55,7 +54,6 @@ typedef hid_t H5P_class_t; /* Alias H5P_class_t to hid_t */ /* - merge/delete H5Pcopy and H5Pcopy_new */ /* - merge/delete H5Pclose and H5Pclose_list */ __DLLVAR__ hid_t H5P_NO_CLASS; -__DLLVAR__ hid_t H5P_FILE_ACCESS; __DLLVAR__ hid_t H5P_MOUNT; /* H5P_DATASET_XFER was the name from the beginning through 1.2. It was @@ -92,16 +90,16 @@ extern "C" { */ #define H5P_NO_CLASS_NEW (H5open(), H5P_CLS_NO_CLASS_g) #define H5P_NO_CLASS_HASH_SIZE 1 /* 1, not 0, otherwise allocations get weird */ -#define H5P_FILE_CREATE (H5open(), H5P_CLS_FILE_CREATE_g) -#define H5P_FILE_CREATE_HASH_SIZE 17 -#define H5P_FILE_ACCESS_NEW (H5open(), H5P_CLS_FILE_ACCESS_g) -#define H5P_FILE_ACCESS_HASH_SIZE 17 -#define H5P_DATASET_CREATE (H5open(), H5P_CLS_DATASET_CREATE_g) -#define H5P_DATASET_CREATE_HASH_SIZE 17 -#define H5P_DATASET_XFER (H5open(), H5P_CLS_DATASET_XFER_g) -#define H5P_DATASET_XFER_HASH_SIZE 17 -#define H5P_MOUNT_NEW (H5open(), H5P_CLS_MOUNT_g) -#define H5P_MOUNT_HASH_SIZE 17 +#define H5P_FILE_CREATE (H5open(), H5P_CLS_FILE_CREATE_g) +#define H5P_FILE_CREATE_HASH_SIZE 17 +#define H5P_FILE_ACCESS (H5open(), H5P_CLS_FILE_ACCESS_g) +#define H5P_FILE_ACCESS_HASH_SIZE 17 +#define H5P_DATASET_CREATE (H5open(), H5P_CLS_DATASET_CREATE_g) +#define H5P_DATASET_CREATE_HASH_SIZE 17 +#define H5P_DATASET_XFER (H5open(), H5P_CLS_DATASET_XFER_g) +#define H5P_DATASET_XFER_HASH_SIZE 17 +#define H5P_MOUNT_NEW (H5open(), H5P_CLS_MOUNT_g) +#define H5P_MOUNT_HASH_SIZE 17 __DLLVAR__ hid_t H5P_CLS_NO_CLASS_g; __DLLVAR__ hid_t H5P_CLS_FILE_CREATE_g; __DLLVAR__ hid_t H5P_CLS_FILE_ACCESS_g; @@ -111,12 +109,12 @@ __DLLVAR__ hid_t H5P_CLS_MOUNT_g; /* * The library created default property lists */ -#define H5P_NO_CLASS_DEFAULT (H5open(), H5P_LST_NO_CLASS_g) -#define H5P_FILE_CREATE_DEFAULT (H5open(), H5P_LST_FILE_CREATE_g) -#define H5P_FILE_ACCESS_DEFAULT (H5open(), H5P_LST_FILE_ACCESS_g) -#define H5P_DATASET_CREATE_DEFAULT (H5open(), H5P_LST_DATASET_CREATE_g) -#define H5P_DATASET_XFER_DEFAULT (H5open(), H5P_LST_DATASET_XFER_g) -#define H5P_MOUNT_DEFAULT (H5open(), H5P_LST_MOUNT_g) +#define H5P_NO_CLASS_DEFAULT (H5open(), H5P_LST_NO_CLASS_g) +#define H5P_FILE_CREATE_DEFAULT (H5open(), H5P_LST_FILE_CREATE_g) +#define H5P_FILE_ACCESS_DEFAULT (H5open(), H5P_LST_FILE_ACCESS_g) +#define H5P_DATASET_CREATE_DEFAULT (H5open(), H5P_LST_DATASET_CREATE_g) +#define H5P_DATASET_XFER_DEFAULT (H5open(), H5P_LST_DATASET_XFER_g) +#define H5P_MOUNT_DEFAULT (H5open(), H5P_LST_MOUNT_g) __DLLVAR__ hid_t H5P_LST_NO_CLASS_g; __DLLVAR__ hid_t H5P_LST_FILE_CREATE_g; __DLLVAR__ hid_t H5P_LST_FILE_ACCESS_g; diff --git a/test/lheap.c b/test/lheap.c index 0d771cf..44fb615 100644 --- a/test/lheap.c +++ b/test/lheap.c @@ -40,7 +40,7 @@ const char *FILENAME[] = { int main(void) { - hid_t fapl=-1; /*file access properties */ + hid_t fapl=H5P_DEFAULT; /*file access properties */ hid_t file=-1; /*hdf5 file */ H5F_t *f=NULL; /*hdf5 file pointer */ char filename[1024]; /*file name */ @@ -89,6 +89,7 @@ main(void) /* * Test reading from the heap... */ + TESTING("local heap read"); h5_fixname(FILENAME[0], fapl, filename, sizeof filename); if ((file=H5Fopen(filename, H5F_ACC_RDONLY, fapl))<0) goto error; @@ -117,7 +118,6 @@ main(void) if (H5Fclose(file)<0) goto error; PASSED(); - puts("All local heap tests passed."); h5_cleanup(FILENAME, fapl); return 0; -- cgit v0.12