diff --git a/ompi/mca/coll/base/coll_base_util.c b/ompi/mca/coll/base/coll_base_util.c index 5f69519692..422894e45f 100644 --- a/ompi/mca/coll/base/coll_base_util.c +++ b/ompi/mca/coll/base/coll_base_util.c @@ -108,9 +108,11 @@ int ompi_rounddown(int num, int factor) static void release_objs_callback(struct ompi_coll_base_nbc_request_t *request) { if (NULL != request->data.objs.objs[0]) { OBJ_RELEASE(request->data.objs.objs[0]); + request->data.objs.objs[0] = NULL; } if (NULL != request->data.objs.objs[1]) { OBJ_RELEASE(request->data.objs.objs[1]); + request->data.objs.objs[1] = NULL; } } @@ -139,6 +141,9 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op, ompi_datatype_t *type) { ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req; bool retain = false; + if (REQUEST_COMPLETE(req)) { + return OMPI_SUCCESS; + } if (!ompi_op_is_intrinsic(op)) { OBJ_RETAIN(op); request->data.op.op = op; @@ -175,6 +180,9 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype ompi_datatype_t *rtype) { ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req; bool retain = false; + if (REQUEST_COMPLETE(req)) { + return OMPI_SUCCESS; + } if (NULL != stype && !ompi_datatype_is_predefined(stype)) { OBJ_RETAIN(stype); request->data.types.stype = stype; @@ -207,15 +215,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) { } else { scount = rcount = OMPI_COMM_IS_INTER(comm)?ompi_comm_remote_size(comm):ompi_comm_size(comm); } - for (int i=0; idata.vecs.stypes && NULL != request->data.vecs.stypes[i]) { - OMPI_DATATYPE_RELEASE(request->data.vecs.stypes[i]); + if (NULL != request->data.vecs.stypes) { + for (int i=0; idata.vecs.stypes[i]) { + OMPI_DATATYPE_RELEASE(request->data.vecs.stypes[i]); + } } + request->data.vecs.stypes = NULL; } - for (int i=0; idata.vecs.rtypes && NULL != request->data.vecs.rtypes[i]) { - OMPI_DATATYPE_RELEASE(request->data.vecs.rtypes[i]); + if (NULL != request->data.vecs.rtypes) { + for (int i=0; idata.vecs.rtypes[i]) { + OMPI_DATATYPE_RELEASE(request->data.vecs.rtypes[i]); + } } + request->data.vecs.rtypes = NULL; } } @@ -246,6 +260,9 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req, bool retain = false; ompi_communicator_t *comm = request->super.req_mpi_object.comm; int scount, rcount; + if (REQUEST_COMPLETE(req)) { + return OMPI_SUCCESS; + } if (OMPI_COMM_IS_TOPO(comm)) { (void)mca_topo_base_neighbor_count (comm, &rcount, &scount); } else { diff --git a/ompi/mca/coll/libnbc/coll_libnbc_component.c b/ompi/mca/coll/libnbc/coll_libnbc_component.c index 456302b937..a91492f337 100644 --- a/ompi/mca/coll/libnbc/coll_libnbc_component.c +++ b/ompi/mca/coll/libnbc/coll_libnbc_component.c @@ -580,6 +580,6 @@ request_construct(ompi_coll_libnbc_request_t *request) OBJ_CLASS_INSTANCE(ompi_coll_libnbc_request_t, - ompi_request_t, + ompi_coll_base_nbc_request_t, request_construct, NULL);