summaryrefslogtreecommitdiffstats
path: root/src/H5M.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5M.c')
-rw-r--r--src/H5M.c346
1 files changed, 248 insertions, 98 deletions
diff --git a/src/H5M.c b/src/H5M.c
index 552d3fc..c7d1bc9 100644
--- a/src/H5M.c
+++ b/src/H5M.c
@@ -211,15 +211,20 @@ H5M_term_package(void)
static herr_t
H5M__close_cb(H5VL_object_t *map_vol_obj, void **request)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(map_vol_obj);
+ /* Set up VOL callback arguments */
+ vol_cb_args.op_type = H5VL_MAP_CLOSE;
+ vol_cb_args.args = NULL;
+
/* Close the map */
- if (H5VL_optional(map_vol_obj, H5VL_MAP_CLOSE, H5P_DATASET_XFER_DEFAULT, request) < 0)
+ if (H5VL_optional(map_vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, request) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CLOSEERROR, FAIL, "unable to close map");
/* Free the VOL object */
@@ -251,8 +256,9 @@ H5M__create_api_common(hid_t loc_id, const char *name, hid_t key_type_id, hid_t
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 */
- H5VL_loc_params_t loc_params; /* Location parameters */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_STATIC
@@ -274,14 +280,24 @@ H5M__create_api_common(hid_t loc_id, const char *name, hid_t key_type_id, hid_t
else if (TRUE != H5P_isa_class(mcpl_id, H5P_MAP_CREATE))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "mcpl_id is not a map create property list ID")
- /* Set up object access arguments */
- if (H5VL_setup_acc_args(loc_id, H5P_CLS_MACC, TRUE, &mapl_id, vol_obj_ptr, &loc_params) < 0)
+ /* Set up VOL callback arguments */
+ if (H5VL_setup_acc_args(loc_id, H5P_CLS_MACC, TRUE, &mapl_id, vol_obj_ptr, &map_args.create.loc_params) <
+ 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTSET, H5I_INVALID_HID, "can't set object access arguments")
+ map_args.create.name = name;
+ map_args.create.lcpl_id = lcpl_id;
+ map_args.create.key_type_id = key_type_id;
+ map_args.create.val_type_id = val_type_id;
+ map_args.create.mcpl_id = mcpl_id;
+ map_args.create.mapl_id = mapl_id;
+ map_args.create.map = NULL;
+ vol_cb_args.op_type = H5VL_MAP_CREATE;
+ vol_cb_args.args = &map_args;
/* Create the map */
- if (H5VL_optional(*vol_obj_ptr, H5VL_MAP_CREATE, H5P_DATASET_XFER_DEFAULT, token_ptr, &loc_params, name,
- lcpl_id, key_type_id, val_type_id, mcpl_id, mapl_id, &map) < 0)
+ if (H5VL_optional(*vol_obj_ptr, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, token_ptr) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, H5I_INVALID_HID, "unable to create map")
+ map = map_args.create.map;
/* Get an ID for the map */
if ((ret_value = H5VL_register(H5I_MAP, map, (*vol_obj_ptr)->connector, TRUE)) < 0)
@@ -289,9 +305,14 @@ H5M__create_api_common(hid_t loc_id, const char *name, hid_t key_type_id, hid_t
done:
/* Cleanup on failure */
- if (H5I_INVALID_HID == ret_value)
- if (map && H5VL_optional(*vol_obj_ptr, H5VL_MAP_CLOSE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
+ if (H5I_INVALID_HID == ret_value) {
+ /* Set up VOL callback arguments */
+ vol_cb_args.op_type = H5VL_MAP_CLOSE;
+ vol_cb_args.args = NULL;
+
+ if (map && H5VL_optional(*vol_obj_ptr, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map")
+ } /* end if */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5M__create_api_common() */
@@ -407,10 +428,11 @@ done:
hid_t
H5Mcreate_anon(hid_t loc_id, hid_t key_type_id, hid_t val_type_id, hid_t mcpl_id, hid_t mapl_id)
{
- void * map = NULL; /* map object from VOL connector */
- 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 */
+ void * map = NULL; /* map object from VOL connector */
+ H5VL_object_t * vol_obj = NULL; /* object of loc_id */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE5("i", "iiiii", loc_id, key_type_id, val_type_id, mcpl_id, mapl_id);
@@ -430,13 +452,24 @@ H5Mcreate_anon(hid_t loc_id, hid_t key_type_id, hid_t val_type_id, hid_t mcpl_id
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set location parameters */
- loc_params.type = H5VL_OBJECT_BY_SELF;
- loc_params.obj_type = H5I_get_type(loc_id);
+
+ /* Set up VOL callback arguments */
+ map_args.create.loc_params.type = H5VL_OBJECT_BY_SELF;
+ map_args.create.loc_params.obj_type = H5I_get_type(loc_id);
+ map_args.create.name = NULL;
+ map_args.create.lcpl_id = H5P_LINK_CREATE_DEFAULT;
+ map_args.create.key_type_id = key_type_id;
+ map_args.create.val_type_id = val_type_id;
+ map_args.create.mcpl_id = mcpl_id;
+ map_args.create.mapl_id = mapl_id;
+ map_args.create.map = NULL;
+ vol_cb_args.op_type = H5VL_MAP_CREATE;
+ vol_cb_args.args = &map_args;
/* Create the map */
- if (H5VL_optional(vol_obj, H5VL_MAP_CREATE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &loc_params, NULL,
- H5P_LINK_CREATE_DEFAULT, key_type_id, val_type_id, mcpl_id, mapl_id, &map) < 0)
+ if (H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, H5I_INVALID_HID, "unable to create map")
+ map = map_args.create.map;
/* Get an ID for the map */
if ((ret_value = H5VL_register(H5I_MAP, map, vol_obj->connector, TRUE)) < 0)
@@ -444,9 +477,14 @@ H5Mcreate_anon(hid_t loc_id, hid_t key_type_id, hid_t val_type_id, hid_t mcpl_id
done:
/* Cleanup on failure */
- if (H5I_INVALID_HID == ret_value)
- if (map && H5VL_optional(vol_obj, H5VL_MAP_CLOSE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
+ if (H5I_INVALID_HID == ret_value) {
+ /* Set up VOL callback arguments */
+ vol_cb_args.op_type = H5VL_MAP_CLOSE;
+ vol_cb_args.args = NULL;
+
+ if (map && H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map")
+ } /* end if */
FUNC_LEAVE_API(ret_value)
} /* end H5Mcreate_anon() */
@@ -470,8 +508,9 @@ H5M__open_api_common(hid_t loc_id, const char *name, hid_t mapl_id, void **token
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 */
- H5VL_loc_params_t loc_params; /* Location parameters */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_STATIC
@@ -481,14 +520,20 @@ H5M__open_api_common(hid_t loc_id, const char *name, hid_t mapl_id, void **token
if (!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string")
- /* Set up object access arguments */
- if (H5VL_setup_acc_args(loc_id, H5P_CLS_MACC, FALSE, &mapl_id, vol_obj_ptr, &loc_params) < 0)
+ /* Set up VOL callback arguments */
+ if (H5VL_setup_acc_args(loc_id, H5P_CLS_MACC, FALSE, &mapl_id, vol_obj_ptr, &map_args.open.loc_params) <
+ 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTSET, H5I_INVALID_HID, "can't set object access arguments")
+ map_args.open.name = name;
+ map_args.open.mapl_id = mapl_id;
+ map_args.open.map = NULL;
+ vol_cb_args.op_type = H5VL_MAP_OPEN;
+ vol_cb_args.args = &map_args;
/* Open the map */
- if (H5VL_optional(*vol_obj_ptr, H5VL_MAP_OPEN, H5P_DATASET_XFER_DEFAULT, token_ptr, &loc_params, name,
- mapl_id, &map) < 0)
+ if (H5VL_optional(*vol_obj_ptr, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, token_ptr) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open map")
+ map = map_args.create.map;
/* Register an ID for the map */
if ((ret_value = H5VL_register(H5I_MAP, map, (*vol_obj_ptr)->connector, TRUE)) < 0)
@@ -496,9 +541,14 @@ H5M__open_api_common(hid_t loc_id, const char *name, hid_t mapl_id, void **token
done:
/* Cleanup on failure */
- if (H5I_INVALID_HID == ret_value)
- if (map && H5VL_optional(*vol_obj_ptr, H5VL_MAP_CLOSE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
+ if (H5I_INVALID_HID == ret_value) {
+ /* Set up VOL callback arguments */
+ vol_cb_args.op_type = H5VL_MAP_CLOSE;
+ vol_cb_args.args = NULL;
+
+ if (map && H5VL_optional(*vol_obj_ptr, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map")
+ } /* end if */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5M__open_api_common() */
@@ -521,9 +571,7 @@ done:
hid_t
H5Mopen(hid_t loc_id, const char *name, hid_t mapl_id)
{
- void * map = NULL; /* map object from VOL connector */
- H5VL_object_t *vol_obj = NULL; /* object of loc_id */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "i*si", loc_id, name, mapl_id);
@@ -533,11 +581,6 @@ H5Mopen(hid_t loc_id, const char *name, hid_t mapl_id)
HGOTO_ERROR(H5E_MAP, H5E_CANTCREATE, H5I_INVALID_HID, "unable to open map synchronously")
done:
- /* Cleanup on failure */
- if (H5I_INVALID_HID == ret_value)
- if (map && H5VL_optional(vol_obj, H5VL_MAP_CLOSE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
- HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map")
-
FUNC_LEAVE_API(ret_value)
} /* end H5Mopen() */
@@ -697,8 +740,10 @@ done:
hid_t
H5Mget_key_type(hid_t map_id)
{
- H5VL_object_t *vol_obj; /* Map structure */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_object_t * vol_obj; /* Map structure */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", map_id);
@@ -707,10 +752,18 @@ H5Mget_key_type(hid_t map_id)
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier")
- /* get the datatype */
- if (H5VL_optional(vol_obj, H5VL_MAP_GET, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET_KEY_TYPE,
- &ret_value) < 0)
- HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype")
+ /* Set up VOL callback arguments */
+ map_args.get.get_type = H5VL_MAP_GET_KEY_TYPE;
+ map_args.get.args.get_key_type.type_id = H5I_INVALID_HID;
+ vol_cb_args.op_type = H5VL_MAP_GET;
+ vol_cb_args.args = &map_args;
+
+ /* Get the key datatype */
+ if (H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
+ HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get key datatype")
+
+ /* Set return value */
+ ret_value = map_args.get.args.get_key_type.type_id;
done:
FUNC_LEAVE_API(ret_value)
@@ -732,8 +785,10 @@ done:
hid_t
H5Mget_val_type(hid_t map_id)
{
- H5VL_object_t *vol_obj; /* Map structure */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_object_t * vol_obj; /* Map structure */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", map_id);
@@ -742,10 +797,18 @@ H5Mget_val_type(hid_t map_id)
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier")
- /* get the datatype */
- if (H5VL_optional(vol_obj, H5VL_MAP_GET, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET_VAL_TYPE,
- &ret_value) < 0)
- HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype")
+ /* Set up VOL callback arguments */
+ map_args.get.get_type = H5VL_MAP_GET_VAL_TYPE;
+ map_args.get.args.get_val_type.type_id = H5I_INVALID_HID;
+ vol_cb_args.op_type = H5VL_MAP_GET;
+ vol_cb_args.args = &map_args;
+
+ /* Get the value datatype */
+ if (H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
+ HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get value datatype")
+
+ /* Set return value */
+ ret_value = map_args.get.args.get_val_type.type_id;
done:
FUNC_LEAVE_API(ret_value)
@@ -767,8 +830,10 @@ done:
hid_t
H5Mget_create_plist(hid_t map_id)
{
- H5VL_object_t *vol_obj; /* Map structure */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_object_t * vol_obj; /* Map structure */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", map_id);
@@ -777,11 +842,19 @@ H5Mget_create_plist(hid_t map_id)
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier")
+ /* Set up VOL callback arguments */
+ map_args.get.get_type = H5VL_MAP_GET_MCPL;
+ map_args.get.args.get_mcpl.mcpl_id = H5I_INVALID_HID;
+ vol_cb_args.op_type = H5VL_MAP_GET;
+ vol_cb_args.args = &map_args;
+
/* Get the map creation property list */
- if (H5VL_optional(vol_obj, H5VL_MAP_GET, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET_MCPL,
- &ret_value) < 0)
+ if (H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map creation properties")
+ /* Set return value */
+ ret_value = map_args.get.args.get_mcpl.mcpl_id;
+
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Mget_create_plist() */
@@ -805,8 +878,10 @@ done:
hid_t
H5Mget_access_plist(hid_t map_id)
{
- H5VL_object_t *vol_obj; /* Map structure */
- hid_t ret_value = H5I_INVALID_HID; /* Return value */
+ H5VL_object_t * vol_obj; /* Map structure */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", map_id);
@@ -815,11 +890,19 @@ H5Mget_access_plist(hid_t map_id)
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier")
+ /* Set up VOL callback arguments */
+ map_args.get.get_type = H5VL_MAP_GET_MAPL;
+ map_args.get.args.get_mapl.mapl_id = H5I_INVALID_HID;
+ vol_cb_args.op_type = H5VL_MAP_GET;
+ vol_cb_args.args = &map_args;
+
/* Get the map access property list */
- if (H5VL_optional(vol_obj, H5VL_MAP_GET, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET_MAPL,
- &ret_value) < 0)
+ if (H5VL_optional(vol_obj, &vol_cb_args, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map access properties")
+ /* Set return value */
+ ret_value = map_args.get.args.get_mapl.mapl_id;
+
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Mget_access_plist() */
@@ -839,8 +922,10 @@ done:
herr_t
H5Mget_count(hid_t map_id, hsize_t *count /*out*/, hid_t dxpl_id)
{
- H5VL_object_t *vol_obj; /* Map structure */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_object_t * vol_obj; /* Map structure */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("e", "ixi", map_id, count, dxpl_id);
@@ -858,9 +943,19 @@ H5Mget_count(hid_t map_id, hsize_t *count /*out*/, hid_t dxpl_id)
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
+ /* Set up VOL callback arguments */
+ map_args.get.get_type = H5VL_MAP_GET_COUNT;
+ map_args.get.args.get_count.count = 0;
+ vol_cb_args.op_type = H5VL_MAP_GET;
+ vol_cb_args.args = &map_args;
+
/* Get the number of key-value pairs stored in the map */
- if (H5VL_optional(vol_obj, H5VL_MAP_GET, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_GET_COUNT, count) < 0)
- HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map access properties")
+ if (H5VL_optional(vol_obj, &vol_cb_args, dxpl_id, H5_REQUEST_NULL) < 0)
+ HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get KV pair count for map")
+
+ /* Set value to return */
+ if (count)
+ *count = map_args.get.args.get_count.count;
done:
FUNC_LEAVE_API(ret_value)
@@ -882,7 +977,9 @@ H5M__put_api_common(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t
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 */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -905,9 +1002,16 @@ H5M__put_api_common(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
+ /* Set up VOL callback arguments */
+ map_args.put.key_mem_type_id = key_mem_type_id;
+ map_args.put.key = key;
+ map_args.put.value_mem_type_id = val_mem_type_id;
+ map_args.put.value = value;
+ vol_cb_args.op_type = H5VL_MAP_PUT;
+ vol_cb_args.args = &map_args;
+
/* Set the key/value pair */
- if (H5VL_optional(*vol_obj_ptr, H5VL_MAP_PUT, dxpl_id, token_ptr, key_mem_type_id, key, val_mem_type_id,
- value) < 0)
+ if (H5VL_optional(*vol_obj_ptr, &vol_cb_args, dxpl_id, token_ptr) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTSET, FAIL, "unable to put key/value pair")
done:
@@ -1008,7 +1112,9 @@ H5M__get_api_common(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t
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 */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -1031,9 +1137,16 @@ H5M__get_api_common(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
+ /* Set up VOL callback arguments */
+ map_args.get_val.key_mem_type_id = key_mem_type_id;
+ map_args.get_val.key = key;
+ map_args.get_val.value_mem_type_id = val_mem_type_id;
+ map_args.get_val.value = value;
+ vol_cb_args.op_type = H5VL_MAP_GET_VAL;
+ vol_cb_args.args = &map_args;
+
/* Get the value for the key */
- if (H5VL_optional(*vol_obj_ptr, H5VL_MAP_GET_VAL, dxpl_id, token_ptr, key_mem_type_id, key,
- val_mem_type_id, value) < 0)
+ if (H5VL_optional(*vol_obj_ptr, &vol_cb_args, dxpl_id, token_ptr) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTGET, FAIL, "unable to get value from map")
done:
@@ -1137,8 +1250,10 @@ done:
herr_t
H5Mexists(hid_t map_id, hid_t key_mem_type_id, const void *key, hbool_t *exists, hid_t dxpl_id)
{
- H5VL_object_t *vol_obj = NULL;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_object_t * vol_obj = NULL;
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "ii*x*bi", map_id, key_mem_type_id, key, exists, dxpl_id);
@@ -1160,11 +1275,21 @@ H5Mexists(hid_t map_id, hid_t key_mem_type_id, const void *key, hbool_t *exists,
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
+ /* Set up VOL callback arguments */
+ map_args.exists.key_mem_type_id = key_mem_type_id;
+ map_args.exists.key = key;
+ map_args.exists.exists = FALSE;
+ vol_cb_args.op_type = H5VL_MAP_EXISTS;
+ vol_cb_args.args = &map_args;
+
/* Check if key exists */
- if ((ret_value = H5VL_optional(vol_obj, H5VL_MAP_EXISTS, dxpl_id, H5_REQUEST_NULL, key_mem_type_id, key,
- exists)) < 0)
+ if (H5VL_optional(vol_obj, &vol_cb_args, dxpl_id, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTGET, ret_value, "unable to check if key exists")
+ /* Set value to return */
+ if (exists)
+ *exists = map_args.exists.exists;
+
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Mexists() */
@@ -1203,9 +1328,10 @@ done:
herr_t
H5Miterate(hid_t map_id, hsize_t *idx, hid_t key_mem_type_id, H5M_iterate_t op, void *op_data, hid_t dxpl_id)
{
- H5VL_object_t * vol_obj = NULL;
- H5VL_loc_params_t loc_params;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_object_t * vol_obj = NULL;
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "i*hiMI*xi", map_id, idx, key_mem_type_id, op, op_data, dxpl_id);
@@ -1229,14 +1355,23 @@ H5Miterate(hid_t map_id, hsize_t *idx, hid_t key_mem_type_id, H5M_iterate_t op,
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
- /* Set location struct fields */
- loc_params.type = H5VL_OBJECT_BY_SELF;
- loc_params.obj_type = H5I_get_type(map_id);
+ /* Set up VOL callback arguments */
+ map_args.specific.specific_type = H5VL_MAP_ITER;
+ map_args.specific.args.iterate.loc_params.type = H5VL_OBJECT_BY_SELF;
+ map_args.specific.args.iterate.loc_params.obj_type = H5I_get_type(map_id);
+ map_args.specific.args.iterate.idx = (idx ? *idx : 0);
+ map_args.specific.args.iterate.op = op;
+ map_args.specific.args.iterate.op_data = op_data;
+ vol_cb_args.op_type = H5VL_MAP_SPECIFIC;
+ vol_cb_args.args = &map_args;
/* Iterate over keys */
- if ((ret_value = H5VL_optional(vol_obj, H5VL_MAP_SPECIFIC, dxpl_id, H5_REQUEST_NULL, &loc_params,
- H5VL_MAP_ITER, idx, key_mem_type_id, op, op_data)) < 0)
- HGOTO_ERROR(H5E_MAP, H5E_BADITER, ret_value, "unable to iterate over keys")
+ if ((ret_value = H5VL_optional(vol_obj, &vol_cb_args, dxpl_id, H5_REQUEST_NULL)) < 0)
+ HERROR(H5E_MAP, H5E_BADITER, "unable to iterate over keys");
+
+ /* Set value to return */
+ if (idx)
+ *idx = map_args.specific.args.iterate.idx;
done:
FUNC_LEAVE_API(ret_value)
@@ -1277,9 +1412,10 @@ herr_t
H5Miterate_by_name(hid_t loc_id, const char *map_name, hsize_t *idx, hid_t key_mem_type_id, H5M_iterate_t op,
void *op_data, hid_t dxpl_id, hid_t lapl_id)
{
- H5VL_object_t * vol_obj = NULL;
- H5VL_loc_params_t loc_params;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_object_t * vol_obj = NULL;
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE8("e", "i*s*hiMI*xii", loc_id, map_name, idx, key_mem_type_id, op, op_data, dxpl_id, lapl_id);
@@ -1307,16 +1443,25 @@ H5Miterate_by_name(hid_t loc_id, const char *map_name, hsize_t *idx, hid_t key_m
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
- /* Set location struct fields */
- loc_params.type = H5VL_OBJECT_BY_NAME;
- loc_params.obj_type = H5I_get_type(loc_id);
- loc_params.loc_data.loc_by_name.name = map_name;
- loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
+ /* Set up VOL callback arguments */
+ map_args.specific.specific_type = H5VL_MAP_ITER;
+ map_args.specific.args.iterate.loc_params.type = H5VL_OBJECT_BY_NAME;
+ map_args.specific.args.iterate.loc_params.obj_type = H5I_get_type(loc_id);
+ map_args.specific.args.iterate.loc_params.loc_data.loc_by_name.name = map_name;
+ map_args.specific.args.iterate.loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
+ map_args.specific.args.iterate.idx = (idx ? *idx : 0);
+ map_args.specific.args.iterate.op = op;
+ map_args.specific.args.iterate.op_data = op_data;
+ vol_cb_args.op_type = H5VL_MAP_SPECIFIC;
+ vol_cb_args.args = &map_args;
/* Iterate over keys */
- if ((ret_value = H5VL_optional(vol_obj, H5VL_MAP_SPECIFIC, dxpl_id, H5_REQUEST_NULL, &loc_params,
- H5VL_MAP_ITER, idx, key_mem_type_id, op, op_data)) < 0)
- HGOTO_ERROR(H5E_MAP, H5E_BADITER, ret_value, "unable to ierate over keys")
+ if ((ret_value = H5VL_optional(vol_obj, &vol_cb_args, dxpl_id, H5_REQUEST_NULL)) < 0)
+ HERROR(H5E_MAP, H5E_BADITER, "unable to ierate over keys");
+
+ /* Set value to return */
+ if (idx)
+ *idx = map_args.specific.args.iterate.idx;
done:
FUNC_LEAVE_API(ret_value)
@@ -1340,9 +1485,10 @@ done:
herr_t
H5Mdelete(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t dxpl_id)
{
- H5VL_object_t * vol_obj = NULL;
- H5VL_loc_params_t loc_params;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_object_t * vol_obj = NULL;
+ H5VL_optional_args_t vol_cb_args; /* Arguments to VOL callback */
+ H5VL_map_args_t map_args; /* Arguments for map operations */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "ii*xi", map_id, key_mem_type_id, key, dxpl_id);
@@ -1364,13 +1510,17 @@ H5Mdelete(hid_t map_id, hid_t key_mem_type_id, const void *key, hid_t dxpl_id)
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
- /* Set location struct fields */
- loc_params.type = H5VL_OBJECT_BY_SELF;
- loc_params.obj_type = H5I_get_type(map_id);
+ /* Set up VOL callback arguments */
+ map_args.specific.specific_type = H5VL_MAP_DELETE;
+ map_args.specific.args.del.loc_params.type = H5VL_OBJECT_BY_SELF;
+ map_args.specific.args.del.loc_params.obj_type = H5I_get_type(map_id);
+ map_args.specific.args.del.key_mem_type_id = key_mem_type_id;
+ map_args.specific.args.del.key = key;
+ vol_cb_args.op_type = H5VL_MAP_SPECIFIC;
+ vol_cb_args.args = &map_args;
/* Delete the key/value pair */
- if (H5VL_optional(vol_obj, H5VL_MAP_SPECIFIC, dxpl_id, H5_REQUEST_NULL, &loc_params, H5VL_MAP_DELETE,
- key_mem_type_id, key) < 0)
+ if (H5VL_optional(vol_obj, &vol_cb_args, dxpl_id, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_MAP, H5E_CANTSET, FAIL, "unable to delete key/value pair")
done: