From b8468e6fdb1fc6d7cfc47cc9324a4453d5c79358 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 5 Mar 2019 10:36:28 -0600 Subject: Move 'minimize dataset object header flag' into API context --- src/H5CX.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/H5CXprivate.h | 4 +++ src/H5Dint.c | 12 +++---- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/src/H5CX.c b/src/H5CX.c index d90fec1..cfcdfd4 100644 --- a/src/H5CX.c +++ b/src/H5CX.c @@ -186,6 +186,10 @@ typedef struct H5CX_t { hid_t lapl_id; /* LAPL ID for API operation */ H5P_genplist_t *lapl; /* Link Access Property List */ + /* DCPL */ + hid_t dcpl_id; /* DCPL ID for API operation */ + H5P_genplist_t *dcpl; /* Dataset Creation Property List */ + /* Internal: Object tagging info */ haddr_t tag; /* Current object's tag (ohdr chunk #0 address) */ @@ -271,6 +275,10 @@ typedef struct H5CX_t { size_t nlinks; /* Number of soft / UD links to traverse (H5L_ACS_NLINKS_NAME) */ hbool_t nlinks_valid; /* Whether number of soft / UD links to traverse is valid */ + /* Cached DCPL properties */ + hbool_t do_min_dset_ohdr; /* Whether to minimize dataset object header */ + hbool_t do_min_dset_ohdr_valid; /* Whether minimize dataset object header flag is valid */ + /* Cached VOL settings */ H5VL_connector_prop_t vol_connector_prop; /* Property for VOL connector ID & info */ hbool_t vol_connector_prop_valid; /* Whether property for VOL connector ID & info is valid */ @@ -325,6 +333,12 @@ typedef struct H5CX_lapl_cache_t { size_t nlinks; /* Number of soft / UD links to traverse (H5L_ACS_NLINKS_NAME) */ } H5CX_lapl_cache_t; +/* Typedef for cached default dataset creation property list information */ +/* (Same as the cached DXPL struct, above, except for the default DCPL) */ +typedef struct H5CX_dcpl_cache_t { + hbool_t do_min_dset_ohdr; /* Whether to minimize dataset object header */ +} H5CX_dcpl_cache_t; + /********************/ /* Local Prototypes */ @@ -358,6 +372,9 @@ static H5CX_dxpl_cache_t H5CX_def_dxpl_cache; /* Define a "default" link access property list cache structure to use for default LAPLs */ static H5CX_lapl_cache_t H5CX_def_lapl_cache; +/* Define a "default" dataset creation property list cache structure to use for default DCPLs */ +static H5CX_dcpl_cache_t H5CX_def_dcpl_cache; + /* Declare a static free list to manage H5CX_node_t structs */ H5FL_DEFINE_STATIC(H5CX_node_t); @@ -378,6 +395,7 @@ H5CX__init_package(void) { H5P_genplist_t *dx_plist; /* Data transfer property list */ H5P_genplist_t *la_plist; /* Link access property list */ + H5P_genplist_t *dc_plist; /* Dataset creation property list */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_STATIC @@ -477,6 +495,20 @@ H5CX__init_package(void) if(H5P_get(la_plist, H5L_ACS_NLINKS_NAME, &H5CX_def_lapl_cache.nlinks) < 0) HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve number of soft / UD links to traverse") + + /* Reset the "default DCPL cache" information */ + HDmemset(&H5CX_def_dcpl_cache, 0, sizeof(H5CX_dcpl_cache_t)); + + /* Get the default DCPL cache information */ + + /* Get the default link access property list */ + if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(H5P_DATASET_CREATE_DEFAULT))) + HGOTO_ERROR(H5E_CONTEXT, H5E_BADTYPE, FAIL, "not a dataset create property list") + + /* Get flag to indicate whether to minimize dataset object header */ + if(H5P_get(dc_plist, H5D_CRT_MIN_DSET_HDR_SIZE_NAME, &H5CX_def_dcpl_cache.do_min_dset_ohdr) < 0) + HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve dataset minimize flag") + done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX__init_package() */ @@ -732,6 +764,35 @@ H5CX_set_dxpl(hid_t dxpl_id) /*------------------------------------------------------------------------- + * Function: H5CX_set_dcpl + * + * Purpose: Sets the DCPL for the current API call context. + * + * Return: + * + * Programmer: Quincey Koziol + * March 6, 2019 + * + *------------------------------------------------------------------------- + */ +void +H5CX_set_dcpl(hid_t dcpl_id) +{ + H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ + + FUNC_ENTER_NOAPI_NOINIT_NOERR + + /* Sanity check */ + HDassert(*head); + + /* Set the API context's DCPL to a new value */ + (*head)->ctx.dcpl_id = dcpl_id; + + FUNC_LEAVE_NOAPI_VOID +} /* end H5CX_set_dcpl() */ + + +/*------------------------------------------------------------------------- * Function: H5CX_set_lapl * * Purpose: Sets the LAPL for the current API call context. @@ -2001,6 +2062,42 @@ done: /*------------------------------------------------------------------------- + * Function: H5CX_get_dset_min_ohdr_flag + * + * Purpose: Retrieves the flag that indicates whether the dataset object + * header should be minimized + * + * Return: Non-negative on success / Negative on failure + * + * Programmer: Quincey Koziol + * March 6, 2019 + * + *------------------------------------------------------------------------- + */ +herr_t +H5CX_get_dset_min_ohdr_flag(hbool_t *dset_min_ohdr_flag) +{ + H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(FAIL) + + /* Sanity check */ + HDassert(dset_min_ohdr_flag); + HDassert(head && *head); + HDassert(H5P_DEFAULT != (*head)->ctx.dcpl_id); + + H5CX_RETRIEVE_PROP_VALID(dcpl, H5P_DATASET_CREATE_DEFAULT, H5D_CRT_MIN_DSET_HDR_SIZE_NAME, do_min_dset_ohdr) + + /* Get the value */ + *dset_min_ohdr_flag = (*head)->ctx.do_min_dset_ohdr; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5CX_get_dset_min_ohdr_flag() */ + + +/*------------------------------------------------------------------------- * Function: H5CX_set_tag * * Purpose: Sets the object tag for the current API call context. diff --git a/src/H5CXprivate.h b/src/H5CXprivate.h index 46d25d0..51ee96b 100644 --- a/src/H5CXprivate.h +++ b/src/H5CXprivate.h @@ -60,6 +60,7 @@ H5_DLL hbool_t H5CX_is_def_dxpl(void); /* "Setter" routines for API context info */ H5_DLL void H5CX_set_dxpl(hid_t dxpl_id); H5_DLL void H5CX_set_lapl(hid_t lapl_id); +H5_DLL void H5CX_set_dcpl(hid_t dcpl_id); H5_DLL herr_t H5CX_set_apl(hid_t *acspl_id, const H5P_libclass_t *libclass, hid_t loc_id, hbool_t is_collective); H5_DLL herr_t H5CX_set_loc(hid_t loc_id); @@ -105,6 +106,9 @@ H5_DLL herr_t H5CX_get_dt_conv_cb(H5T_conv_cb_t *cb_struct); /* "Getter" routines for LAPL properties cached in API context */ H5_DLL herr_t H5CX_get_nlinks(size_t *nlinks); +/* "Getter" routines for DCPL properties cached in API context */ +H5_DLL herr_t H5CX_get_dset_min_ohdr_flag(hbool_t *dset_min_ohdr_flag); + /* "Setter" routines for API context info */ H5_DLL void H5CX_set_tag(haddr_t tag); H5_DLL void H5CX_set_ring(H5AC_ring_t ring); diff --git a/src/H5Dint.c b/src/H5Dint.c index 7eb1aaf..384c66b 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -488,6 +488,9 @@ H5D__new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type) new_dset->dcpl_id = H5P_copy_plist(plist, FALSE); } /* end else */ + /* Set the DCPL for the API context */ + H5CX_set_dcpl(new_dset->dcpl_id); + /* Set return value */ ret_value = new_dset; @@ -678,7 +681,6 @@ done: static herr_t H5D__use_minimized_dset_headers(H5F_t *file, H5D_t *dset, hbool_t *minimize) { - H5P_genplist_t *plist = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT; @@ -687,11 +689,9 @@ H5D__use_minimized_dset_headers(H5F_t *file, H5D_t *dset, hbool_t *minimize) HDassert(dset); HDassert(minimize); - plist = H5P_object_verify(dset->shared->dcpl_id, H5P_DATASET_CREATE); - if(NULL == plist) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "problem getting dcpl") - if(H5P_get(plist, H5D_CRT_MIN_DSET_HDR_SIZE_NAME, minimize) == FAIL) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get minimize value from dcpl") + /* Get the dataset object header minimize flag for this call */ + if(H5CX_get_dset_min_ohdr_flag(minimize) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset object header minimize flag from API context") if(FALSE == *minimize) *minimize = H5F_get_min_dset_ohdr(file); -- cgit v0.12