Skip to content

Commit

Permalink
Push ID->pointer lookups of DAPLs to API routines
Browse files Browse the repository at this point in the history
Signed-off-by: Quincey Koziol <quincey@koziol.cc>
  • Loading branch information
qkoziol committed Feb 3, 2025
1 parent da867db commit 9c423e9
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 44 deletions.
71 changes: 52 additions & 19 deletions src/H5D.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@

/* Helper routines for sync/async API calls */
static hid_t H5D__create_api_common(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
hid_t lcpl_id, H5P_genplist_t *dcpl, hid_t dapl_id, void **token_ptr,
hid_t lcpl_id, H5P_genplist_t *dcpl, H5P_genplist_t *dapl, void **token_ptr,
H5VL_object_t **_vol_obj_ptr);
static hid_t H5D__open_api_common(hid_t loc_id, const char *name, hid_t dapl_id, void **token_ptr,
static hid_t H5D__open_api_common(hid_t loc_id, const char *name, H5P_genplist_t *dapl, void **token_ptr,
H5VL_object_t **_vol_obj_ptr);
static hid_t H5D__get_space_api_common(hid_t dset_id, void **token_ptr, H5VL_object_t **_vol_obj_ptr);
static herr_t H5D__read_api_common(size_t count, hid_t dset_id[], hid_t mem_type_id[], hid_t mem_space_id[],
Expand Down Expand Up @@ -92,9 +92,10 @@ H5FL_BLK_EXTERN(type_conv);
*/
static hid_t
H5D__create_api_common(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t lcpl_id,
H5P_genplist_t *dcpl, hid_t dapl_id, void **token_ptr, H5VL_object_t **_vol_obj_ptr)
H5P_genplist_t *dcpl, H5P_genplist_t *dapl, void **token_ptr, H5VL_object_t **_vol_obj_ptr)
{
void *dset = NULL; /* New dataset's info */
hid_t dapl_id; /* ID for dataset access property list */
H5VL_object_t *tmp_vol_obj = NULL; /* Object for loc_id */
H5VL_object_t **vol_obj_ptr =
(_vol_obj_ptr ? _vol_obj_ptr : &tmp_vol_obj); /* Ptr to object ptr for loc_id */
Expand All @@ -110,6 +111,7 @@ H5D__create_api_common(hid_t loc_id, const char *name, hid_t type_id, hid_t spac
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string");

/* Set up object access arguments */
dapl_id = H5P_PLIST_ID(dapl);
if (H5VL_setup_acc_args(loc_id, H5P_CLS_DACC, true, &dapl_id, vol_obj_ptr, &loc_params) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set object access arguments");

Expand All @@ -123,8 +125,7 @@ H5D__create_api_common(hid_t loc_id, const char *name, hid_t type_id, hid_t spac
H5CX_set_lcpl(lcpl_id);

/* Create the dataset */
if (NULL == (dset = H5VL_dataset_create(*vol_obj_ptr, &loc_params, name, lcpl_id, type_id, space_id, dcpl,
dapl_id, H5P_DATASET_XFER_DEFAULT, token_ptr)))
if (NULL == (dset = H5VL_dataset_create(*vol_obj_ptr, &loc_params, name, lcpl_id, type_id, space_id, dcpl, dapl, H5P_DATASET_XFER_DEFAULT, token_ptr)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, H5I_INVALID_HID, "unable to create dataset");

/* Get an ID for the dataset */
Expand Down Expand Up @@ -170,11 +171,12 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
hid_t dapl_id)
{
H5P_genplist_t *dcpl; /* Dataset creation property list */
H5P_genplist_t *dapl; /* Dataset access property list */
hid_t ret_value = H5I_INVALID_HID; /* Return value */

FUNC_ENTER_API(H5I_INVALID_HID)

/* Get the pointer to the property list */
/* Get the pointer to the dataset create property list */
if (H5P_DEFAULT == dcpl_id)
dcpl_id = H5P_DATASET_CREATE_DEFAULT;
if (NULL == (dcpl = H5P_object_verify(dcpl_id, H5P_TYPE_DATASET_CREATE, true)))
Expand All @@ -183,9 +185,14 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
/* Set the DCPL for the API context */
H5CX_set_dcpl(dcpl_id);

/* Get the pointer to the dataset access property list */
if (H5P_DEFAULT == dapl_id)
dapl_id = H5P_DATASET_ACCESS_DEFAULT;
if (NULL == (dapl = H5P_object_verify(dapl_id, H5P_TYPE_DATASET_ACCESS, true)))
HGOTO_ERROR(H5E_DATASET, H5E_BADID, H5I_INVALID_HID, "can't find object for ID");

/* Create the dataset synchronously */
if ((ret_value =
H5D__create_api_common(loc_id, name, type_id, space_id, lcpl_id, dcpl, dapl_id, NULL, NULL)) < 0)
if ((ret_value = H5D__create_api_common(loc_id, name, type_id, space_id, lcpl_id, dcpl, dapl, NULL, NULL)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, H5I_INVALID_HID, "unable to synchronously create dataset");

done:
Expand All @@ -208,6 +215,7 @@ H5Dcreate_async(const char *app_file, const char *app_func, unsigned app_line, h
{
H5VL_object_t *vol_obj = NULL; /* Object for loc_id */
H5P_genplist_t *dcpl; /* Dataset creation property list */
H5P_genplist_t *dapl; /* Dataset access property list */
void *token = NULL; /* Request token for async operation */
void **token_ptr = H5_REQUEST_NULL; /* Pointer to request token for async operation */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
Expand All @@ -218,7 +226,7 @@ H5Dcreate_async(const char *app_file, const char *app_func, unsigned app_line, h
if (H5ES_NONE != es_id)
token_ptr = &token; /* Point at token for VOL connector to set up */

/* Get the pointer to the property list */
/* Get the pointer to the dataset create property list */
if (H5P_DEFAULT == dcpl_id)
dcpl_id = H5P_DATASET_CREATE_DEFAULT;
if (NULL == (dcpl = H5P_object_verify(dcpl_id, H5P_TYPE_DATASET_CREATE, true)))
Expand All @@ -227,9 +235,14 @@ H5Dcreate_async(const char *app_file, const char *app_func, unsigned app_line, h
/* Set the DCPL for the API context */
H5CX_set_dcpl(dcpl_id);

/* Get the pointer to the dataset access property list */
if (H5P_DEFAULT == dapl_id)
dapl_id = H5P_DATASET_ACCESS_DEFAULT;
if (NULL == (dapl = H5P_object_verify(dapl_id, H5P_TYPE_DATASET_ACCESS, true)))
HGOTO_ERROR(H5E_DATASET, H5E_BADID, H5I_INVALID_HID, "can't find object for ID");

/* Create the dataset asynchronously */
if ((ret_value = H5D__create_api_common(loc_id, name, type_id, space_id, lcpl_id, dcpl, dapl_id,
token_ptr, &vol_obj)) < 0)
if ((ret_value = H5D__create_api_common(loc_id, name, type_id, space_id, lcpl_id, dcpl, dapl, token_ptr, &vol_obj)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, H5I_INVALID_HID, "unable to asynchronously create dataset");

/* If a token was created, add the token to the event set */
Expand Down Expand Up @@ -284,6 +297,7 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t
{
void *dset = NULL; /* dset object from VOL connector */
H5P_genplist_t *dcpl; /* Dataset creation property list */
H5P_genplist_t *dapl; /* Dataset access property list */
H5VL_object_t *vol_obj = NULL; /* Object for loc_id */
H5VL_loc_params_t loc_params; /* Location parameters for object access */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
Expand All @@ -304,6 +318,12 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t
/* Set the DCPL for the API context */
H5CX_set_dcpl(dcpl_id);

/* Get the pointer to the dataset access property list */
if (H5P_DEFAULT == dapl_id)
dapl_id = H5P_DATASET_ACCESS_DEFAULT;
if (NULL == (dapl = H5P_object_verify(dapl_id, H5P_TYPE_DATASET_ACCESS, true)))
HGOTO_ERROR(H5E_DATASET, H5E_BADID, H5I_INVALID_HID, "can't find object for ID");

/* Verify access property list and set up collective metadata if appropriate */
if (H5CX_set_apl(&dapl_id, H5P_CLS_DACC, loc_id, true) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info");
Expand All @@ -317,9 +337,7 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t
loc_params.obj_type = H5I_get_type(loc_id);

/* Create the dataset */
if (NULL ==
(dset = H5VL_dataset_create(vol_obj, &loc_params, NULL, H5P_LINK_CREATE_DEFAULT, type_id, space_id,
dcpl, dapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
if (NULL == (dset = H5VL_dataset_create(vol_obj, &loc_params, NULL, H5P_LINK_CREATE_DEFAULT, type_id, space_id, dcpl, dapl, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to create dataset");

/* Get an ID for the dataset */
Expand All @@ -346,10 +364,11 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t
*-------------------------------------------------------------------------
*/
static hid_t
H5D__open_api_common(hid_t loc_id, const char *name, hid_t dapl_id, void **token_ptr,
H5D__open_api_common(hid_t loc_id, const char *name, H5P_genplist_t *dapl, void **token_ptr,
H5VL_object_t **_vol_obj_ptr)
{
void *dset = NULL; /* dset object from VOL connector */
hid_t dapl_id; /* ID for dataset access property list */
H5VL_object_t *tmp_vol_obj = NULL; /* Object for loc_id */
H5VL_object_t **vol_obj_ptr =
(_vol_obj_ptr ? _vol_obj_ptr : &tmp_vol_obj); /* Ptr to object ptr for loc_id */
Expand All @@ -365,12 +384,12 @@ H5D__open_api_common(hid_t loc_id, const char *name, hid_t dapl_id, void **token
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string");

/* Set up object access arguments */
dapl_id = H5P_PLIST_ID(dapl);
if (H5VL_setup_acc_args(loc_id, H5P_CLS_DACC, false, &dapl_id, vol_obj_ptr, &loc_params) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set object access arguments");

/* Open the dataset */
if (NULL == (dset = H5VL_dataset_open(*vol_obj_ptr, &loc_params, name, dapl_id, H5P_DATASET_XFER_DEFAULT,
token_ptr)))
if (NULL == (dset = H5VL_dataset_open(*vol_obj_ptr, &loc_params, name, dapl, H5P_DATASET_XFER_DEFAULT, token_ptr)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open dataset");

/* Register an atom for the dataset */
Expand Down Expand Up @@ -403,12 +422,19 @@ H5D__open_api_common(hid_t loc_id, const char *name, hid_t dapl_id, void **token
hid_t
H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
{
H5P_genplist_t *dapl; /* Dataset access property list */
hid_t ret_value = H5I_INVALID_HID; /* Return value */

FUNC_ENTER_API(H5I_INVALID_HID)

/* Get the pointer to the dataset access property list */
if (H5P_DEFAULT == dapl_id)
dapl_id = H5P_DATASET_ACCESS_DEFAULT;
if (NULL == (dapl = H5P_object_verify(dapl_id, H5P_TYPE_DATASET_ACCESS, true)))
HGOTO_ERROR(H5E_DATASET, H5E_BADID, H5I_INVALID_HID, "can't find object for ID");

/* Open the dataset synchronously */
if ((ret_value = H5D__open_api_common(loc_id, name, dapl_id, NULL, NULL)) < 0)
if ((ret_value = H5D__open_api_common(loc_id, name, dapl, NULL, NULL)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to synchronously open dataset");

done:
Expand All @@ -430,6 +456,7 @@ H5Dopen_async(const char *app_file, const char *app_func, unsigned app_line, hid
hid_t dapl_id, hid_t es_id)
{
H5VL_object_t *vol_obj = NULL; /* Object for loc_id */
H5P_genplist_t *dapl; /* Dataset access property list */
void *token = NULL; /* Request token for async operation */
void **token_ptr = H5_REQUEST_NULL; /* Pointer to request token for async operation */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
Expand All @@ -440,8 +467,14 @@ H5Dopen_async(const char *app_file, const char *app_func, unsigned app_line, hid
if (H5ES_NONE != es_id)
token_ptr = &token; /* Point at token for VOL connector to set up */

/* Get the pointer to the dataset access property list */
if (H5P_DEFAULT == dapl_id)
dapl_id = H5P_DATASET_ACCESS_DEFAULT;
if (NULL == (dapl = H5P_object_verify(dapl_id, H5P_TYPE_DATASET_ACCESS, true)))
HGOTO_ERROR(H5E_DATASET, H5E_BADID, H5I_INVALID_HID, "can't find object for ID");

/* Open the dataset asynchronously */
if ((ret_value = H5D__open_api_common(loc_id, name, dapl_id, token_ptr, &vol_obj)) < 0)
if ((ret_value = H5D__open_api_common(loc_id, name, dapl, token_ptr, &vol_obj)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to asynchronously open dataset");

/* If a token was created, add the token to the event set */
Expand Down
18 changes: 13 additions & 5 deletions src/H5Ddeprec.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
{
void *dset = NULL; /* dset object from VOL connector */
H5P_genplist_t *dcpl; /* Dataset creation property list */
H5P_genplist_t *def_dapl; /* Default dataset access property list */
H5VL_object_t *vol_obj = NULL; /* object of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
Expand All @@ -115,6 +116,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
if (H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set collective metadata read");

/* Get the pointer to the dataset create property list */
if (H5P_DEFAULT == dcpl_id)
dcpl_id = H5P_DATASET_CREATE_DEFAULT;
if (NULL == (dcpl = H5P_object_verify(dcpl_id, H5P_TYPE_DATASET_CREATE, true)))
Expand All @@ -123,6 +125,10 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
/* Set the DCPL for the API context */
H5CX_set_dcpl(dcpl_id);

/* Get a pointer to the default DAPL */
if (NULL == (def_dapl = H5I_object(H5P_DATASET_ACCESS_DEFAULT)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "can't get default DAPL");

/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
Expand All @@ -132,9 +138,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier");

/* Create the dataset */
if (NULL == (dset = H5VL_dataset_create(vol_obj, &loc_params, name, H5P_LINK_CREATE_DEFAULT, type_id,
space_id, dcpl, H5P_DATASET_ACCESS_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
if (NULL == (dset = H5VL_dataset_create(vol_obj, &loc_params, name, H5P_LINK_CREATE_DEFAULT, type_id, space_id, dcpl, def_dapl, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to create dataset");

/* Register the new dataset to get an ID for it */
Expand Down Expand Up @@ -167,6 +171,7 @@ hid_t
H5Dopen1(hid_t loc_id, const char *name)
{
void *dset = NULL; /* dset object from VOL connector */
H5P_genplist_t *def_dapl; /* Default dataset access property list */
H5VL_object_t *vol_obj = NULL; /* object of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
Expand All @@ -179,6 +184,10 @@ H5Dopen1(hid_t loc_id, const char *name)
if (!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string");

/* Get a pointer to the default DAPL */
if (NULL == (def_dapl = H5I_object(H5P_DATASET_ACCESS_DEFAULT)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "can't get default DAPL");

/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
Expand All @@ -188,8 +197,7 @@ H5Dopen1(hid_t loc_id, const char *name)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier");

/* Open the dataset */
if (NULL == (dset = H5VL_dataset_open(vol_obj, &loc_params, name, H5P_DATASET_ACCESS_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
if (NULL == (dset = H5VL_dataset_open(vol_obj, &loc_params, name, def_dapl, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open dataset");

/* Get an ID for the dataset */
Expand Down
Loading

0 comments on commit 9c423e9

Please sign in to comment.