diff options
author | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2013-08-29 03:08:46 (GMT) |
---|---|---|
committer | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2013-08-29 03:08:46 (GMT) |
commit | 6d1b20cf3c2689e4d8d3d3bcd42be9cf3591789d (patch) | |
tree | efae47c5f785582d62f5620b35165b4ee210ba6e | |
parent | 34837a0f9f6971d0fe36e9941976be8906c973f3 (diff) | |
download | hdf5-6d1b20cf3c2689e4d8d3d3bcd42be9cf3591789d.zip hdf5-6d1b20cf3c2689e4d8d3d3bcd42be9cf3591789d.tar.gz hdf5-6d1b20cf3c2689e4d8d3d3bcd42be9cf3591789d.tar.bz2 |
[svn-r24083] Build a request array for parent requests for every request.
Use this request array to determine when an AXE task can be requested to be finished at the server.
-rw-r--r-- | examples/h5ff_client.c | 9 | ||||
-rw-r--r-- | examples/h5ff_client_map.c | 2 | ||||
-rw-r--r-- | examples/h5ff_client_old_api.c | 8 | ||||
-rw-r--r-- | src/H5VLiod.c | 1203 | ||||
-rw-r--r-- | src/H5VLiod_client.c | 52 | ||||
-rw-r--r-- | src/H5VLiod_client.h | 22 | ||||
-rw-r--r-- | src/H5VLiod_common.h | 91 | ||||
-rw-r--r-- | src/H5VLiod_encdec.c | 97 | ||||
-rw-r--r-- | src/H5VLiod_server.c | 665 |
9 files changed, 1200 insertions, 949 deletions
diff --git a/examples/h5ff_client.c b/examples/h5ff_client.c index bab2928..21c7a45 100644 --- a/examples/h5ff_client.c +++ b/examples/h5ff_client.c @@ -378,6 +378,15 @@ int main(int argc, char **argv) { else
assert(H5AO_SUCCEEDED == status1);
+ /* If the read request did no complete earlier when we tested it, Wait on it now.
+ We have to do this since we popped it earlier from the event queue */
+ if(H5AO_PENDING == status1) {
+ assert(H5AOwait(req1, &status1) == 0);
+ assert (status1);
+ }
+ else
+ assert(H5AO_SUCCEEDED == status1);
+
fprintf(stderr, "\n*****************************************************************************************************************\n");
fprintf(stderr, "Test Links\n");
fprintf(stderr, "*****************************************************************************************************************\n");
diff --git a/examples/h5ff_client_map.c b/examples/h5ff_client_map.c index 59228f1..103ae03 100644 --- a/examples/h5ff_client_map.c +++ b/examples/h5ff_client_map.c @@ -75,7 +75,7 @@ int main(int argc, char **argv) { LE integers */
map1 = H5Mcreate_ff(file_id, "MAP_1", H5T_STD_I32LE, H5T_STD_I32LE,
H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT, (uint64_t)0, event_q);
- map2 = H5Mcreate_ff(gid1, "MAP_2", H5T_STD_I32LE, H5T_STD_I32LE,
+ map2 = H5Mcreate_ff(file_id, "G1/MAP_2", H5T_STD_I32LE, H5T_STD_I32LE,
H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT, (uint64_t)0, event_q);
map3 = H5Mcreate_ff(file_id, "G1/G2/MAP_3", H5T_STD_I32LE, H5T_STD_I32LE,
H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT, (uint64_t)0, event_q);
diff --git a/examples/h5ff_client_old_api.c b/examples/h5ff_client_old_api.c index 7875b97..ff5ceef 100644 --- a/examples/h5ff_client_old_api.c +++ b/examples/h5ff_client_old_api.c @@ -235,12 +235,12 @@ int main(int argc, char **argv) { char *comment = NULL;
ret_size = H5Oget_comment(gid1, NULL, 0);
- fprintf(stderr, "size of comment is %d\n", ret_size);
+ fprintf(stderr, "size of comment is %zd\n", ret_size);
- comment = malloc((size_t)ret_size + 1);
+ comment = (char *)malloc(sizeof(char *) * (ret_size + 1));
- H5Oget_comment(gid1, comment, (size_t)ret_size + 1);
- fprintf(stderr, "size of comment is %d Comment is %s\n", ret_size, comment);
+ ret_size = H5Oget_comment(gid1, comment, (size_t)ret_size + 1);
+ fprintf(stderr, "size of comment is %zd Comment is %s\n", ret_size, comment);
free(comment);
}
int_id = H5Topen2(file_id, "int", H5P_DEFAULT);
diff --git a/src/H5VLiod.c b/src/H5VLiod.c index 250a4f7..f084a19 100644 --- a/src/H5VLiod.c +++ b/src/H5VLiod.c @@ -95,14 +95,14 @@ static hg_id_t H5VL_CANCEL_OP_ID; typedef struct H5VL_iod_axe_list_t { H5VL_iod_request_t *head; H5VL_iod_request_t *tail; - uint64_t last_released_task; + AXE_task_t last_released_task; } H5VL_iod_axe_list_t; static na_addr_t PEER; static na_class_t *network_class = NULL; -static uint64_t g_axe_id; -static uint64_t axe_bound; +static AXE_task_t g_axe_id; +static AXE_task_t axe_bound; static H5VL_iod_axe_list_t axe_list; /* Prototypes */ @@ -365,8 +365,10 @@ H5VL__iod_request_remove_from_axe_list(H5VL_iod_request_t *request) request->rc --; - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5VL__iod_request_remove_from_axe_list() */ @@ -411,8 +413,9 @@ H5VL__iod_request_add_to_axe_list(H5VL_iod_request_t *request) request->rc ++; /* process axe_list */ - while(axe_list.head && axe_list.head->state == H5VL_IOD_COMPLETED && - axe_list.head->axe_id == axe_list.last_released_task+1) { + while(axe_list.head && /* If there is a head request */ + (axe_list.head->rc == 1 || (axe_list.head->rc == 2 && request->req != NULL)) && + H5VL_IOD_COMPLETED == axe_list.head->state) { axe_list.last_released_task = axe_list.head->axe_id; @@ -441,10 +444,9 @@ H5VL__iod_request_add_to_axe_list(H5VL_iod_request_t *request) herr_t H5VL__iod_create_and_forward(hg_id_t op_id, H5RQ_type_t op_type, H5VL_iod_object_t *request_obj, htri_t track, + size_t num_parents, H5VL_iod_request_t **parent_reqs, void *input, void *output, void *data, void **req) { - //hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - //H5VL_iod_request_t _request; /* Local request, for sync. operations */ hg_request_t *hg_req = NULL; H5VL_iod_request_t *request = NULL; hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ @@ -475,6 +477,10 @@ H5VL__iod_create_and_forward(hg_id_t op_id, H5RQ_type_t op_type, /* add request to container's linked list */ H5VL_iod_request_add(request_obj->file, request); + /* update the parent information in the request */ + request->num_parents = num_parents; + request->parent_reqs = parent_reqs; + axe_info->start_range = axe_list.last_released_task + 1; /* add request to global axe's linked list */ H5VL__iod_request_add_to_axe_list(request); @@ -482,7 +488,7 @@ H5VL__iod_create_and_forward(hg_id_t op_id, H5RQ_type_t op_type, #if H5VL_IOD_DEBUG if(axe_info->count) { - fprintf(stderr, "Operation %llu will finish tasks %llu through %llu\n", + printf("Operation %llu will finish tasks %llu through %llu\n", request->axe_id, axe_info->start_range, axe_info->start_range+axe_info->count-1); } #endif @@ -538,7 +544,7 @@ EFF_init(MPI_Comm comm, MPI_Info UNUSED info) hg_request_t hg_req; int num_procs, my_rank; na_addr_t ion_target; - uint64_t axe_seed; + AXE_task_t axe_seed; herr_t ret_value = SUCCEED; MPI_Comm_size(comm, &num_procs); @@ -1165,7 +1171,8 @@ H5VL_iod_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl input.fcpl_id = fcpl_id; input.fapl_id = fapl_id; input.axe_info.axe_id = g_axe_id ++; - + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; #if H5VL_IOD_DEBUG printf("File Create %s IOD ROOT ID %llu, axe id %llu\n", @@ -1180,6 +1187,7 @@ H5VL_iod_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl if((file->fapl_id = H5Pcopy(fapl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, NULL, "failed to copy fapl"); file->nopen_objs = 1; + file->num_req = 0; /* initialize head and tail of the container's linked list of requests */ file->request_list_head = NULL; @@ -1192,7 +1200,7 @@ H5VL_iod_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl file->common.file = file; if(H5VL__iod_create_and_forward(H5VL_FILE_CREATE_ID, HG_FILE_CREATE, - (H5VL_iod_object_t *)file, 1, + (H5VL_iod_object_t *)file, 1, 0, NULL, &input, &file->remote_file, file, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship file create"); @@ -1222,12 +1230,7 @@ H5VL_iod_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_i H5VL_iod_fapl_t *fa; H5P_genplist_t *plist; /* Property list pointer */ H5VL_iod_file_t *file = NULL; - hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - hg_request_t *hg_req = NULL; - H5VL_iod_request_t _request; /* Local request, for sync. operations */ - H5VL_iod_request_t *request = NULL; file_open_in_t input; - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT @@ -1252,6 +1255,8 @@ H5VL_iod_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_i input.flags = flags; input.fapl_id = fapl_id; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; #if H5VL_IOD_DEBUG printf("File Open %s axe id %llu\n", name, input.axe_info.axe_id); @@ -1265,6 +1270,7 @@ H5VL_iod_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_i if((file->fapl_id = H5Pcopy(fapl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, NULL, "failed to copy fapl"); file->nopen_objs = 1; + file->num_req = 0; /* initialize head and tail of the container's linked list */ file->request_list_head = NULL; @@ -1277,7 +1283,7 @@ H5VL_iod_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_i file->common.file = file; if(H5VL__iod_create_and_forward(H5VL_FILE_OPEN_ID, HG_FILE_OPEN, - (H5VL_iod_object_t *)file, 1, + (H5VL_iod_object_t *)file, 1, 0, NULL, &input, &file->remote_file, file, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship file open"); @@ -1317,14 +1323,16 @@ H5VL_iod_file_flush(void *_obj, H5VL_loc_params_t loc_params, H5F_scope_t scope, input.coh = file->remote_file.coh; input.scope = scope; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; /* allocate an integer to receive the return value if the file close succeeded or not */ status = (int *)malloc(sizeof(int)); if(H5VL__iod_create_and_forward(H5VL_FILE_FLUSH_ID, HG_FILE_FLUSH, - (H5VL_iod_object_t *)file, 1, + (H5VL_iod_object_t *)file, 1, 0, NULL, &input, status, status, req) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship file flush"); + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship file flush"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1481,7 +1489,6 @@ done: static herr_t H5VL_iod_file_misc(void *obj, H5VL_file_misc_t misc_type, hid_t dxpl_id, void **req, va_list arguments) { - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -1550,6 +1557,8 @@ H5VL_iod_file_close(void *_file, hid_t dxpl_id, void **req) H5VL_iod_file_t *file = (H5VL_iod_file_t *)_file; file_close_in_t input; int *status; + H5VL_iod_request_t **parent_reqs = NULL; + size_t num_parents = 0; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -1568,15 +1577,37 @@ H5VL_iod_file_close(void *_file, hid_t dxpl_id, void **req) input.root_oh = file->remote_file.root_oh; input.root_id = file->remote_file.root_id; input.axe_info.axe_id = g_axe_id ++; + /* MSC - for now, we will insert this as a barrier task so no need + to get parent axe IDs */ + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; #if H5VL_IOD_DEBUG printf("File Close Root ID %llu axe id %llu\n", input.root_id, input.axe_info.axe_id); #endif + if(file->num_req) { + H5VL_iod_request_t *cur_req = file->request_list_head; + + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * file->num_req))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + + while(cur_req) { + if(cur_req->state == H5VL_IOD_PENDING) { + parent_reqs[num_parents] = cur_req; + cur_req->rc ++; + num_parents ++; + } + cur_req = cur_req->next; + } + } + if(H5VL__iod_create_and_forward(H5VL_FILE_CLOSE_ID, HG_FILE_CLOSE, (H5VL_iod_object_t *)file, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship file close"); + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship file close"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1607,7 +1638,7 @@ H5VL_iod_group_create(void *_obj, H5VL_loc_params_t loc_params, const char *name hid_t lcpl_id; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ void *ret_value = NULL; @@ -1623,8 +1654,10 @@ H5VL_iod_group_create(void *_obj, H5VL_loc_params_t loc_params, const char *name /* Retrieve the parent AXE id by traversing the path where the group should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the group object that is returned to the user */ @@ -1652,12 +1685,19 @@ H5VL_iod_group_create(void *_obj, H5VL_loc_params_t loc_params, const char *name input.gcpl_id = gcpl_id; input.gapl_id = gapl_id; input.lcpl_id = lcpl_id; - input.parent_axe_id = parent_axe_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Group Create %s, IOD ID %llu, axe id %llu, parent %llu\n", - new_name, input.grp_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.grp_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local group struct */ @@ -1684,7 +1724,8 @@ H5VL_iod_group_create(void *_obj, H5VL_loc_params_t loc_params, const char *name grp->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_GROUP_CREATE_ID, HG_GROUP_CREATE, - (H5VL_iod_object_t *)grp, 1, + (H5VL_iod_object_t *)grp, 1, + input.axe_info.num_parents, parent_req, &input, &grp->remote_group, grp, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship group create"); @@ -1716,20 +1757,21 @@ H5VL_iod_group_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, { H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; /* location object to create the group */ H5VL_iod_group_t *grp = NULL; /* the group object that is created and passed to the user */ - H5P_genplist_t *plist; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ group_open_in_t input; - void *ret_value = NULL; + void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent AXE id by traversing the path where the group should be opened. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the group object that is returned to the user */ @@ -1745,12 +1787,19 @@ H5VL_iod_group_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, input.loc_oh = iod_oh; input.name = new_name; input.gapl_id = gapl_id; - input.parent_axe_id = parent_axe_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Group Open %s LOC ID %llu, axe id %llu, parent %llu\n", - new_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local group struct */ @@ -1775,7 +1824,8 @@ H5VL_iod_group_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, grp->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_GROUP_OPEN_ID, HG_GROUP_OPEN, - (H5VL_iod_object_t *)grp, 1, + (H5VL_iod_object_t *)grp, 1, + input.axe_info.num_parents, parent_req, &input, &grp->remote_group, grp, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship group open"); @@ -1855,7 +1905,8 @@ H5VL_iod_group_close(void *_grp, hid_t dxpl_id, void **req) group_close_in_t input; int *status; size_t num_parents; - uint64_t *axe_parents = NULL; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -1867,21 +1918,25 @@ H5VL_iod_group_close(void *_grp, hid_t dxpl_id, void **req) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't wait on all object requests"); } - /* determine the parent axe IDs array for this operation*/ - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)grp, &num_parents, NULL) < 0) + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)grp, &num_parents, NULL, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(num_parents) { - if(NULL == (axe_parents = (uint64_t *)H5MM_malloc(sizeof(uint64_t) * num_parents))) - HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate num parents array"); - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)grp, &num_parents, axe_parents) < 0) + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)grp, &num_parents, + parent_axe_ids, parent_reqs) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } input.iod_oh = grp->remote_group.iod_oh; input.iod_id = grp->remote_group.iod_id; - input.parent_axe_ids.count = num_parents; - input.parent_axe_ids.ids = axe_parents; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; #if H5VL_IOD_DEBUG printf("Group Close IOD ID %llu, axe id %llu\n", @@ -1893,11 +1948,12 @@ H5VL_iod_group_close(void *_grp, hid_t dxpl_id, void **req) if(H5VL__iod_create_and_forward(H5VL_GROUP_CLOSE_ID, HG_GROUP_CLOSE, (H5VL_iod_object_t *)grp, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship group close"); done: - axe_parents = (uint64_t *)H5MM_xfree(axe_parents); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_group_close() */ @@ -1925,7 +1981,7 @@ H5VL_iod_dataset_create(void *_obj, H5VL_loc_params_t loc_params, const char *na H5P_genplist_t *plist; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ hid_t type_id, space_id, lcpl_id; void *ret_value = NULL; @@ -1946,8 +2002,10 @@ H5VL_iod_dataset_create(void *_obj, H5VL_loc_params_t loc_params, const char *na /* Retrieve the parent AXE id by traversing the path where the dataset should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the dataset object that is returned to the user */ @@ -1976,12 +2034,19 @@ H5VL_iod_dataset_create(void *_obj, H5VL_loc_params_t loc_params, const char *na input.lcpl_id = lcpl_id; input.type_id = type_id; input.space_id = space_id; - input.parent_axe_id = parent_axe_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Dataset Create %s IOD ID %llu, axe id %llu, parent %llu\n", - new_name, input.dset_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.dset_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local dataset struct */ @@ -2012,7 +2077,9 @@ H5VL_iod_dataset_create(void *_obj, H5VL_loc_params_t loc_params, const char *na dset->common.file = obj->file; dset->common.file->nopen_objs ++; - if(H5VL__iod_create_and_forward(H5VL_DSET_CREATE_ID, HG_DSET_CREATE, (H5VL_iod_object_t *)dset, 1, + if(H5VL__iod_create_and_forward(H5VL_DSET_CREATE_ID, HG_DSET_CREATE, + (H5VL_iod_object_t *)dset, 1, + input.axe_info.num_parents, parent_req, &input, &dset->remote_dset, dset, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship dataset create"); @@ -2047,21 +2114,18 @@ H5VL_iod_dataset_open(void *_obj, H5VL_loc_params_t loc_params, const char *name dset_open_in_t input; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ - hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - hg_request_t *hg_req = NULL; - H5VL_iod_request_t _request; /* Local request, for sync. operations */ - H5VL_iod_request_t *request = NULL; - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent AXE id by traversing the path where the dataset should be opened. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the dataset object that is returned to the user */ @@ -2080,12 +2144,19 @@ H5VL_iod_dataset_open(void *_obj, H5VL_loc_params_t loc_params, const char *name input.loc_oh = iod_oh; input.name = new_name; input.dapl_id = dapl_id; - input.parent_axe_id = parent_axe_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Dataset Open %s LOC ID %llu, axe id %llu, parent %llu\n", - new_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local dataset struct */ @@ -2109,7 +2180,9 @@ H5VL_iod_dataset_open(void *_obj, H5VL_loc_params_t loc_params, const char *name dset->common.file = obj->file; dset->common.file->nopen_objs ++; - if(H5VL__iod_create_and_forward(H5VL_DSET_OPEN_ID, HG_DSET_OPEN, (H5VL_iod_object_t *)dset, 1, + if(H5VL__iod_create_and_forward(H5VL_DSET_OPEN_ID, HG_DSET_OPEN, + (H5VL_iod_object_t *)dset, 1, + input.axe_info.num_parents, parent_req, &input, &dset->remote_dset, dset, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship dataset open"); @@ -2152,7 +2225,7 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, size_t nelmts; /* num elements in mem dataspace */ H5VL_iod_io_info_t *info = NULL; hbool_t is_vl_data = FALSE; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -2191,14 +2264,6 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, if(!buf) buf = &fake_char; - /* set the parent axe id */ - if(dset->common.request) { - parent_axe_id = dset->common.request->axe_id; - } - else { - parent_axe_id = 0; - } - /* get the memory type size */ { H5T_t *dt = NULL; @@ -2221,6 +2286,9 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, bulk_handle, &is_vl_data) < 0) HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't generate read parameters"); + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + if(!is_vl_data) { /* Fill input structure for reading data */ input.coh = dset->common.file->remote_file.coh; @@ -2233,7 +2301,17 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, input.dset_type_id = dset->remote_dset.type_id; input.mem_type_id = mem_type_id; input.axe_info.axe_id = g_axe_id ++; - input.parent_axe_id = parent_axe_id; + if(NULL != dset->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &dset->common.request->axe_id; + dset->common.request->rc ++; + *parent_req = dset->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } } else { /* Fill input structure for retrieving the buffer size needed to read */ @@ -2244,7 +2322,17 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, input_vl.space_id = file_space_id; input_vl.mem_type_id = mem_type_id; input_vl.axe_info.axe_id = g_axe_id ++; - input_vl.parent_axe_id = parent_axe_id; + if(NULL != dset->common.request) { + input_vl.axe_info.num_parents = 1; + input_vl.axe_info.parent_axe_ids = &dset->common.request->axe_id; + dset->common.request->rc ++; + *parent_req = dset->common.request; + } + else { + input_vl.axe_info.num_parents = 0; + input_vl.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } } /* allocate structure to receive status of read operation @@ -2254,10 +2342,10 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, #if H5VL_IOD_DEBUG if(!is_vl_data) printf("Dataset Read, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); else printf("Dataset GET size, axe id %llu, parent %llu\n", - input_vl.axe_info.axe_id, input_vl.parent_axe_id); + input_vl.axe_info.axe_id, ((input_vl.axe_info.parent_axe_ids!=NULL) ? input_vl.axe_info.parent_axe_ids[0] : 0)); #endif /* setup info struct for I/O request. @@ -2286,11 +2374,11 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, perform the actual read when the wait is called (i.e. when we retrieve the buffer size) */ if(is_vl_data) { - if(NULL == (info->file_space_id = H5Scopy(file_space_id))) + if((info->file_space_id = H5Scopy(file_space_id)) < 0) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to copy dataspace"); - if(NULL == (info->mem_type_id = H5Tcopy(mem_type_id))) + if((info->mem_type_id = H5Tcopy(mem_type_id)) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy datatype"); - if(NULL == (info->dxpl_id = H5P_copy_plist((H5P_genplist_t *)plist, TRUE))) + if((info->dxpl_id = H5P_copy_plist((H5P_genplist_t *)plist, TRUE)) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy dxpl"); info->axe_id = g_axe_id ++; info->peer = PEER; @@ -2299,13 +2387,16 @@ H5VL_iod_dataset_read(void *_dset, hid_t mem_type_id, hid_t mem_space_id, /* forward the call to the IONs */ if(!is_vl_data) { - if(H5VL__iod_create_and_forward(H5VL_DSET_READ_ID, HG_DSET_READ, (H5VL_iod_object_t *)dset, 0, + if(H5VL__iod_create_and_forward(H5VL_DSET_READ_ID, HG_DSET_READ, + (H5VL_iod_object_t *)dset, 0, + input.axe_info.num_parents, parent_req, &input, status, info, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship dataset read"); } else { if(H5VL__iod_create_and_forward(H5VL_DSET_GET_VL_SIZE_ID, HG_DSET_GET_VL_SIZE, (H5VL_iod_object_t *)dset, 0, + input_vl.axe_info.num_parents, parent_req, &input_vl, status, info, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship dataset get VL size"); } @@ -2344,9 +2435,9 @@ H5VL_iod_dataset_write(void *_dset, hid_t mem_type_id, hid_t mem_space_id, size_t type_size; /* size of mem type */ size_t nelmts; /* num elements in mem dataspace */ H5VL_iod_io_info_t *info; /* info struct used to manage I/O parameters once the operation completes*/ - uint64_t parent_axe_id; uint32_t internal_cs; /* internal checksum calculated in this function */ size_t *vl_string_len = NULL; /* array that will contain lengths of strings if the datatype is a VL string type */ + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -2412,13 +2503,8 @@ H5VL_iod_dataset_write(void *_dset, hid_t mem_type_id, hid_t mem_space_id, } } - /* set the parent axe id */ - if(dset->common.request) { - input.parent_axe_id = dset->common.request->axe_id; - } - else { - input.parent_axe_id = 0; - } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); /* Fill input structure */ input.coh = dset->common.file->remote_file.coh; @@ -2431,12 +2517,23 @@ H5VL_iod_dataset_write(void *_dset, hid_t mem_type_id, hid_t mem_space_id, input.dset_type_id = dset->remote_dset.type_id; input.mem_type_id = mem_type_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != dset->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &dset->common.request->axe_id; + dset->common.request->rc ++; + *parent_req = dset->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } status = (int *)malloc(sizeof(int)); #if H5VL_IOD_DEBUG printf("Dataset Write, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup info struct for I/O request @@ -2450,6 +2547,7 @@ H5VL_iod_dataset_write(void *_dset, hid_t mem_type_id, hid_t mem_space_id, if(H5VL__iod_create_and_forward(H5VL_DSET_WRITE_ID, HG_DSET_WRITE, (H5VL_iod_object_t *)dset, 0, + input.axe_info.num_parents, parent_req, &input, status, info, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship dataset write"); @@ -2479,9 +2577,9 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo iod_obj_id_t iod_id; iod_handle_t iod_oh; int *status = NULL; - uint64_t parent_axe_id; size_t num_parents; - uint64_t *axe_parents = NULL; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -2494,15 +2592,18 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo dset->common.request = NULL; } - /* retrieve the parent axe ids array */ - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, NULL) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, NULL, NULL) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); if(num_parents) { - if(NULL == (axe_parents = (uint64_t *)H5MM_malloc(sizeof(uint64_t) * num_parents))) - HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't allocate num parents array"); - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, axe_parents) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get AXE parents"); + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, + parent_axe_ids, parent_reqs) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } /* Fill input structure */ @@ -2511,8 +2612,8 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo input.iod_id = dset->remote_dset.iod_id; input.dims.rank = H5Sget_simple_extent_ndims(dset->remote_dset.space_id); input.dims.size = size; - input.parent_axe_ids.count = num_parents; - input.parent_axe_ids.ids = axe_parents; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; input.axe_info.axe_id = g_axe_id ++; #if H5VL_IOD_DEBUG @@ -2522,7 +2623,7 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo printf("Dataset Set Extent, axe id %llu, %d parents: ", input.axe_info.axe_id, num_parents); for(i=0 ; i<num_parents ; i++) - printf("%llu ", axe_parents[i]); + printf("%llu ", parent_axe_ids[i]); printf("\n"); } #endif @@ -2531,6 +2632,7 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo if(H5VL__iod_create_and_forward(H5VL_DSET_SET_EXTENT_ID, HG_DSET_SET_EXTENT, (H5VL_iod_object_t *)dset, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship dataset set_extent"); @@ -2553,7 +2655,7 @@ H5VL_iod_dataset_set_extent(void *_dset, const hsize_t size[], hid_t dxpl_id, vo HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space"); } done: - axe_parents = (uint64_t *)H5MM_xfree(axe_parents); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_dataset_set_extent() */ @@ -2576,7 +2678,6 @@ H5VL_iod_dataset_get(void *_dset, H5VL_dataset_get_t get_type, hid_t dxpl_id, void **req, va_list arguments) { H5VL_iod_dset_t *dset = (H5VL_iod_dset_t *)_dset; - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -2664,7 +2765,8 @@ H5VL_iod_dataset_close(void *_dset, hid_t dxpl_id, void **req) dset_close_in_t input; int *status; size_t num_parents; - uint64_t *axe_parents = NULL; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -2685,20 +2787,24 @@ H5VL_iod_dataset_close(void *_dset, hid_t dxpl_id, void **req) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't wait on all object requests"); } - /* determine the parent axe IDs array for this operation*/ - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, NULL) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, NULL, NULL) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(num_parents) { - if(NULL == (axe_parents = (uint64_t *)H5MM_malloc(sizeof(uint64_t) * num_parents))) - HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't allocate num parents array"); - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, axe_parents) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get AXE parents"); + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dset, &num_parents, + parent_axe_ids, parent_reqs) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } input.iod_oh = dset->remote_dset.iod_oh; input.iod_id = dset->remote_dset.iod_id; - input.parent_axe_ids.count = num_parents; - input.parent_axe_ids.ids = axe_parents; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; input.axe_info.axe_id = g_axe_id ++; #if H5VL_IOD_DEBUG @@ -2708,7 +2814,7 @@ H5VL_iod_dataset_close(void *_dset, hid_t dxpl_id, void **req) printf("Dataset Close %s, axe id %llu, %d parents: ", dset->common.obj_name, input.axe_info.axe_id, num_parents); for(i=0 ; i<num_parents ; i++) - printf("%llu ", axe_parents[i]); + printf("%llu ", parent_axe_ids[i]); printf("\n"); } #endif @@ -2717,11 +2823,12 @@ H5VL_iod_dataset_close(void *_dset, hid_t dxpl_id, void **req) if(H5VL__iod_create_and_forward(H5VL_DSET_CLOSE_ID, HG_DSET_CLOSE, (H5VL_iod_object_t *)dset, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship dataset close"); done: - axe_parents = (uint64_t *)H5MM_xfree(axe_parents); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_dataset_close() */ @@ -2746,20 +2853,21 @@ H5VL_iod_datatype_commit(void *_obj, H5VL_loc_params_t loc_params, const char *n { H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; /* location object to create the datatype */ H5VL_iod_dtype_t *dtype = NULL; /* the datatype object that is created and passed to the user */ - H5T_t *dt = NULL; dtype_commit_in_t input; iod_obj_id_t iod_id; iod_handle_t iod_oh; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent AXE id by traversing the path where the dtype should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the datatype object that is returned to the user */ @@ -2782,17 +2890,24 @@ H5VL_iod_datatype_commit(void *_obj, H5VL_loc_params_t loc_params, const char *n input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.name = new_name; input.tcpl_id = tcpl_id; input.tapl_id = tapl_id; input.lcpl_id = lcpl_id; input.type_id = type_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Datatype Commit %s IOD ID %llu, axe id %llu, parent %llu\n", - new_name, input.dtype_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.dtype_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local datatype struct */ @@ -2822,7 +2937,8 @@ H5VL_iod_datatype_commit(void *_obj, H5VL_loc_params_t loc_params, const char *n dtype->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_DTYPE_COMMIT_ID, HG_DTYPE_COMMIT, - (H5VL_iod_object_t *)dtype, 1, + (H5VL_iod_object_t *)dtype, 1, + input.axe_info.num_parents, parent_req, &input, &dtype->remote_dtype, dtype, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship datatype commit"); @@ -2857,15 +2973,17 @@ H5VL_iod_datatype_open(void *_obj, H5VL_loc_params_t loc_params, const char *nam iod_obj_id_t iod_id; iod_handle_t iod_oh; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent AXE id by traversing the path where the dtype should be opened. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the datatype object that is returned to the user */ @@ -2881,14 +2999,21 @@ H5VL_iod_datatype_open(void *_obj, H5VL_loc_params_t loc_params, const char *nam input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.name = new_name; input.tapl_id = tapl_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Datatype Open %s LOC ID %llu, axe id %llu, parent %llu\n", - new_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local datatype struct */ @@ -2913,7 +3038,8 @@ H5VL_iod_datatype_open(void *_obj, H5VL_loc_params_t loc_params, const char *nam dtype->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_DTYPE_OPEN_ID, HG_DTYPE_OPEN, - (H5VL_iod_object_t *)dtype, 1, + (H5VL_iod_object_t *)dtype, 1, + input.axe_info.num_parents, parent_req, &input, &dtype->remote_dtype, dtype, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship datatype open"); @@ -2973,7 +3099,7 @@ done: */ static herr_t H5VL_iod_datatype_get(void UNUSED *obj, H5VL_datatype_get_t get_type, - hid_t UNUSED dxpl_id, void UNUSED **req, va_list arguments) + hid_t UNUSED dxpl_id, void UNUSED **req, va_list UNUSED arguments) { herr_t ret_value = SUCCEED; /* Return value */ @@ -3013,6 +3139,9 @@ H5VL_iod_datatype_close(void *obj, hid_t dxpl_id, void **req) { H5VL_iod_dtype_t *dtype = (H5VL_iod_dtype_t *)obj; dtype_close_in_t input; + size_t num_parents; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; int *status; herr_t ret_value = SUCCEED; /* Return value */ @@ -3025,30 +3154,41 @@ H5VL_iod_datatype_close(void *obj, hid_t dxpl_id, void **req) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't wait on all object requests"); } - /* set the parent axe id */ - if(dtype->common.request) - input.parent_axe_id = dtype->common.request->axe_id; - else { - input.parent_axe_id = 0; + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dtype, &num_parents, NULL, NULL) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); + + if(num_parents) { + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)dtype, &num_parents, + parent_axe_ids, parent_reqs) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } input.iod_oh = dtype->remote_dtype.iod_oh; input.iod_id = dtype->remote_dtype.iod_id; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; #if H5VL_IOD_DEBUG - printf("Datatype Close %s, axe id %llu, parent %d\n", - dtype->common.obj_name, input.axe_info.axe_id, input.parent_axe_id); + printf("Datatype Close %s, axe id %llu, parent %llu\n", + dtype->common.obj_name, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif status = (int *)malloc(sizeof(int)); if(H5VL__iod_create_and_forward(H5VL_DTYPE_CLOSE_ID, HG_DTYPE_CLOSE, (H5VL_iod_object_t *)dtype, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship datatype open"); done: + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_datatype_close() */ @@ -3079,7 +3219,7 @@ H5VL_iod_attribute_create(void *_obj, H5VL_loc_params_t loc_params, const char * char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ const char *path; /* path on where the traversal starts relative to the location object specified */ hid_t type_id, space_id; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT @@ -3096,8 +3236,10 @@ H5VL_iod_attribute_create(void *_obj, H5VL_loc_params_t loc_params, const char * /* Retrieve the parent AXE id by traversing the path where the attribute should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the attribute object that is returned to the user */ @@ -3120,13 +3262,20 @@ H5VL_iod_attribute_create(void *_obj, H5VL_loc_params_t loc_params, const char * input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.path = new_name; input.attr_name = attr_name; input.acpl_id = acpl_id; input.type_id = type_id; input.space_id = space_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } /* setup the local attribute struct */ /* store the entire path of the attribute locally */ @@ -3153,7 +3302,7 @@ H5VL_iod_attribute_create(void *_obj, H5VL_loc_params_t loc_params, const char * #if H5VL_IOD_DEBUG printf("Attribute Create %s IOD ID %llu, axe id %llu, parent %llu\n", - attr_name, input.attr_id, input.axe_info.axe_id, input.parent_axe_id); + attr_name, input.attr_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* copy property lists, dtype, and dspace*/ @@ -3170,7 +3319,8 @@ H5VL_iod_attribute_create(void *_obj, H5VL_loc_params_t loc_params, const char * attr->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_ATTR_CREATE_ID, HG_ATTR_CREATE, - (H5VL_iod_object_t *)attr, 1, + (H5VL_iod_object_t *)attr, 1, + input.axe_info.num_parents, parent_req, &input, &attr->remote_attr, attr, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship attribute create"); @@ -3207,15 +3357,17 @@ H5VL_iod_attribute_open(void *_obj, H5VL_loc_params_t loc_params, const char *at const char *path; /* path on where the traversal starts relative to the location object specified */ iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent AXE id by traversing the path where the attribute should be opened. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the attribute object that is returned to the user */ @@ -3232,14 +3384,21 @@ H5VL_iod_attribute_open(void *_obj, H5VL_loc_params_t loc_params, const char *at input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.path = new_name; input.attr_name = attr_name; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Attribute Open %s LOC ID %llu, axe id %llu, parent %llu\n", - attr_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id); + attr_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local attribute struct */ @@ -3272,7 +3431,8 @@ H5VL_iod_attribute_open(void *_obj, H5VL_loc_params_t loc_params, const char *at attr->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_ATTR_OPEN_ID, HG_ATTR_OPEN, - (H5VL_iod_object_t *)attr, 1, + (H5VL_iod_object_t *)attr, 1, + input.axe_info.num_parents, parent_req, &input, &attr->remote_attr, attr, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship attribute open"); @@ -3303,11 +3463,11 @@ H5VL_iod_attribute_read(void *_attr, hid_t type_id, void *buf, hid_t dxpl_id, vo { H5VL_iod_attr_t *attr = (H5VL_iod_attr_t *)_attr; attr_io_in_t input; - H5P_genplist_t *plist; hg_bulk_t *bulk_handle = NULL; H5VL_iod_read_status_t *status = NULL; size_t size; H5VL_iod_io_info_t *info; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -3320,13 +3480,6 @@ H5VL_iod_attribute_read(void *_attr, hid_t type_id, void *buf, hid_t dxpl_id, vo attr->common.request = NULL; } - /* set the parent axe id */ - if(attr->common.request) - input.parent_axe_id = attr->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* calculate the size of the buffer needed */ size = H5Sget_simple_extent_npoints(attr->remote_attr.space_id) * H5Tget_size(type_id); @@ -3338,6 +3491,9 @@ H5VL_iod_attribute_read(void *_attr, hid_t type_id, void *buf, hid_t dxpl_id, vo if(HG_SUCCESS != HG_Bulk_handle_create(buf, size, HG_BULK_READWRITE, bulk_handle)) HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "can't create Bulk Data Handle"); + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = attr->common.file->remote_file.coh; input.iod_oh = attr->remote_attr.iod_oh; @@ -3345,6 +3501,17 @@ H5VL_iod_attribute_read(void *_attr, hid_t type_id, void *buf, hid_t dxpl_id, vo input.bulk_handle = *bulk_handle; input.type_id = type_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != attr->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &attr->common.request->axe_id; + attr->common.request->rc ++; + *parent_req = attr->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } /* allocate structure to receive status of read operation (contains return value and checksum */ status = (H5VL_iod_read_status_t *)malloc(sizeof(H5VL_iod_read_status_t)); @@ -3358,6 +3525,7 @@ H5VL_iod_attribute_read(void *_attr, hid_t type_id, void *buf, hid_t dxpl_id, vo if(H5VL__iod_create_and_forward(H5VL_ATTR_READ_ID, HG_ATTR_READ, (H5VL_iod_object_t *)attr, 0, + input.axe_info.num_parents, parent_req, &input, status, info, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute read"); @@ -3390,6 +3558,7 @@ H5VL_iod_attribute_write(void *_attr, hid_t type_id, const void *buf, hid_t dxpl size_t size; H5VL_iod_io_info_t *info; uint32_t cs; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -3401,13 +3570,6 @@ H5VL_iod_attribute_write(void *_attr, hid_t type_id, const void *buf, hid_t dxpl attr->common.request = NULL; } - /* set the parent axe id */ - if(attr->common.request) - input.parent_axe_id = attr->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* calculate the size of the buffer needed */ size = H5Sget_simple_extent_npoints(attr->remote_attr.space_id) * H5Tget_size(type_id); @@ -3425,6 +3587,9 @@ H5VL_iod_attribute_write(void *_attr, hid_t type_id, const void *buf, hid_t dxpl if(HG_SUCCESS != HG_Bulk_handle_create(buf, size, HG_BULK_READ_ONLY, bulk_handle)) HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "can't create Bulk Data Handle"); + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = attr->common.file->remote_file.coh; input.iod_oh = attr->remote_attr.iod_oh; @@ -3432,6 +3597,17 @@ H5VL_iod_attribute_write(void *_attr, hid_t type_id, const void *buf, hid_t dxpl input.bulk_handle = *bulk_handle; input.type_id = type_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != attr->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &attr->common.request->axe_id; + attr->common.request->rc ++; + *parent_req = attr->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } status = (int *)malloc(sizeof(int)); @@ -3448,6 +3624,7 @@ H5VL_iod_attribute_write(void *_attr, hid_t type_id, const void *buf, hid_t dxpl if(H5VL__iod_create_and_forward(H5VL_ATTR_WRITE_ID, HG_ATTR_WRITE, (H5VL_iod_object_t *)attr, 0, + input.axe_info.num_parents, parent_req, &input, status, info, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute write"); @@ -3477,6 +3654,7 @@ H5VL_iod_attribute_remove(void *_obj, H5VL_loc_params_t loc_params, const char * attr_op_in_t input; iod_obj_id_t iod_id; iod_handle_t iod_oh; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ int *status = NULL; herr_t ret_value = SUCCEED; /* Return value */ @@ -3485,8 +3663,10 @@ H5VL_iod_attribute_remove(void *_obj, H5VL_loc_params_t loc_params, const char * /* Retrieve the parent AXE id by traversing the path where the attribute should be removed. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &iod_id, &iod_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -3496,11 +3676,20 @@ H5VL_iod_attribute_remove(void *_obj, H5VL_loc_params_t loc_params, const char * input.path = new_name; input.attr_name = attr_name; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } status = (int *)malloc(sizeof(int)); if(H5VL__iod_create_and_forward(H5VL_ATTR_REMOVE_ID, HG_ATTR_REMOVE, - (H5VL_iod_object_t *)obj, 1, + (H5VL_iod_object_t *)obj, 1, + input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute remove"); @@ -3531,11 +3720,7 @@ H5VL_iod_attribute_get(void *_obj, H5VL_attr_get_t get_type, hid_t dxpl_id, H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; /* location of operation */ iod_obj_id_t iod_id; iod_handle_t iod_oh; - hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - hg_request_t *hg_req = NULL; - H5VL_iod_request_t _request; /* Local request, for sync. operations */ - H5VL_iod_request_t *request = NULL; - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -3636,8 +3821,10 @@ H5VL_iod_attribute_get(void *_obj, H5VL_attr_get_t get_type, hid_t dxpl_id, /* Retrieve the parent AXE id by traversing the path where the attribute should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &iod_id, &iod_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -3647,9 +3834,17 @@ H5VL_iod_attribute_get(void *_obj, H5VL_attr_get_t get_type, hid_t dxpl_id, input.path = new_name; input.attr_name = attr_name; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } if(H5VL__iod_create_and_forward(H5VL_ATTR_EXISTS_ID, HG_ATTR_EXISTS, - (H5VL_iod_object_t *)obj, 1, + obj, 1, input.axe_info.num_parents, parent_req, &input, ret, ret, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute exists"); @@ -3713,13 +3908,9 @@ H5VL_iod_attribute_close(void *_attr, hid_t dxpl_id, void **req) H5VL_iod_attr_t *attr = (H5VL_iod_attr_t *)_attr; attr_close_in_t input; int *status; - hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - hg_request_t *hg_req = NULL; - H5VL_iod_request_t _request; /* Local request, for sync. operations */ - H5VL_iod_request_t *request = NULL; - hbool_t do_async = (req == NULL) ? FALSE : TRUE; /* Whether we're performing async. I/O */ size_t num_parents; - uint64_t *axe_parents = NULL; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -3740,22 +3931,26 @@ H5VL_iod_attribute_close(void *_attr, hid_t dxpl_id, void **req) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't wait on all object requests"); } - /* get all the parents required to complete before this operation can start */ - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)attr, &num_parents, NULL) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)attr, &num_parents, NULL, NULL) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(num_parents) { - if(NULL == (axe_parents = (uint64_t *)H5MM_malloc(sizeof(uint64_t) * num_parents))) - HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "can't allocate num parents array"); - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)attr, &num_parents, axe_parents) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get AXE parents"); + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)attr, &num_parents, + parent_axe_ids, parent_reqs) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } status = (int *)malloc(sizeof(int)); input.iod_oh = attr->remote_attr.iod_oh; input.iod_id = attr->remote_attr.iod_id; - input.parent_axe_ids.count = num_parents; - input.parent_axe_ids.ids = axe_parents; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; input.axe_info.axe_id = g_axe_id ++; #if H5VL_IOD_DEBUG @@ -3765,18 +3960,19 @@ H5VL_iod_attribute_close(void *_attr, hid_t dxpl_id, void **req) printf("Attribute Close, axe id %llu, %d parents: ", input.axe_info.axe_id, num_parents); for(i=0 ; i<num_parents ; i++) - printf("%llu ", axe_parents[i]); + printf("%llu ", parent_axe_ids[i]); printf("\n"); } #endif if(H5VL__iod_create_and_forward(H5VL_ATTR_CLOSE_ID, HG_ATTR_CLOSE, (H5VL_iod_object_t *)attr, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute close"); done: - axe_parents = (uint64_t *)H5MM_xfree(axe_parents); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_attribute_close() */ @@ -3802,10 +3998,15 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p H5VL_iod_object_t *cur_obj = NULL; link_create_in_t input; int *status; - H5P_genplist_t *plist; /* Property list pointer */ + H5P_genplist_t *plist; /* Property list pointer */ char *loc_name = NULL, *new_name = NULL; char *link_value = NULL; /* Value of soft link */ - herr_t ret_value = SUCCEED; /* Return value */ + size_t num_parents; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; + H5VL_iod_request_t **parent_req = NULL; + H5VL_iod_request_t **target_req; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -3831,8 +4032,10 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p /* Retrieve the parent info by traversing the path where the link should be created from. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &loc_name, &cur_obj) < 0) + parent_req, &loc_name, &cur_obj) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* object is H5L_SAME_LOC */ @@ -3842,9 +4045,11 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p /* Retrieve the parent info by traversing the path where the link should be created. */ + if(NULL == (target_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(target_obj, target_params, ".", &input.target_loc_id, &input.target_loc_oh, - &input.target_parent_axe_id, &new_name, NULL) < 0) + target_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -3861,14 +4066,6 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p input.axe_info.axe_id = g_axe_id ++; link_value = strdup("\0"); input.link_value = link_value; - - -#if H5VL_IOD_DEBUG - printf("Hard Link Create axe %llu: %s ID %llu axe %llu to %s ID %llu axe %llu\n", - input.axe_info.axe_id, loc_name, input.loc_id, input.parent_axe_id, - new_name, input.target_loc_id, input.target_parent_axe_id); -#endif - break; } case H5VL_LINK_CREATE_SOFT: @@ -3896,15 +4093,19 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p /* Retrieve the parent info by traversing the path where the link should be created from. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &loc_name, &cur_obj) < 0) + parent_req, &loc_name, &cur_obj) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* Retrieve the parent info by traversing the path where the target link should be created. */ + if(NULL == (target_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(target_obj, target_params, ".", &input.target_loc_id, &input.target_loc_oh, - &input.target_parent_axe_id, &new_name, NULL) < 0) + target_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -3918,12 +4119,6 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p input.target_name = new_name; input.link_value = link_value; -#if H5VL_IOD_DEBUG - printf("Soft Link Create axe %llu: %s ID %llu axe %llu to %s ID %llu axe %llu\n", - input.axe_info.axe_id, loc_name, input.loc_id, input.parent_axe_id, - new_name, input.target_loc_id, input.target_parent_axe_id); -#endif - break; } /* MSC - not supported now */ @@ -3944,13 +4139,67 @@ H5VL_iod_link_create(H5VL_link_create_type_t create_type, void *_obj, H5VL_loc_p HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "invalid link creation call") } + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + + if(NULL != parent_req[0] && NULL != target_req[0]) { + num_parents = 2; + parent_axe_ids[0] = parent_req[0]->axe_id; + parent_axe_ids[1] = target_req[0]->axe_id; + parent_reqs[0] = *parent_req; + parent_reqs[1] = *target_req; + } + else if (NULL != parent_req[0]) { + num_parents = 1; + parent_axe_ids[0] = parent_req[0]->axe_id; + parent_reqs[0] = *parent_req; + } + else if (NULL != target_req[0]) { + num_parents = 1; + parent_axe_ids[0] = target_req[0]->axe_id; + parent_reqs[0] = *target_req; + } + else { + num_parents = 0; + } + + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; + +#if H5VL_IOD_DEBUG + if(create_type == H5VL_LINK_CREATE_HARD) + printf("Hard Link Create axe %llu: %s ID %llu to %s ID %llu \n", + input.axe_info.axe_id, loc_name, input.loc_id, + new_name, input.target_loc_id); + else + printf("Soft Link Create axe %llu: %s ID %llu to %s ID %llu\n", + input.axe_info.axe_id, loc_name, input.loc_id, + new_name, input.target_loc_id); + status = (herr_t *)malloc(sizeof(herr_t)); + { + size_t i; + printf("Link Create Dependencies: "); + for(i=0 ; i<num_parents ; i++) + printf("%llu ", parent_axe_ids[i]); + printf("\n"); + } +#endif + if(H5VL__iod_create_and_forward(H5VL_LINK_CREATE_ID, HG_LINK_CREATE, cur_obj, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link move"); done: + + parent_req = (H5VL_iod_request_t **)H5MM_xfree(parent_req); + target_req = (H5VL_iod_request_t **)H5MM_xfree(target_req); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); + if(loc_name) HDfree(loc_name); if(new_name) @@ -3991,20 +4240,29 @@ H5VL_iod_link_move(void *_src_obj, H5VL_loc_params_t loc_params1, link_move_in_t input; int *status; char *src_name = NULL, *dst_name = NULL; + size_t num_parents; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; + H5VL_iod_request_t **src_req; + H5VL_iod_request_t **dst_req; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent information by traversing the path where the link should be moved from. */ + if(NULL == (src_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(src_obj, loc_params1, ".", &input.src_loc_id, &input.src_loc_oh, - &input.src_parent_axe_id, &src_name, NULL) < 0) + src_req, &src_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* Retrieve the parent information by traversing the path where the link should be moved to. */ + if(NULL == (dst_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(dst_obj, loc_params2, ".", &input.dst_loc_id, &input.dst_loc_oh, - &input.dst_parent_axe_id, &dst_name, &cur_obj) < 0) + dst_req, &dst_name, &cur_obj) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* if the object, to be moved is open locally, then update its @@ -4036,24 +4294,57 @@ H5VL_iod_link_move(void *_src_obj, H5VL_loc_params_t loc_params1, input.src_loc_name = src_name; input.dst_loc_name = dst_name; + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + + if(NULL != src_req[0] && NULL != dst_req[0]) { + num_parents = 2; + parent_axe_ids[0] = src_req[0]->axe_id; + parent_axe_ids[1] = dst_req[0]->axe_id; + parent_reqs[0] = *src_req; + parent_reqs[1] = *dst_req; + } + else if (NULL != src_req[0]) { + num_parents = 1; + parent_axe_ids[0] = src_req[0]->axe_id; + parent_reqs[0] = *src_req; + } + else if (NULL != dst_req[0]) { + num_parents = 1; + parent_axe_ids[0] = dst_req[0]->axe_id; + parent_reqs[0] = *dst_req; + } + else { + num_parents = 0; + } + + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; + #if H5VL_IOD_DEBUG - if(copy_flag) - printf("Link Copy axe %llu: %s ID %llu axe %llu to %s ID %llu axe %llu\n", - input.axe_info.axe_id, src_name, input.src_loc_id, input.src_parent_axe_id, - dst_name, input.dst_loc_id, input.dst_parent_axe_id); - else - printf("Link Move axe %llu: %s ID %llu axe %llu to %s ID %llu axe %llu\n", - input.axe_info.axe_id, src_name, input.src_loc_id, input.src_parent_axe_id, - dst_name, input.dst_loc_id, input.dst_parent_axe_id); + { + size_t i; + printf("Link Move Dependencies: "); + for(i=0 ; i<num_parents ; i++) + printf("%llu ", parent_axe_ids[i]); + printf("\n"); + } #endif status = (herr_t *)malloc(sizeof(herr_t)); if(H5VL__iod_create_and_forward(H5VL_LINK_MOVE_ID, HG_LINK_MOVE, cur_obj, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link move"); done: + + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); + src_req = (H5VL_iod_request_t **)H5MM_xfree(src_req); + dst_req = (H5VL_iod_request_t **)H5MM_xfree(dst_req); if(src_name) free(src_name); if(dst_name) free(dst_name); @@ -4108,6 +4399,7 @@ H5VL_iod_link_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_link_get_t get_ hid_t dxpl_id, void **req, va_list arguments) { H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; herr_t ret_value = SUCCEED; /* Return value */ @@ -4122,21 +4414,32 @@ H5VL_iod_link_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_link_get_t get_ /* Retrieve the parent info by traversing the path where the link should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.path = new_name; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Link Exists axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif - if(H5VL__iod_create_and_forward(H5VL_LINK_EXISTS_ID, HG_LINK_EXISTS, obj, 0, + if(H5VL__iod_create_and_forward(H5VL_LINK_EXISTS_ID, HG_LINK_EXISTS, + obj, 0, input.axe_info.num_parents, parent_req, &input, ret, ret, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link exists"); @@ -4153,21 +4456,33 @@ H5VL_iod_link_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_link_get_t get_ /* Retrieve the parent info by traversing the path where the link should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.path = new_name; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Link get info axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, + ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif - if(H5VL__iod_create_and_forward(H5VL_LINK_GET_INFO_ID, HG_LINK_GET_INFO, obj, 0, + if(H5VL__iod_create_and_forward(H5VL_LINK_GET_INFO_ID, HG_LINK_GET_INFO, + obj, 0, input.axe_info.num_parents, parent_req, &input, linfo, linfo, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link get_info"); @@ -4185,15 +4500,25 @@ H5VL_iod_link_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_link_get_t get_ /* Retrieve the parent info by traversing the path where the link should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.path = new_name; input.length = size; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } if(NULL == (result = (link_get_val_out_t *)malloc (sizeof(link_get_val_out_t)))) { @@ -4205,10 +4530,11 @@ H5VL_iod_link_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_link_get_t get_ #if H5VL_IOD_DEBUG printf("Link get val axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(H5VL__iod_create_and_forward(H5VL_LINK_GET_VAL_ID, HG_LINK_GET_VAL, obj, 0, + input.axe_info.num_parents, parent_req, &input, result, result, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link get_val"); @@ -4250,6 +4576,7 @@ H5VL_iod_link_remove(void *_obj, H5VL_loc_params_t loc_params, hid_t dxpl_id, vo H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; H5VL_iod_object_t *cur_obj; link_op_in_t input; + H5VL_iod_request_t **parent_req = NULL; int *status; char *new_name = NULL; herr_t ret_value = SUCCEED; @@ -4258,23 +4585,34 @@ H5VL_iod_link_remove(void *_obj, H5VL_loc_params_t loc_params, hid_t dxpl_id, vo /* Retrieve the parent info by traversing the path where the link should be removed. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, &cur_obj) < 0) + parent_req, &new_name, &cur_obj) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; input.path = new_name; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Link Remove axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif status = (int *)malloc(sizeof(int)); - if(H5VL__iod_create_and_forward(H5VL_LINK_REMOVE_ID, HG_LINK_REMOVE, cur_obj, 1, + if(H5VL__iod_create_and_forward(H5VL_LINK_REMOVE_ID, HG_LINK_REMOVE, cur_obj, 1, + input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship link remove"); @@ -4304,6 +4642,7 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, { H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; /* location object to open the group */ char *new_name = NULL; + H5VL_iod_request_t **parent_req = NULL; void *ret_value; FUNC_ENTER_NOAPI_NOINIT @@ -4328,10 +4667,11 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, input.coh = obj->file->remote_file.coh; input.loc_id = loc_params.loc_data.loc_by_addr.addr; input.loc_oh.cookie = IOD_OH_UNDEFINED; - input.parent_axe_id = 0; input.name = "."; input.dapl_id = H5P_DATASET_ACCESS_DEFAULT; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; dset->dapl_id = H5P_DATASET_ACCESS_DEFAULT; @@ -4342,7 +4682,7 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, dset->common.obj_name = NULL; if(H5VL__iod_create_and_forward(H5VL_DSET_OPEN_ID, HG_DSET_OPEN, - (H5VL_iod_object_t *)dset, 1, + (H5VL_iod_object_t *)dset, 1, 0, NULL, &input, &dset->remote_dset, dset, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship dataset create"); @@ -4368,10 +4708,11 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, input.coh = obj->file->remote_file.coh; input.loc_id = loc_params.loc_data.loc_by_addr.addr; input.loc_oh.cookie = IOD_OH_UNDEFINED; - input.parent_axe_id = 0; input.name = "."; input.tapl_id = H5P_DATATYPE_ACCESS_DEFAULT; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; dtype->tapl_id = H5P_DATATYPE_ACCESS_DEFAULT; @@ -4382,7 +4723,7 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, dtype->common.obj_name = NULL; if(H5VL__iod_create_and_forward(H5VL_DTYPE_OPEN_ID, HG_DTYPE_OPEN, - (H5VL_iod_object_t *)dtype, 1, + (H5VL_iod_object_t *)dtype, 1, 0, NULL, &input, &dtype->remote_dtype, dtype, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship datatype open"); @@ -4407,10 +4748,11 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, input.coh = obj->file->remote_file.coh; input.loc_id = loc_params.loc_data.loc_by_addr.addr; input.loc_oh.cookie = IOD_OH_UNDEFINED; - input.parent_axe_id = 0; input.name = "."; input.gapl_id = H5P_GROUP_ACCESS_DEFAULT; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; grp->gapl_id = H5P_GROUP_ACCESS_DEFAULT; @@ -4421,7 +4763,7 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, grp->common.obj_name = NULL; if(H5VL__iod_create_and_forward(H5VL_GROUP_OPEN_ID, HG_GROUP_OPEN, - (H5VL_iod_object_t *)grp, 1, + (H5VL_iod_object_t *)grp, 1, 0, NULL, &input, &grp->remote_group, grp, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship group open"); @@ -4448,10 +4790,11 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, input.coh = obj->file->remote_file.coh; input.loc_id = loc_params.loc_data.loc_by_addr.addr; input.loc_oh.cookie = IOD_OH_UNDEFINED; - input.parent_axe_id = 0; input.name = "."; input.mapl_id = H5P_GROUP_ACCESS_DEFAULT; input.axe_info.axe_id = g_axe_id ++; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; map->mapl_id = H5P_GROUP_ACCESS_DEFAULT; @@ -4462,7 +4805,7 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, map->common.obj_name = NULL; if(H5VL__iod_create_and_forward(H5VL_MAP_OPEN_ID, HG_MAP_OPEN, - (H5VL_iod_object_t *)map, 1, + (H5VL_iod_object_t *)map, 1, 0, NULL, &input, &map->remote_map, map, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship map open"); @@ -4481,17 +4824,28 @@ H5VL_iod_object_open(void *_obj, H5VL_loc_params_t loc_params, /* Retrieve the parent AXE id by traversing the path where the object should be opened. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.loc_name = new_name; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_ID, HG_OBJECT_OPEN, - obj, 1, &input, &remote_obj, &remote_obj, req) < 0) + obj, 1, input.axe_info.num_parents, parent_req, + &input, &remote_obj, &remote_obj, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship object open"); *opened_type = remote_obj.obj_type; @@ -4712,22 +5066,31 @@ H5VL_iod_object_copy(void *_src_obj, H5VL_loc_params_t loc_params1, const char * object_copy_in_t input; int *status; char *new_src_name = NULL, *new_dst_name = NULL; - herr_t ret_value = SUCCEED; /* Return value */ + size_t num_parents; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; + H5VL_iod_request_t **src_req; + H5VL_iod_request_t **dst_req; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT /* Retrieve the parent information by traversing the path where the link should be moved from. */ + if(NULL == (src_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(src_obj, loc_params1, src_name, &input.src_loc_id, &input.src_loc_oh, - &input.src_parent_axe_id, &new_src_name, NULL) < 0) + src_req, &new_src_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* Retrieve the parent information by traversing the path where the link should be moved to. */ + if(NULL == (dst_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(dst_obj, loc_params2, dst_name, &input.dst_loc_id, &input.dst_loc_oh, - &input.dst_parent_axe_id, &new_dst_name, &cur_obj) < 0) + dst_req, &new_dst_name, &cur_obj) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -4738,20 +5101,57 @@ H5VL_iod_object_copy(void *_src_obj, H5VL_loc_params_t loc_params1, const char * input.src_loc_name = new_src_name; input.dst_loc_name = new_dst_name; + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *) * 2))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + + if(NULL != src_req[0] && NULL != dst_req[0]) { + num_parents = 2; + parent_axe_ids[0] = src_req[0]->axe_id; + parent_axe_ids[1] = dst_req[0]->axe_id; + parent_reqs[0] = *src_req; + parent_reqs[1] = *dst_req; + } + else if (NULL != src_req[0]) { + num_parents = 1; + parent_axe_ids[0] = src_req[0]->axe_id; + parent_reqs[0] = *src_req; + } + else if (NULL != dst_req[0]) { + num_parents = 1; + parent_axe_ids[0] = dst_req[0]->axe_id; + parent_reqs[0] = *dst_req; + } + else { + num_parents = 0; + } + + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; + #if H5VL_IOD_DEBUG - printf("Object Copy axe %llu: %s ID %llu axe %llu to %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_src_name, input.src_loc_id, input.src_parent_axe_id, - new_dst_name, input.dst_loc_id, input.dst_parent_axe_id); + { + size_t i; + printf("Object Copy Dependencies: "); + for(i=0 ; i<num_parents ; i++) + printf("%llu ", parent_axe_ids[i]); + printf("\n"); + } #endif status = (herr_t *)malloc(sizeof(herr_t)); if(H5VL__iod_create_and_forward(H5VL_OBJECT_COPY_ID, HG_OBJECT_COPY, (H5VL_iod_object_t *)cur_obj, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship object copy"); done: + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); + src_req = (H5VL_iod_request_t **)H5MM_xfree(src_req); + dst_req = (H5VL_iod_request_t **)H5MM_xfree(dst_req); if(new_src_name) free(new_src_name); if(new_dst_name) free(new_dst_name); @@ -4807,6 +5207,7 @@ H5VL_iod_object_misc(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_misc_ { H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; int *status = NULL; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -4822,8 +5223,10 @@ H5VL_iod_object_misc(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_misc_ /* Retrieve the parent AXE id by traversing the path where the attribute is located. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &loc_name, NULL) < 0) + parent_req, &loc_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -4832,16 +5235,24 @@ H5VL_iod_object_misc(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_misc_ input.old_attr_name = old_name; input.new_attr_name = new_name; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Attribute Rename %s to %s LOC ID %llu, axe id %llu, parent %llu\n", - old_name, new_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id); + old_name, new_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif status = (herr_t *)malloc(sizeof(herr_t)); if(H5VL__iod_create_and_forward(H5VL_ATTR_RENAME_ID, HG_ATTR_RENAME, - (H5VL_iod_object_t *)obj, 1, + obj, 1, input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship attribute rename"); @@ -4858,8 +5269,10 @@ H5VL_iod_object_misc(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_misc_ /* Retrieve the parent AXE id by traversing the path where the object is located. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &loc_name, NULL) < 0) + parent_req, &loc_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ @@ -4867,11 +5280,19 @@ H5VL_iod_object_misc(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_misc_ input.path = loc_name; input.comment = comment; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } status = (herr_t *)malloc(sizeof(herr_t)); if(H5VL__iod_create_and_forward(H5VL_OBJECT_SET_COMMENT_ID, HG_OBJECT_SET_COMMENT, - (H5VL_iod_object_t *)obj, 0, + obj, 0, input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship object set_comment"); @@ -4930,6 +5351,7 @@ H5VL_iod_object_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_get_t H5VL_iod_object_t *obj = (H5VL_iod_object_t *)_obj; int *status; char *new_name = NULL; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -4943,22 +5365,32 @@ H5VL_iod_object_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_get_t /* Retrieve the parent info by traversing the path where the object should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; input.axe_info.axe_id = g_axe_id ++; input.loc_name = new_name; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Object Exists axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(H5VL__iod_create_and_forward(H5VL_OBJECT_EXISTS_ID, HG_OBJECT_EXISTS, - (H5VL_iod_object_t *)obj, 0, + obj, 0, input.axe_info.num_parents, parent_req, &input, ret, ret, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship object exists"); @@ -4995,18 +5427,28 @@ H5VL_iod_object_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_get_t /* Retrieve the parent info by traversing the path where the object should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.path = new_name; if(comment) input.length = size; else input.length = 0; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } if(NULL == (result = (object_get_comment_out_t *)malloc (sizeof(object_get_comment_out_t)))) { @@ -5019,11 +5461,11 @@ H5VL_iod_object_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_get_t #if H5VL_IOD_DEBUG printf("Object Get Comment axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(H5VL__iod_create_and_forward(H5VL_OBJECT_GET_COMMENT_ID, HG_OBJECT_GET_COMMENT, - (H5VL_iod_object_t *)obj, 0, + obj, 0, input.axe_info.num_parents, parent_req, &input, result, result, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship object get_comment"); @@ -5039,22 +5481,32 @@ H5VL_iod_object_get(void *_obj, H5VL_loc_params_t loc_params, H5VL_object_get_t /* Retrieve the parent info by traversing the path where the object should be checked. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, ".", &input.loc_id, &input.loc_oh, - &input.parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "Failed to resolve current working group"); /* set the input structure for the HG encode routine */ input.coh = obj->file->remote_file.coh; - input.axe_info.axe_id = g_axe_id ++; input.loc_name = new_name; + input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Object get_info axe %llu: %s ID %llu axe %llu\n", - input.axe_info.axe_id, new_name, input.loc_id, input.parent_axe_id); + input.axe_info.axe_id, new_name, input.loc_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(H5VL__iod_create_and_forward(H5VL_OBJECT_GET_INFO_ID, HG_OBJECT_GET_INFO, - (H5VL_iod_object_t *)obj, 0, + obj, 0, input.axe_info.num_parents, parent_req, &input, oinfo, oinfo, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship object get_info"); @@ -5103,7 +5555,7 @@ H5VL_iod_map_create(void *_obj, H5VL_loc_params_t loc_params, const char *name, map_create_in_t input; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ void *ret_value = NULL; @@ -5111,8 +5563,10 @@ H5VL_iod_map_create(void *_obj, H5VL_loc_params_t loc_params, const char *name, /* Retrieve the parent AXE id by traversing the path where the map should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the map object that is returned to the user */ @@ -5136,7 +5590,6 @@ H5VL_iod_map_create(void *_obj, H5VL_loc_params_t loc_params, const char *name, input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.name = new_name; input.keytype_id = keytype; input.valtype_id = valtype; @@ -5144,10 +5597,18 @@ H5VL_iod_map_create(void *_obj, H5VL_loc_params_t loc_params, const char *name, input.mapl_id = mapl_id; input.lcpl_id = lcpl_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Map Create %s, IOD ID %llu, axe id %llu, parent %llu\n", - new_name, input.map_id, input.axe_info.axe_id, input.parent_axe_id); + new_name, input.map_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif /* setup the local map struct */ @@ -5179,7 +5640,8 @@ H5VL_iod_map_create(void *_obj, H5VL_loc_params_t loc_params, const char *name, map->common.file->nopen_objs ++; if(H5VL__iod_create_and_forward(H5VL_MAP_CREATE_ID, HG_MAP_CREATE, - (H5VL_iod_object_t *)map, 1, + (H5VL_iod_object_t *)map, 1, + input.axe_info.num_parents, parent_req, &input, &map->remote_map, map, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship map create"); @@ -5200,7 +5662,7 @@ H5VL_iod_map_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, hi map_open_in_t input; iod_obj_id_t iod_id; iod_handle_t iod_oh; - uint64_t parent_axe_id; + H5VL_iod_request_t **parent_req = NULL; char *new_name = NULL; /* resolved path to where we need to start traversal at the server */ void *ret_value = NULL; @@ -5208,8 +5670,10 @@ H5VL_iod_map_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, hi /* Retrieve the parent AXE id by traversing the path where the map should be created. */ + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); if(H5VL_iod_get_parent_info(obj, loc_params, name, &iod_id, &iod_oh, - &parent_axe_id, &new_name, NULL) < 0) + parent_req, &new_name, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "Failed to resolve current working group"); /* allocate the map object that is returned to the user */ @@ -5225,14 +5689,21 @@ H5VL_iod_map_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, hi input.coh = obj->file->remote_file.coh; input.loc_id = iod_id; input.loc_oh = iod_oh; - input.parent_axe_id = parent_axe_id; input.name = new_name; input.mapl_id = mapl_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != parent_req[0]) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &parent_req[0]->axe_id; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + } #if H5VL_IOD_DEBUG printf("Map Open %s LOC ID %llu, axe id %llu, parent %llu, name len %zu\n", - new_name, input.loc_id, input.axe_info.axe_id, input.parent_axe_id, strlen(input.name)); + new_name, input.loc_id, input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0), strlen(input.name)); #endif /* setup the local map struct */ @@ -5257,7 +5728,8 @@ H5VL_iod_map_open(void *_obj, H5VL_loc_params_t loc_params, const char *name, hi map->common.file = obj->file; map->common.file->nopen_objs ++; - if(H5VL__iod_create_and_forward(H5VL_MAP_OPEN_ID, HG_MAP_OPEN, (H5VL_iod_object_t *)map, 1, + if(H5VL__iod_create_and_forward(H5VL_MAP_OPEN_ID, HG_MAP_OPEN, (H5VL_iod_object_t *)map, 1, + input.axe_info.num_parents, parent_req, &input, &map->remote_map, map, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship map open"); @@ -5277,6 +5749,7 @@ H5VL_iod_map_set(void *_map, hid_t key_mem_type_id, const void *key, map_set_in_t input; size_t key_size, val_size; int *status = NULL; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -5290,13 +5763,6 @@ H5VL_iod_map_set(void *_map, hid_t key_mem_type_id, const void *key, map->common.request = NULL; } - /* set the parent axe id */ - if(map->common.request) - input.parent_axe_id = map->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* get the Key and Value size */ { H5T_t *dt = NULL; @@ -5312,6 +5778,9 @@ H5VL_iod_map_set(void *_map, hid_t key_mem_type_id, const void *key, val_size = H5T_GET_SIZE(dt); } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = map->common.file->remote_file.coh; input.iod_oh = map->remote_map.iod_oh; @@ -5326,15 +5795,28 @@ H5VL_iod_map_set(void *_map, hid_t key_mem_type_id, const void *key, input.val.buf_size = val_size; input.val.buf = value; input.axe_info.axe_id = g_axe_id ++; + if(NULL != map->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &map->common.request->axe_id; + map->common.request->rc ++; + *parent_req = map->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } status = (int *)malloc(sizeof(int)); #if H5VL_IOD_DEBUG printf("MAP set, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif - if(H5VL__iod_create_and_forward(H5VL_MAP_SET_ID, HG_MAP_SET, (H5VL_iod_object_t *)map, 0, + if(H5VL__iod_create_and_forward(H5VL_MAP_SET_ID, HG_MAP_SET, + (H5VL_iod_object_t *)map, 0, + input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map set"); @@ -5351,6 +5833,7 @@ H5VL_iod_map_get(void *_map, hid_t key_mem_type_id, const void *key, map_get_in_t input; map_get_out_t *output; size_t key_size, val_size; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -5364,13 +5847,6 @@ H5VL_iod_map_get(void *_map, hid_t key_mem_type_id, const void *key, map->common.request = NULL; } - /* set the parent axe id */ - if(map->common.request) - input.parent_axe_id = map->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* get the Key and Value size */ { H5T_t *dt = NULL; @@ -5386,6 +5862,9 @@ H5VL_iod_map_get(void *_map, hid_t key_mem_type_id, const void *key, val_size = H5T_GET_SIZE(dt); } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = map->common.file->remote_file.coh; input.iod_oh = map->remote_map.iod_oh; @@ -5398,10 +5877,21 @@ H5VL_iod_map_get(void *_map, hid_t key_mem_type_id, const void *key, input.key.buf = key; input.val_memtype_id = val_mem_type_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != map->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &map->common.request->axe_id; + map->common.request->rc ++; + *parent_req = map->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } #if H5VL_IOD_DEBUG printf("MAP Get, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(NULL == (output = (map_get_out_t *)H5MM_calloc(sizeof(map_get_out_t)))) @@ -5410,7 +5900,9 @@ H5VL_iod_map_get(void *_map, hid_t key_mem_type_id, const void *key, output->val.val = value; output->val.val_size = val_size; - if(H5VL__iod_create_and_forward(H5VL_MAP_GET_ID, HG_MAP_GET, (H5VL_iod_object_t *)map, 0, + if(H5VL__iod_create_and_forward(H5VL_MAP_GET_ID, HG_MAP_GET, + (H5VL_iod_object_t *)map, 0, + input.axe_info.num_parents, parent_req, &input, output, output, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map get"); @@ -5451,30 +5943,39 @@ H5VL_iod_map_get_count(void *_map, hsize_t *count, uint64_t trans, void **req) { H5VL_iod_map_t *map = (H5VL_iod_map_t *)_map; map_get_count_in_t input; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT - /* set the parent axe id */ - if(map->common.request) - input.parent_axe_id = map->common.request->axe_id; - else { - input.parent_axe_id = 0; - } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); /* Fill input structure */ input.coh = map->common.file->remote_file.coh; input.iod_oh = map->remote_map.iod_oh; input.iod_id = map->remote_map.iod_id; input.axe_info.axe_id = g_axe_id ++; + if(NULL != map->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &map->common.request->axe_id; + map->common.request->rc ++; + *parent_req = map->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } #if H5VL_IOD_DEBUG printf("MAP Get count, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif if(H5VL__iod_create_and_forward(H5VL_MAP_GET_COUNT_ID, HG_MAP_GET_COUNT, (H5VL_iod_object_t *)map, 0, + input.axe_info.num_parents, parent_req, &input, count, count, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map get_count"); @@ -5489,17 +5990,11 @@ H5VL_iod_map_exists(void *_map, hid_t key_mem_type_id, const void *key, H5VL_iod_map_t *map = (H5VL_iod_map_t *)_map; map_op_in_t input; size_t key_size; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT - /* set the parent axe id */ - if(map->common.request) - input.parent_axe_id = map->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* get the Key and Value size */ { H5T_t *dt = NULL; @@ -5509,6 +6004,9 @@ H5VL_iod_map_exists(void *_map, hid_t key_mem_type_id, const void *key, key_size = H5T_GET_SIZE(dt); } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = map->common.file->remote_file.coh; input.iod_oh = map->remote_map.iod_oh; @@ -5518,13 +6016,26 @@ H5VL_iod_map_exists(void *_map, hid_t key_mem_type_id, const void *key, input.key.buf_size = key_size; input.key.buf = key; input.axe_info.axe_id = g_axe_id ++; + if(NULL != map->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &map->common.request->axe_id; + map->common.request->rc ++; + *parent_req = map->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } #if H5VL_IOD_DEBUG printf("MAP EXISTS, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif - if(H5VL__iod_create_and_forward(H5VL_MAP_EXISTS_ID, HG_MAP_EXISTS, (H5VL_iod_object_t *)map, 0, + if(H5VL__iod_create_and_forward(H5VL_MAP_EXISTS_ID, HG_MAP_EXISTS, + (H5VL_iod_object_t *)map, 0, + input.axe_info.num_parents, parent_req, &input, exists, exists, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map exists"); @@ -5536,8 +6047,6 @@ herr_t H5VL_iod_map_iterate(void *map, hid_t key_mem_type_id, hid_t value_mem_type_id, H5M_iterate_func_t callback_func, void *context) { - hg_request_t _hg_req; /* Local function shipper request, for sync. operations */ - H5VL_iod_request_t _request; /* Local request, for sync. operations */ herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -5554,17 +6063,11 @@ H5VL_iod_map_delete(void *_map, hid_t key_mem_type_id, const void *key, map_op_in_t input; size_t key_size; int *status = NULL; + H5VL_iod_request_t **parent_req = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT - /* set the parent axe id */ - if(map->common.request) - input.parent_axe_id = map->common.request->axe_id; - else { - input.parent_axe_id = 0; - } - /* get the Key and Value size */ { H5T_t *dt = NULL; @@ -5574,6 +6077,9 @@ H5VL_iod_map_delete(void *_map, hid_t key_mem_type_id, const void *key, key_size = H5T_GET_SIZE(dt); } + if(NULL == (parent_req = (H5VL_iod_request_t **)H5MM_malloc(sizeof(H5VL_iod_request_t *)))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate parent req element"); + /* Fill input structure */ input.coh = map->common.file->remote_file.coh; input.iod_oh = map->remote_map.iod_oh; @@ -5583,15 +6089,28 @@ H5VL_iod_map_delete(void *_map, hid_t key_mem_type_id, const void *key, input.key.buf_size = key_size; input.key.buf = key; input.axe_info.axe_id = g_axe_id ++; + if(NULL != map->common.request) { + input.axe_info.num_parents = 1; + input.axe_info.parent_axe_ids = &map->common.request->axe_id; + map->common.request->rc ++; + *parent_req = map->common.request; + } + else { + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; + *parent_req = NULL; + } #if H5VL_IOD_DEBUG printf("MAP DELETE, axe id %llu, parent %llu\n", - input.axe_info.axe_id, input.parent_axe_id); + input.axe_info.axe_id, ((input.axe_info.parent_axe_ids!=NULL) ? input.axe_info.parent_axe_ids[0] : 0)); #endif status = (int *)malloc(sizeof(int)); - if(H5VL__iod_create_and_forward(H5VL_MAP_DELETE_ID, HG_MAP_DELETE, (H5VL_iod_object_t *)map, 1, + if(H5VL__iod_create_and_forward(H5VL_MAP_DELETE_ID, HG_MAP_DELETE, + (H5VL_iod_object_t *)map, 1, + input.axe_info.num_parents, parent_req, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map delete"); @@ -5605,7 +6124,8 @@ herr_t H5VL_iod_map_close(void *_map, void **req) map_close_in_t input; int *status; size_t num_parents; - uint64_t *axe_parents = NULL; + AXE_task_t *parent_axe_ids = NULL; + H5VL_iod_request_t **parent_reqs = NULL; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -5617,30 +6137,47 @@ herr_t H5VL_iod_map_close(void *_map, void **req) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't wait on all object requests"); } - /* determine the parent axe IDs array for this operation*/ - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)map, &num_parents, NULL) < 0) + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)map, &num_parents, NULL, NULL) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get num AXE parents"); + if(num_parents) { - if(NULL == (axe_parents = (uint64_t *)H5MM_malloc(sizeof(uint64_t) * num_parents))) - HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate num parents array"); - if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)map, &num_parents, axe_parents) < 0) + if(NULL == (parent_axe_ids = (AXE_task_t *)H5MM_malloc(sizeof(AXE_task_t) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent axe IDs"); + if(NULL == (parent_reqs = (H5VL_iod_request_t **)H5MM_malloc + (sizeof(H5VL_iod_request_t *) * num_parents))) + HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't allocate array of parent reqs"); + if(H5VL_iod_get_axe_parents((H5VL_iod_object_t *)map, &num_parents, + parent_axe_ids, parent_reqs) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get AXE parents"); } input.iod_oh = map->remote_map.iod_oh; input.iod_id = map->remote_map.iod_id; - input.parent_axe_ids.count = num_parents; - input.parent_axe_ids.ids = axe_parents; + input.axe_info.num_parents = num_parents; + input.axe_info.parent_axe_ids = parent_axe_ids; input.axe_info.axe_id = g_axe_id ++; +#if H5VL_IOD_DEBUG + { + size_t i; + + printf("Map Close %s, axe id %llu, %d parents: ", + map->common.obj_name, input.axe_info.axe_id, num_parents); + for(i=0 ; i<num_parents ; i++) + printf("%llu ", parent_axe_ids[i]); + printf("\n"); + } +#endif + status = (int *)malloc(sizeof(int)); if(H5VL__iod_create_and_forward(H5VL_MAP_CLOSE_ID, HG_MAP_CLOSE, (H5VL_iod_object_t *)map, 1, + num_parents, parent_reqs, &input, status, status, req) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to create and ship map close"); done: - axe_parents = (uint64_t *)H5MM_xfree(axe_parents); + parent_axe_ids = (AXE_task_t *)H5MM_xfree(parent_axe_ids); FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_map_close() */ @@ -5685,8 +6222,10 @@ H5VL_iod_cancel(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } } /* forward the cancel call to the IONs */ @@ -5719,8 +6258,10 @@ H5VL_iod_cancel(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } } /* if the status returned is cancelled, then cancel it @@ -5740,8 +6281,10 @@ H5VL_iod_cancel(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } } } else @@ -5791,8 +6334,10 @@ H5VL_iod_test(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } } else { if(hg_status) { @@ -5812,8 +6357,10 @@ H5VL_iod_test(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } } /* request has not finished, set return status appropriately */ else @@ -5860,8 +6407,10 @@ H5VL_iod_wait(void **req, H5_status_t *status) request->req = H5MM_xfree(request->req); /* free the actual request if the ref count reached 0 */ - if(0 == request->rc) + if(0 == request->rc) { + request->parent_reqs = (H5VL_iod_request_t **)H5MM_xfree(request->parent_reqs); request = (H5VL_iod_request_t *)H5MM_xfree(request); + } done: FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5VLiod_client.c b/src/H5VLiod_client.c index 3784876..d81034e 100644 --- a/src/H5VLiod_client.c +++ b/src/H5VLiod_client.c @@ -90,6 +90,8 @@ H5VL_iod_request_add(H5VL_iod_file_t *file, H5VL_iod_request_t *request) } request->next = NULL; + file->num_req ++; + FUNC_LEAVE_NOAPI(SUCCEED) } @@ -109,11 +111,23 @@ H5VL_iod_request_delete(H5VL_iod_file_t *file, H5VL_iod_request_t *request) { H5VL_iod_request_t *prev; H5VL_iod_request_t *next; + unsigned u; FUNC_ENTER_NOAPI_NOINIT_NOERR HDassert(request); + /* decrement ref count on parent requests */ + for(u=0 ; u<request->num_parents ; u++) { + request->parent_reqs[u]->rc --; + if(0 == request->parent_reqs[u]->rc) { + request->parent_reqs[u]->parent_reqs = (H5VL_iod_request_t **) + H5MM_xfree(request->parent_reqs[u]->parent_reqs); + request->parent_reqs[u] = (H5VL_iod_request_t *) + H5MM_xfree(request->parent_reqs[u]); + } + } + prev = request->prev; next = request->next; if (prev) { @@ -142,6 +156,8 @@ H5VL_iod_request_delete(H5VL_iod_file_t *file, H5VL_iod_request_t *request) request->prev = NULL; request->next = NULL; + file->num_req --; + FUNC_LEAVE_NOAPI(SUCCEED) } @@ -554,7 +570,8 @@ H5VL_iod_request_complete(H5VL_iod_file_t *file, H5VL_iod_request_t *req) input.mem_type_id = info->mem_type_id; input.dset_type_id = dset->remote_dset.type_id; input.axe_info.axe_id = info->axe_id; - input.parent_axe_id = 0; + input.axe_info.num_parents = 0; + input.axe_info.parent_axe_ids = NULL; input.axe_info.start_range = 0; input.axe_info.count = 0; @@ -1410,7 +1427,8 @@ done: */ herr_t H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, /*IN/OUT*/ size_t *count, - /*OUT*/ uint64_t *parents) + /*OUT*/ AXE_task_t *parent_axe_ids, + /*OUT*/ H5VL_iod_request_t **parent_reqs) { H5VL_iod_file_t *file = obj->file; H5VL_iod_request_t *cur_req = file->request_list_head; @@ -1422,10 +1440,12 @@ H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, /*IN/OUT*/ size_t *count, /* If the request is pending on the object we want, add its axe_id */ if(cur_req->obj == obj) { if(cur_req->status == H5AO_PENDING) { - if(NULL != parents) { - parents[size] = cur_req->axe_id; - //parents_array[size] = cur_req; - //cur_req->rc ++; + if(NULL != parent_axe_ids) { + parent_axe_ids[size] = cur_req->axe_id; + } + if(NULL != parent_reqs) { + parent_reqs[size] = cur_req; + cur_req->rc ++; } size ++; } @@ -1458,15 +1478,15 @@ H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, /*IN/OUT*/ size_t *count, herr_t H5VL_iod_get_parent_info(H5VL_iod_object_t *obj, H5VL_loc_params_t loc_params, const char *name, /*OUT*/iod_obj_id_t *iod_id, - /*OUT*/iod_handle_t *iod_oh, /*OUT*/uint64_t *axe_id, + /*OUT*/iod_handle_t *iod_oh, /*OUT*/H5VL_iod_request_t **parent_req, /*OUT*/char **new_name, /*OUT*/H5VL_iod_object_t **last_obj) { iod_obj_id_t cur_id; iod_handle_t cur_oh; size_t cur_size; /* current size of the path traversed so far */ char *cur_name; /* full path to object that is currently being looked for */ - const H5VL_iod_object_t *cur_obj = obj; /* current object in the traversal loop */ - const H5VL_iod_object_t *next_obj = NULL; /* the next object to traverse */ + H5VL_iod_object_t *cur_obj = obj; /* current object in the traversal loop */ + H5VL_iod_object_t *next_obj = NULL; /* the next object to traverse */ const char *path; /* specified path for the object to traverse to */ H5WB_t *wb = NULL; /* Wrapped buffer for temporary buffer */ char comp_buf[1024]; /* Temporary buffer for path components */ @@ -1533,7 +1553,9 @@ H5VL_iod_get_parent_info(H5VL_iod_object_t *obj, H5VL_loc_params_t loc_params, if(NULL == (next_obj = (const H5VL_iod_object_t *)H5I_search_name (file, cur_name, H5I_DATASET)) && NULL == (next_obj = (H5VL_iod_object_t *)H5I_search_name - (file, cur_name, H5I_DATATYPE))) + (file, cur_name, H5I_DATATYPE)) + && NULL == (next_obj = (H5VL_iod_object_t *)H5I_search_name + (file, cur_name, H5I_MAP))) break; } else { @@ -1569,16 +1591,20 @@ H5VL_iod_get_parent_info(H5VL_iod_object_t *obj, H5VL_loc_params_t loc_params, cur_oh = ((const H5VL_iod_dtype_t *)cur_obj)->remote_dtype.iod_oh; cur_id = ((const H5VL_iod_dtype_t *)cur_obj)->remote_dtype.iod_id; break; + case H5I_MAP: + cur_oh = ((const H5VL_iod_map_t *)cur_obj)->remote_map.iod_oh; + cur_id = ((const H5VL_iod_map_t *)cur_obj)->remote_map.iod_id; + break; default: HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "bad location object"); } if(cur_obj->request && cur_obj->request->status == H5AO_PENDING) { - *axe_id = cur_obj->request->axe_id; - //cur_obj->request->rc ++; + *parent_req = cur_obj->request; + cur_obj->request->rc ++; } else { - *axe_id = 0; + *parent_req = NULL; HDassert(cur_oh.cookie != IOD_OH_UNDEFINED); } diff --git a/src/H5VLiod_client.h b/src/H5VLiod_client.h index 226fcec..b8b9257 100644 --- a/src/H5VLiod_client.h +++ b/src/H5VLiod_client.h @@ -90,6 +90,8 @@ typedef struct H5VL_iod_request_t { H5VL_iod_state_t state; H5_status_t status; uint64_t axe_id; + size_t num_parents; + struct H5VL_iod_request_t **parent_reqs; struct H5VL_iod_request_t *prev; struct H5VL_iod_request_t *next; struct H5VL_iod_request_t *global_prev; @@ -185,6 +187,7 @@ typedef struct H5VL_iod_file_t { hid_t fapl_id; int my_rank; int num_procs; + size_t num_req; unsigned nopen_objs; H5VL_iod_request_t *request_list_head; H5VL_iod_request_t *request_list_tail; @@ -257,15 +260,30 @@ H5_DLL herr_t H5VL_iod_request_wait_some(H5VL_iod_file_t *file, const void *obje H5_DLL herr_t H5VL_iod_request_complete(H5VL_iod_file_t *file, H5VL_iod_request_t *req); H5_DLL herr_t H5VL_iod_request_cancel(H5VL_iod_file_t *file, H5VL_iod_request_t *req); +H5_DLL herr_t H5VL_iod_get_parent_info(H5VL_iod_object_t *obj, H5VL_loc_params_t loc_params, + const char *name, /*OUT*/iod_obj_id_t *iod_id, + /*OUT*/iod_handle_t *iod_oh, + /*OUT*/H5VL_iod_request_t **parent_req, + /*OUT*/char **new_name, /*OUT*/H5VL_iod_object_t **last_obj); +H5_DLL herr_t H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, /*IN/OUT*/ size_t *count, + /*OUT*/ AXE_task_t *parent_axe_ids, + /*OUT*/ H5VL_iod_request_t **parent_reqs); +H5_DLL herr_t H5VL__iod_create_and_forward(hg_id_t op_id, H5RQ_type_t op_type, + H5VL_iod_object_t *request_obj, htri_t track, + size_t num_parents, H5VL_iod_request_t **parent_reqs, + void *input, void *output, void *data, void **req); +/* H5_DLL herr_t H5VL__iod_create_and_forward(hg_id_t op_id, H5RQ_type_t op_type, H5VL_iod_object_t *request_obj, htri_t track, void *input, void *output, void *data, void **req); - H5_DLL herr_t H5VL_iod_get_parent_info(H5VL_iod_object_t *obj, H5VL_loc_params_t loc_params, const char *name, iod_obj_id_t *iod_id, iod_handle_t *iod_oh, uint64_t *axe_id, char **new_name, H5VL_iod_object_t **last_obj); -H5_DLL herr_t H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, size_t *count, uint64_t *parents); +H5_DLL herr_t H5VL_iod_get_axe_parents(H5VL_iod_object_t *obj, size_t *count, + uint64_t *parents); +*/ + H5_DLL herr_t H5VL_iod_gen_obj_id(int myrank, int nranks, uint64_t cur_index, iod_obj_type_t type, uint64_t *id); H5_DLL herr_t H5VL_iod_pre_write(hid_t type_id, hid_t space_id, const void *buf, diff --git a/src/H5VLiod_common.h b/src/H5VLiod_common.h index 10ed6d2..302e9ea 100644 --- a/src/H5VLiod_common.h +++ b/src/H5VLiod_common.h @@ -38,11 +38,6 @@ typedef enum H5VL_iod_state_t { H5VL_IOD_CANCELLED } H5VL_iod_state_t; -typedef struct axe_ids_t { - size_t count; - uint64_t *ids; -} axe_ids_t; - typedef struct H5VL_iod_read_status_t { int ret; uint32_t cs; @@ -71,9 +66,11 @@ typedef struct value_t { } value_t; typedef struct axe_t { - uint64_t axe_id; - uint64_t start_range; - uint64_t count; + AXE_task_t axe_id; + AXE_task_t start_range; + size_t count; + size_t num_parents; + AXE_task_t *parent_axe_ids; } axe_t; H5_DLL int hg_proc_ret_t(hg_proc_t proc, void *data); @@ -117,164 +114,158 @@ MERCURY_GEN_PROC(file_close_in_t, ((axe_t)(axe_info)) MERCURY_GEN_PROC(attr_create_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) ((iod_obj_id_t)(attr_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(path)) + ((hg_string_t)(path)) ((hg_string_t)(attr_name)) ((hid_t)(acpl_id)) ((hid_t)(type_id)) ((hid_t)(space_id))) MERCURY_GEN_PROC(attr_create_out_t, ((iod_handle_t)(iod_oh))) MERCURY_GEN_PROC(attr_open_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) ((hg_string_t)(path)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((hg_string_t)(attr_name))) MERCURY_GEN_PROC(attr_open_out_t, ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) ((hid_t)(acpl_id)) ((hid_t)(type_id)) ((hid_t)(space_id))) MERCURY_GEN_PROC(attr_op_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((hg_string_t)(attr_name))) MERCURY_GEN_PROC(attr_rename_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((hg_string_t)(old_attr_name)) ((hg_string_t)(new_attr_name))) MERCURY_GEN_PROC(attr_io_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(type_id)) ((hg_bulk_t)(bulk_handle))) MERCURY_GEN_PROC(attr_close_in_t, ((axe_t)(axe_info)) - ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) - ((axe_ids_t)(parent_axe_ids))) + ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(group_create_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) ((iod_obj_id_t)(grp_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(name)) ((hid_t)(gapl_id)) + ((hg_string_t)(name)) ((hid_t)(gapl_id)) ((hid_t)(gcpl_id)) ((hid_t)(lcpl_id))) MERCURY_GEN_PROC(group_create_out_t, ((iod_handle_t)(iod_oh))) MERCURY_GEN_PROC(group_open_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) ((hg_string_t)(name)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(name)) ((hid_t)(gapl_id))) MERCURY_GEN_PROC(group_open_out_t, ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) ((hid_t)(gcpl_id))) MERCURY_GEN_PROC(group_close_in_t, ((axe_t)(axe_info)) - ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) - ((axe_ids_t)(parent_axe_ids))) + ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(map_create_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) ((iod_obj_id_t)(map_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(name)) + ((hg_string_t)(name)) ((hid_t)(keytype_id)) ((hid_t)(valtype_id)) ((hid_t)(mapl_id)) ((hid_t)(mcpl_id)) ((hid_t)(lcpl_id))) MERCURY_GEN_PROC(map_create_out_t, ((iod_handle_t)(iod_oh))) MERCURY_GEN_PROC(map_open_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(name)) ((hid_t)(mapl_id))) MERCURY_GEN_PROC(map_open_out_t, ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) ((hid_t)(keytype_id)) ((hid_t)(valtype_id)) ((hid_t)(mcpl_id))) MERCURY_GEN_PROC(map_set_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(key_maptype_id)) ((hid_t)(key_memtype_id)) ((binary_buf_t)(key)) ((hid_t)(val_maptype_id)) ((hid_t)(val_memtype_id)) ((binary_buf_t)(val)) ((hid_t)(dxpl_id))) MERCURY_GEN_PROC(map_get_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(key_maptype_id)) ((hid_t)(key_memtype_id)) ((binary_buf_t)(key)) ((hid_t)(val_maptype_id)) ((hid_t)(val_memtype_id)) ((hid_t)(dxpl_id))) MERCURY_GEN_PROC(map_get_out_t, ((int32_t)(ret)) ((value_t)(val))) MERCURY_GEN_PROC(map_get_count_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id))) + ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(map_op_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(key_maptype_id)) ((hid_t)(key_memtype_id)) ((binary_buf_t)(key))) MERCURY_GEN_PROC(map_close_in_t, ((axe_t)(axe_info)) - ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) - ((axe_ids_t)(parent_axe_ids))) + ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(dset_create_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) ((iod_obj_id_t)(dset_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(name)) + ((hg_string_t)(name)) ((hid_t)(dapl_id)) ((hid_t)(dcpl_id)) ((hid_t)(lcpl_id)) ((hid_t)(type_id)) ((hid_t)(space_id))) MERCURY_GEN_PROC(dset_create_out_t, ((iod_handle_t)(iod_oh))) MERCURY_GEN_PROC(dset_open_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(name)) ((hid_t)(dapl_id))) MERCURY_GEN_PROC(dset_open_out_t, ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) ((hid_t)(dcpl_id)) ((hid_t)(type_id)) ((hid_t)(space_id))) MERCURY_GEN_PROC(dset_set_extent_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((axe_ids_t)(parent_axe_ids)) - ((dims_t)(dims))) + ((iod_obj_id_t)(iod_id)) ((dims_t)(dims))) MERCURY_GEN_PROC(dset_io_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(dset_type_id)) ((hid_t)(mem_type_id)) ((hid_t)(space_id)) ((hid_t)(dxpl_id)) ((uint32_t)(checksum)) ((hg_bulk_t)(bulk_handle))) MERCURY_GEN_PROC(dset_get_vl_size_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(iod_oh)) - ((iod_obj_id_t)(iod_id)) ((uint64_t)(parent_axe_id)) ((hid_t)(mem_type_id)) + ((iod_obj_id_t)(iod_id)) ((hid_t)(mem_type_id)) ((hid_t)(space_id)) ((hid_t)(dxpl_id))) MERCURY_GEN_PROC(dset_read_out_t, ((int32_t)(ret)) ((uint32_t)(cs)) ((size_t)(buf_size))) MERCURY_GEN_PROC(dset_close_in_t, ((axe_t)(axe_info)) - ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) - ((axe_ids_t)(parent_axe_ids))) + ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(dtype_commit_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) ((iod_obj_id_t)(dtype_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(name)) + ((hg_string_t)(name)) ((hid_t)(tapl_id)) ((hid_t)(tcpl_id)) ((hid_t)(lcpl_id)) ((hid_t)(type_id))) MERCURY_GEN_PROC(dtype_commit_out_t, ((iod_handle_t)(iod_oh))) MERCURY_GEN_PROC(dtype_open_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(name)) ((hid_t)(tapl_id))) MERCURY_GEN_PROC(dtype_open_out_t, ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) ((hid_t)(tcpl_id)) ((hid_t)(type_id))) MERCURY_GEN_PROC(dtype_close_in_t, ((axe_t)(axe_info)) - ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) - ((uint64_t)(parent_axe_id))) + ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id))) MERCURY_GEN_PROC(link_create_in_t, ((axe_t)(axe_info)) ((int8_t)(create_type)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) ((iod_obj_id_t)(loc_id)) - ((uint64_t)(parent_axe_id)) ((hg_string_t)(loc_name)) + ((hg_string_t)(loc_name)) ((iod_handle_t)(target_loc_oh)) ((iod_obj_id_t)(target_loc_id)) - ((uint64_t)(target_parent_axe_id)) ((hg_string_t)(target_name)) + ((hg_string_t)(target_name)) ((hg_string_t)(link_value)) ((hid_t)(lapl_id)) ((hid_t)(lcpl_id))) MERCURY_GEN_PROC(link_move_in_t, ((axe_t)(axe_info)) ((hbool_t)(copy_flag)) ((iod_handle_t)(coh)) ((iod_handle_t)(src_loc_oh)) ((iod_obj_id_t)(src_loc_id)) - ((uint64_t)(src_parent_axe_id)) ((hg_string_t)(src_loc_name)) + ((hg_string_t)(src_loc_name)) ((iod_handle_t)(dst_loc_oh)) ((iod_obj_id_t)(dst_loc_id)) - ((uint64_t)(dst_parent_axe_id)) ((hg_string_t)(dst_loc_name)) + ((hg_string_t)(dst_loc_name)) ((hid_t)(lapl_id)) ((hid_t)(lcpl_id))) MERCURY_GEN_PROC(link_op_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path))) MERCURY_GEN_PROC(link_get_val_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((uint64_t)(length))) MERCURY_GEN_PROC(link_get_val_out_t, ((int32_t)(ret)) ((value_t)(value))) MERCURY_GEN_PROC(object_op_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(loc_name))) MERCURY_GEN_PROC(object_open_out_t, ((int32_t)(obj_type)) ((iod_handle_t)(iod_oh)) ((iod_obj_id_t)(iod_id)) @@ -282,17 +273,17 @@ MERCURY_GEN_PROC(object_open_out_t, ((int32_t)(obj_type)) MERCURY_GEN_PROC(object_copy_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(src_loc_oh)) ((iod_obj_id_t)(src_loc_id)) - ((uint64_t)(src_parent_axe_id)) ((hg_string_t)(src_loc_name)) + ((hg_string_t)(src_loc_name)) ((iod_handle_t)(dst_loc_oh)) ((iod_obj_id_t)(dst_loc_id)) - ((uint64_t)(dst_parent_axe_id)) ((hg_string_t)(dst_loc_name)) + ((hg_string_t)(dst_loc_name)) ((hid_t)(ocpypl_id)) ((hid_t)(lcpl_id))) MERCURY_GEN_PROC(object_set_comment_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((hg_string_t)(comment))) MERCURY_GEN_PROC(object_get_comment_in_t, ((axe_t)(axe_info)) ((iod_handle_t)(coh)) ((iod_handle_t)(loc_oh)) - ((iod_obj_id_t)(loc_id)) ((uint64_t)(parent_axe_id)) + ((iod_obj_id_t)(loc_id)) ((hg_string_t)(path)) ((uint64_t)(length))) MERCURY_GEN_PROC(object_get_comment_out_t, ((int32_t)(ret)) ((name_t)(name))) diff --git a/src/H5VLiod_encdec.c b/src/H5VLiod_encdec.c index 8fbdf54..8fc807c 100644 --- a/src/H5VLiod_encdec.c +++ b/src/H5VLiod_encdec.c @@ -58,6 +58,8 @@ int hg_proc_ret_t(hg_proc_t proc, void *data) int hg_proc_axe_t(hg_proc_t proc, void *data) { int ret = HG_SUCCESS; + size_t u; + hg_proc_op_t op; axe_t *struct_data = (axe_t *) data; ret = hg_proc_uint64_t(proc, &struct_data->axe_id); @@ -72,13 +74,55 @@ int hg_proc_axe_t(hg_proc_t proc, void *data) ret = HG_FAIL; return ret; } - ret = hg_proc_uint64_t(proc, &struct_data->count); + ret = hg_proc_size_t(proc, &struct_data->count); if (ret != HG_SUCCESS) { HG_ERROR_DEFAULT("Proc error"); ret = HG_FAIL; return ret; } + ret = hg_proc_size_t(proc, &struct_data->num_parents); + if (ret != HG_SUCCESS) { + HG_ERROR_DEFAULT("Proc error"); + ret = HG_FAIL; + return ret; + } + + op = hg_proc_get_op(proc); + + switch(op) { + case HG_ENCODE: + for(u=0 ; u<struct_data->num_parents ; u++) { + ret = hg_proc_uint64_t(proc, &struct_data->parent_axe_ids[u]); + if (ret != HG_SUCCESS) { + HG_ERROR_DEFAULT("Proc error"); + ret = HG_FAIL; + return ret; + } + } + break; + case HG_DECODE: + if(struct_data->num_parents) + struct_data->parent_axe_ids = (uint64_t *)malloc (sizeof(hsize_t) * + struct_data->num_parents); + + for(u=0 ; u<struct_data->num_parents ; u++) { + ret = hg_proc_uint64_t(proc, &struct_data->parent_axe_ids[u]); + if (ret != HG_SUCCESS) { + HG_ERROR_DEFAULT("Proc error"); + ret = HG_FAIL; + return ret; + } + } + break; + case HG_FREE: + if(struct_data->num_parents) + free(struct_data->parent_axe_ids); + break; + default: + return HG_FAIL; + } + return ret; } /* Define hg_proc_htri_t */ @@ -140,57 +184,6 @@ int hg_proc_iod_obj_id_t(hg_proc_t proc, void *data) return ret; } -int hg_proc_axe_ids_t(hg_proc_t proc, void *data) -{ - int ret = HG_SUCCESS; - size_t i; - hg_proc_op_t op; - axe_ids_t *struct_data = (axe_ids_t *) data; - - ret = hg_proc_uint64_t(proc, &struct_data->count); - if (ret != HG_SUCCESS) { - HG_ERROR_DEFAULT("Proc error"); - ret = HG_FAIL; - return ret; - } - - op = hg_proc_get_op(proc); - - switch(op) { - case HG_ENCODE: - for(i=0 ; i<struct_data->count ; i++) { - ret = hg_proc_uint64_t(proc, &struct_data->ids[i]); - if (ret != HG_SUCCESS) { - HG_ERROR_DEFAULT("Proc error"); - ret = HG_FAIL; - return ret; - } - } - break; - case HG_DECODE: - if(struct_data->count) - struct_data->ids = (uint64_t *)malloc (sizeof(hsize_t) * struct_data->count); - - for(i=0 ; i<struct_data->count ; i++) { - ret = hg_proc_uint64_t(proc, &struct_data->ids[i]); - if (ret != HG_SUCCESS) { - HG_ERROR_DEFAULT("Proc error"); - ret = HG_FAIL; - return ret; - } - } - break; - case HG_FREE: - if(struct_data->count) - free(struct_data->ids); - break; - default: - return HG_FAIL; - } - - return ret; -} - int hg_proc_dims_t(hg_proc_t proc, void *data) { int ret = HG_SUCCESS; diff --git a/src/H5VLiod_server.c b/src/H5VLiod_server.c index b9cdde0..3fb3dc1 100644 --- a/src/H5VLiod_server.c +++ b/src/H5VLiod_server.c @@ -197,7 +197,7 @@ H5VLiod_start_handler(MPI_Comm comm, MPI_Info UNUSED info) static herr_t H5VL__iod_server_finish_axe_tasks(AXE_engine_t axe_engine, AXE_task_t start_range, - uint64_t count) + size_t count) { AXE_task_t u; herr_t ret_value = SUCCEED; @@ -591,17 +591,10 @@ H5VL_iod_server_attr_create(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_create_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -652,17 +645,10 @@ H5VL_iod_server_attr_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -713,17 +699,10 @@ H5VL_iod_server_attr_read(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_read_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_read_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_read_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -774,17 +753,10 @@ H5VL_iod_server_attr_write(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_write_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_write_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_write_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -835,17 +807,10 @@ H5VL_iod_server_attr_exists(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_exists_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -896,17 +861,10 @@ H5VL_iod_server_attr_rename(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_rename_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_rename_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_rename_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -957,17 +915,10 @@ H5VL_iod_server_attr_remove(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_attr_remove_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_remove_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_remove_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1018,18 +969,10 @@ H5VL_iod_server_attr_close(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_ids.count) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - input->parent_axe_ids.count, input->parent_axe_ids.ids, - 0, NULL, - H5VL_iod_server_attr_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_attr_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_attr_close_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1079,17 +1022,10 @@ H5VL_iod_server_group_create(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_group_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_group_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_group_create_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1139,17 +1075,10 @@ H5VL_iod_server_group_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_group_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_group_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_group_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1199,19 +1128,10 @@ H5VL_iod_server_group_close(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_ids.count) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - input->parent_axe_ids.count, input->parent_axe_ids.ids, - 0, NULL, - H5VL_iod_server_group_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_group_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_group_close_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_iod_server_group_close() */ @@ -1261,17 +1181,10 @@ H5VL_iod_server_dset_create(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dset_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_create_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1322,17 +1235,10 @@ H5VL_iod_server_dset_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dset_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1383,17 +1289,10 @@ H5VL_iod_server_dset_read(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dset_read_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_read_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_read_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1444,17 +1343,10 @@ H5VL_iod_server_dset_get_vl_size(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dset_get_vl_size_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_get_vl_size_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_get_vl_size_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1505,17 +1397,10 @@ H5VL_iod_server_dset_write(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dset_write_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_write_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_write_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1566,18 +1451,10 @@ H5VL_iod_server_dset_set_extent(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_ids.count) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - input->parent_axe_ids.count, input->parent_axe_ids.ids, - 0, NULL, - H5VL_iod_server_dset_set_extent_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_set_extent_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_set_extent_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1628,18 +1505,10 @@ H5VL_iod_server_dset_close(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_ids.count) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - input->parent_axe_ids.count, input->parent_axe_ids.ids, - 0, NULL, - H5VL_iod_server_dset_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dset_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dset_close_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1690,17 +1559,10 @@ H5VL_iod_server_dtype_commit(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dtype_commit_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dtype_commit_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dtype_commit_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1751,17 +1613,10 @@ H5VL_iod_server_dtype_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dtype_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dtype_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dtype_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1812,17 +1667,10 @@ H5VL_iod_server_dtype_close(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_dtype_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_dtype_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_dtype_close_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1873,31 +1721,10 @@ H5VL_iod_server_link_create(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id && input->target_parent_axe_id) { - AXE_task_t tasks[2] = {input->parent_axe_id, input->target_parent_axe_id}; - - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 2, tasks, 0, NULL, - H5VL_iod_server_link_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_link_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->target_parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->target_parent_axe_id, 0, NULL, - H5VL_iod_server_link_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_create_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -1948,31 +1775,10 @@ H5VL_iod_server_link_move(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->src_parent_axe_id && input->dst_parent_axe_id) { - AXE_task_t tasks[2] = {input->src_parent_axe_id, input->dst_parent_axe_id}; - - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 2, tasks, 0, NULL, - H5VL_iod_server_link_move_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->src_parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->src_parent_axe_id, 0, NULL, - H5VL_iod_server_link_move_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->dst_parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->dst_parent_axe_id, 0, NULL, - H5VL_iod_server_link_move_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_move_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_move_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2073,17 +1879,10 @@ H5VL_iod_server_link_exists(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_link_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_exists_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2134,17 +1933,10 @@ H5VL_iod_server_link_get_info(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_link_get_info_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_get_info_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_get_info_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2195,17 +1987,10 @@ H5VL_iod_server_link_get_val(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_link_get_val_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_get_val_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_get_val_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2256,17 +2041,10 @@ H5VL_iod_server_link_remove(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_link_remove_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_link_remove_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_link_remove_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2317,17 +2095,10 @@ H5VL_iod_server_object_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_object_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2378,31 +2149,10 @@ H5VL_iod_server_object_copy(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->src_parent_axe_id && input->dst_parent_axe_id) { - AXE_task_t tasks[2] = {input->src_parent_axe_id, input->dst_parent_axe_id}; - - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 2, tasks, 0, NULL, - H5VL_iod_server_object_copy_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->src_parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->src_parent_axe_id, 0, NULL, - H5VL_iod_server_object_copy_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else if(input->dst_parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->dst_parent_axe_id, 0, NULL, - H5VL_iod_server_object_copy_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_copy_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_copy_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2480,17 +2230,10 @@ H5VL_iod_server_object_exists(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_object_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_exists_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2541,17 +2284,10 @@ H5VL_iod_server_object_set_comment(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_object_set_comment_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_set_comment_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_set_comment_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2602,17 +2338,10 @@ H5VL_iod_server_object_get_comment(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id){ - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_object_get_comment_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_get_comment_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_get_comment_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2663,17 +2392,10 @@ H5VL_iod_server_object_get_info(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_object_get_info_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_object_get_info_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_object_get_info_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2723,17 +2445,10 @@ H5VL_iod_server_map_create(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_create_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_create_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2783,17 +2498,10 @@ H5VL_iod_server_map_open(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_open_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_open_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2843,17 +2551,10 @@ H5VL_iod_server_map_set(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_set_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_set_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_set_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2903,17 +2604,10 @@ H5VL_iod_server_map_get(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_get_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_get_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_get_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -2963,17 +2657,10 @@ H5VL_iod_server_map_get_count(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_get_count_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_get_count_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_get_count_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -3023,17 +2710,10 @@ H5VL_iod_server_map_exists(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_exists_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_exists_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -3083,17 +2763,10 @@ H5VL_iod_server_map_delete(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_id) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - 1, &input->parent_axe_id, 0, NULL, - H5VL_iod_server_map_delete_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_delete_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_delete_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) @@ -3143,18 +2816,10 @@ H5VL_iod_server_map_close(hg_handle_t handle) op_data->hg_handle = handle; op_data->input = (void *)input; - if(input->parent_axe_ids.count) { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, - input->parent_axe_ids.count, input->parent_axe_ids.ids, - 0, NULL, - H5VL_iod_server_map_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } - else { - if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, 0, NULL, 0, NULL, - H5VL_iod_server_map_close_cb, op_data, NULL)) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); - } + if (AXE_SUCCEED != AXEcreate_task(engine, input->axe_info.axe_id, + input->axe_info.num_parents, input->axe_info.parent_axe_ids, + 0, NULL, H5VL_iod_server_map_close_cb, op_data, NULL)) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, HG_FAIL, "can't insert task into async engine"); done: FUNC_LEAVE_NOAPI(ret_value) |