summaryrefslogtreecommitdiffstats
path: root/src/H5VLnative_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5VLnative_object.c')
-rw-r--r--src/H5VLnative_object.c207
1 files changed, 101 insertions, 106 deletions
diff --git a/src/H5VLnative_object.c b/src/H5VLnative_object.c
index 449f389..d237617 100644
--- a/src/H5VLnative_object.c
+++ b/src/H5VLnative_object.c
@@ -15,9 +15,16 @@
*
*/
-#define H5O_FRIEND /* Suppress error about including H5Opkg */
+/****************/
+/* Module Setup */
+/****************/
+
#define H5F_FRIEND /* Suppress error about including H5Fpkg */
+#define H5O_FRIEND /* Suppress error about including H5Opkg */
+/***********/
+/* Headers */
+/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Fpkg.h" /* Files (pkg needed for id_exists) */
@@ -29,6 +36,30 @@
#include "H5VLnative_private.h" /* Native VOL connector */
+/****************/
+/* Local Macros */
+/****************/
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/*******************/
+/* Local Variables */
+/*******************/
+
/*-------------------------------------------------------------------------
* Function: H5VL__native_object_open
*
@@ -138,8 +169,8 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_object_get_t get_type,
- hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req, va_list arguments)
+H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_object_get_args_t *args,
+ hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
{
herr_t ret_value = SUCCEED; /* Return value */
H5G_loc_t loc; /* Location of group */
@@ -149,14 +180,12 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
- switch (get_type) {
+ switch (args->op_type) {
/* Object file */
case H5VL_OBJECT_GET_FILE: {
- void **ret = HDva_arg(arguments, void **);
-
if (loc_params->type == H5VL_OBJECT_BY_SELF) {
- *ret = (void *)loc.oloc->file;
+ *args->args.get_file.file = (void *)loc.oloc->file;
/* TODO we currently need to set id_exists to TRUE because
* the upper layer will create an ID from the returned
@@ -166,18 +195,16 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
}
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_file parameters")
+
break;
}
/* Object name */
case H5VL_OBJECT_GET_NAME: {
- ssize_t *ret = HDva_arg(arguments, ssize_t *);
- char * name = HDva_arg(arguments, char *);
- size_t size = HDva_arg(arguments, size_t);
-
if (loc_params->type == H5VL_OBJECT_BY_SELF) {
/* Retrieve object's name */
- if ((*ret = H5G_get_name(&loc, name, size, NULL)) < 0)
+ if (H5G_get_name(&loc, args->args.get_name.buf, args->args.get_name.buf_size,
+ args->args.get_name.name_len, NULL) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't retrieve object name")
} /* end if */
else if (loc_params->type == H5VL_OBJECT_BY_TOKEN) {
@@ -194,18 +221,18 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
"can't deserialize object token into address")
/* Retrieve object's name */
- if ((*ret = H5G_get_name_by_addr(loc.oloc->file, &obj_oloc, name, size)) < 0)
+ if (H5G_get_name_by_addr(loc.oloc->file, &obj_oloc, args->args.get_name.buf,
+ args->args.get_name.buf_size, args->args.get_name.name_len) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't determine object name")
} /* end else-if */
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_name parameters")
+
break;
}
/* Object type */
case H5VL_OBJECT_GET_TYPE: {
- H5O_type_t *obj_type = HDva_arg(arguments, H5O_type_t *);
-
if (loc_params->type == H5VL_OBJECT_BY_TOKEN) {
H5O_loc_t obj_oloc; /* Object location */
unsigned rc; /* Reference count of object */
@@ -222,35 +249,30 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
/* Get the # of links for object, and its type */
/* (To check to make certain that this object hasn't been deleted) */
- if (H5O_get_rc_and_type(&obj_oloc, &rc, obj_type) < 0 || 0 == rc)
+ if (H5O_get_rc_and_type(&obj_oloc, &rc, args->args.get_type.obj_type) < 0 || 0 == rc)
HGOTO_ERROR(H5E_REFERENCE, H5E_LINKCOUNT, FAIL, "dereferencing deleted object")
}
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_type parameters")
+
break;
}
/* H5Oget_info(_name|_by_idx)3 */
case H5VL_OBJECT_GET_INFO: {
- H5O_info2_t *oinfo = HDva_arg(arguments, H5O_info2_t *);
- unsigned fields = HDva_arg(arguments, unsigned);
-
- /* Use the original H5Oget_info code to get the data */
-
- if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oget_info */
- /* Retrieve the object's information */
- if (H5G_loc_info(&loc, ".", oinfo, fields) < 0)
+ if (loc_params->type == H5VL_OBJECT_BY_SELF) {
+ if (H5G_loc_info(&loc, ".", args->args.get_info.oinfo, args->args.get_info.fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
- } /* end if */
- else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oget_info_by_name */
- /* Retrieve the object's information */
- if (H5G_loc_info(&loc, loc_params->loc_data.loc_by_name.name, oinfo, fields) < 0)
+ } /* end if */
+ else if (loc_params->type == H5VL_OBJECT_BY_NAME) {
+ if (H5G_loc_info(&loc, loc_params->loc_data.loc_by_name.name, args->args.get_info.oinfo,
+ args->args.get_info.fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
- } /* end else-if */
- else if (loc_params->type == H5VL_OBJECT_BY_IDX) { /* H5Oget_info_by_idx */
- H5G_loc_t obj_loc; /* Location used to open group */
- H5G_name_t obj_path; /* Opened object group hier. path */
- H5O_loc_t obj_oloc; /* Opened object object location */
+ } /* end else-if */
+ else if (loc_params->type == H5VL_OBJECT_BY_IDX) {
+ H5G_loc_t obj_loc; /* Location used to open group */
+ H5G_name_t obj_path; /* Opened object group hier. path */
+ H5O_loc_t obj_oloc; /* Opened object object location */
/* Set up opened group location to fill in */
obj_loc.oloc = &obj_oloc;
@@ -265,7 +287,7 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found")
/* Retrieve the object's information */
- if (H5O_get_info(obj_loc.oloc, oinfo, fields) < 0) {
+ if (H5O_get_info(obj_loc.oloc, args->args.get_info.oinfo, args->args.get_info.fields) < 0) {
H5G_loc_free(&obj_loc);
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object info")
} /* end if */
@@ -276,6 +298,7 @@ H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_obj
} /* end else-if */
else
HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, FAIL, "unknown get info parameters")
+
break;
}
@@ -298,8 +321,8 @@ done:
*/
herr_t
H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params,
- H5VL_object_specific_t specific_type, hid_t H5_ATTR_UNUSED dxpl_id,
- void H5_ATTR_UNUSED **req, va_list arguments)
+ H5VL_object_specific_args_t *args, hid_t H5_ATTR_UNUSED dxpl_id,
+ void H5_ATTR_UNUSED **req)
{
H5G_loc_t loc;
herr_t ret_value = SUCCEED; /* Return value */
@@ -309,13 +332,10 @@ H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params,
if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
- switch (specific_type) {
+ switch (args->op_type) {
/* H5Oincr_refcount / H5Odecr_refcount */
case H5VL_OBJECT_CHANGE_REF_COUNT: {
- int update_ref = HDva_arg(arguments, int);
- H5O_loc_t *oloc = loc.oloc;
-
- if (H5O_link(oloc, update_ref) < 0)
+ if (H5O_link(loc.oloc, args->args.change_rc.delta) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed")
break;
@@ -323,25 +343,20 @@ H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params,
/* H5Oexists_by_name */
case H5VL_OBJECT_EXISTS: {
- htri_t *ret = HDva_arg(arguments, htri_t *);
-
if (loc_params->type == H5VL_OBJECT_BY_NAME) {
/* Check if the object exists */
- if ((*ret = H5G_loc_exists(&loc, loc_params->loc_data.loc_by_name.name)) < 0)
+ if (H5G_loc_exists(&loc, loc_params->loc_data.loc_by_name.name, args->args.exists.exists) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine if '%s' exists",
loc_params->loc_data.loc_by_name.name)
} /* end if */
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown object exists parameters")
+
break;
}
/* Lookup object */
case H5VL_OBJECT_LOOKUP: {
- H5O_token_t *token = HDva_arg(arguments, H5O_token_t *);
-
- HDassert(token);
-
if (loc_params->type == H5VL_OBJECT_BY_NAME) {
H5G_loc_t obj_loc; /* Group hier. location of object */
H5G_name_t obj_path; /* Object group hier. path */
@@ -357,7 +372,8 @@ H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params,
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
/* Encode token */
- if (H5VL_native_addr_to_token(loc.oloc->file, H5I_FILE, obj_loc.oloc->addr, token) < 0)
+ if (H5VL_native_addr_to_token(loc.oloc->file, H5I_FILE, obj_loc.oloc->addr,
+ args->args.lookup.token_ptr) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL,
"can't serialize address into object token")
@@ -370,46 +386,39 @@ H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params,
break;
}
+ /* H5Ovisit/H5Ovisit_by_name */
case H5VL_OBJECT_VISIT: {
- H5_index_t idx_type = (H5_index_t)HDva_arg(arguments, int); /* enum work-around */
- H5_iter_order_t order = (H5_iter_order_t)HDva_arg(arguments, int); /* enum work-around */
- H5O_iterate2_t op = HDva_arg(arguments, H5O_iterate2_t);
- void * op_data = HDva_arg(arguments, void *);
- unsigned fields = HDva_arg(arguments, unsigned);
+ H5VL_object_visit_args_t *visit_args = &args->args.visit;
/* Call internal object visitation routine */
if (loc_params->type == H5VL_OBJECT_BY_SELF) {
- /* H5Ovisit */
- if ((ret_value = H5O__visit(&loc, ".", idx_type, order, op, op_data, fields)) < 0)
+ if ((ret_value = H5O__visit(&loc, ".", visit_args->idx_type, visit_args->order,
+ visit_args->op, visit_args->op_data, visit_args->fields)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
} /* end if */
else if (loc_params->type == H5VL_OBJECT_BY_NAME) {
- /* H5Ovisit_by_name */
- if ((ret_value = H5O__visit(&loc, loc_params->loc_data.loc_by_name.name, idx_type, order, op,
- op_data, fields)) < 0)
+ if ((ret_value = H5O__visit(&loc, loc_params->loc_data.loc_by_name.name, visit_args->idx_type,
+ visit_args->order, visit_args->op, visit_args->op_data,
+ visit_args->fields)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
} /* end else-if */
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown object visit params");
+
break;
}
case H5VL_OBJECT_FLUSH: {
- hid_t oid = HDva_arg(arguments, hid_t);
-
/* Flush the object's metadata */
- if (H5O_flush(loc.oloc, oid) < 0)
+ if (H5O_flush(loc.oloc, args->args.flush.obj_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
break;
}
case H5VL_OBJECT_REFRESH: {
- hid_t oid = HDva_arg(arguments, hid_t);
- H5O_loc_t *oloc = loc.oloc;
-
/* Refresh the metadata */
- if (H5O_refresh_metadata(oid, *oloc) < 0)
+ if (H5O_refresh_metadata(loc.oloc, args->args.refresh.obj_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
break;
@@ -433,64 +442,59 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL__native_object_optional(void *obj, H5VL_object_optional_t optional_type, hid_t H5_ATTR_UNUSED dxpl_id,
- void H5_ATTR_UNUSED **req, va_list arguments)
+H5VL__native_object_optional(void *obj, const H5VL_loc_params_t *loc_params, H5VL_optional_args_t *args,
+ hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
{
- H5VL_loc_params_t *loc_params = HDva_arg(arguments, H5VL_loc_params_t *);
- H5G_loc_t loc; /* Location of group */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5G_loc_t loc; /* Location of group */
+ H5VL_native_object_optional_args_t *opt_args = args->args; /* Pointer to native operation's arguments */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
- switch (optional_type) {
+ switch (args->op_type) {
/* H5Oget_comment / H5Oget_comment_by_name */
case H5VL_NATIVE_OBJECT_GET_COMMENT: {
- char * comment = HDva_arg(arguments, char *);
- size_t bufsize = HDva_arg(arguments, size_t);
- ssize_t *ret = HDva_arg(arguments, ssize_t *);
+ H5VL_native_object_get_comment_t *gc_args = &opt_args->get_comment;
/* Retrieve the object's comment */
if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oget_comment */
- if ((*ret = H5G_loc_get_comment(&loc, ".", comment /*out*/, bufsize)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
+ if (H5G_loc_get_comment(&loc, ".", gc_args->buf, gc_args->buf_size, gc_args->comment_len) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get comment for object")
} /* end if */
else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oget_comment_by_name */
- if ((*ret = H5G_loc_get_comment(&loc, loc_params->loc_data.loc_by_name.name, comment /*out*/,
- bufsize)) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
+ if (H5G_loc_get_comment(&loc, loc_params->loc_data.loc_by_name.name, gc_args->buf,
+ gc_args->buf_size, gc_args->comment_len) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get comment for object")
} /* end else-if */
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown set_coment parameters")
+
break;
}
/* H5Oset_comment */
case H5VL_NATIVE_OBJECT_SET_COMMENT: {
- const char *comment = HDva_arg(arguments, char *);
-
if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oset_comment */
- /* (Re)set the object's comment */
- if (H5G_loc_set_comment(&loc, ".", comment) < 0)
+ if (H5G_loc_set_comment(&loc, ".", opt_args->set_comment.comment) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
} /* end if */
else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oset_comment_by_name */
- /* (Re)set the object's comment */
- if (H5G_loc_set_comment(&loc, loc_params->loc_data.loc_by_name.name, comment) < 0)
+ if (H5G_loc_set_comment(&loc, loc_params->loc_data.loc_by_name.name,
+ opt_args->set_comment.comment) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
} /* end else-if */
else
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown set_coment parameters")
+
break;
}
/* H5Odisable_mdc_flushes */
case H5VL_NATIVE_OBJECT_DISABLE_MDC_FLUSHES: {
- H5O_loc_t *oloc = loc.oloc;
-
- if (H5O_disable_mdc_flushes(oloc) < 0)
+ if (H5O__disable_mdc_flushes(loc.oloc) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCORK, FAIL, "unable to cork the metadata cache");
break;
@@ -498,9 +502,7 @@ H5VL__native_object_optional(void *obj, H5VL_object_optional_t optional_type, hi
/* H5Oenable_mdc_flushes */
case H5VL_NATIVE_OBJECT_ENABLE_MDC_FLUSHES: {
- H5O_loc_t *oloc = loc.oloc;
-
- if (H5O_enable_mdc_flushes(oloc) < 0)
+ if (H5O__enable_mdc_flushes(loc.oloc) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTUNCORK, FAIL, "unable to uncork the metadata cache");
break;
@@ -508,10 +510,7 @@ H5VL__native_object_optional(void *obj, H5VL_object_optional_t optional_type, hi
/* H5Oare_mdc_flushes_disabled */
case H5VL_NATIVE_OBJECT_ARE_MDC_FLUSHES_DISABLED: {
- H5O_loc_t *oloc = loc.oloc;
- hbool_t * are_disabled = (hbool_t *)HDva_arg(arguments, hbool_t *);
-
- if (H5O_are_mdc_flushes_disabled(oloc, are_disabled) < 0)
+ if (H5O__are_mdc_flushes_disabled(loc.oloc, opt_args->are_mdc_flushes_disabled.flag) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine metadata cache cork status");
break;
@@ -519,19 +518,16 @@ H5VL__native_object_optional(void *obj, H5VL_object_optional_t optional_type, hi
/* H5Oget_native_info(_name|_by_idx) */
case H5VL_NATIVE_OBJECT_GET_NATIVE_INFO: {
- H5O_native_info_t *native_info = HDva_arg(arguments, H5O_native_info_t *);
- unsigned fields = HDva_arg(arguments, unsigned);
+ H5VL_native_object_get_native_info_t *gni_args = &opt_args->get_native_info;
/* Use the original H5Oget_info code to get the data */
-
- if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oget_info */
- /* Retrieve the object's information */
- if (H5G_loc_native_info(&loc, ".", native_info, fields) < 0)
+ if (loc_params->type == H5VL_OBJECT_BY_SELF) {
+ if (H5G_loc_native_info(&loc, ".", gni_args->ninfo, gni_args->fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
} /* end if */
else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oget_info_by_name */
- /* Retrieve the object's information */
- if (H5G_loc_native_info(&loc, loc_params->loc_data.loc_by_name.name, native_info, fields) < 0)
+ if (H5G_loc_native_info(&loc, loc_params->loc_data.loc_by_name.name, gni_args->ninfo,
+ gni_args->fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
} /* end else-if */
else if (loc_params->type == H5VL_OBJECT_BY_IDX) { /* H5Oget_info_by_idx */
@@ -551,8 +547,7 @@ H5VL__native_object_optional(void *obj, H5VL_object_optional_t optional_type, hi
loc_params->loc_data.loc_by_idx.n, &obj_loc /*out*/) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found")
- /* Retrieve the object's information */
- if (H5O_get_native_info(obj_loc.oloc, native_info, fields) < 0) {
+ if (H5O_get_native_info(obj_loc.oloc, gni_args->ninfo, gni_args->fields) < 0) {
H5G_loc_free(&obj_loc);
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object info")
} /* end if */