Skip to content

Commit a53c811

Browse files
committed
nbc: rework the way to add arrays to clean up
Turns out that in the course of working on PR open-mpi#13280 , it was discovered that auxiliary arrays associated with a non-blocking/persistent collective requests were not in fact being cleaned up upon either completion of the non-blocking request of freeing of persistent request except for cases where the 'c' interface detected certain cases. So all the additions to the fortran code to cleanup temporary arrays needed, for example, when default integer type does not map to 'c' int, was not actually doing anything in the general case. This PR also hides the way the auxiliary array info is associated with the request rather than having the current array of pointers in the nbc request exposed in many different places. This PR also fixes up some problems found with handling of some of the arrays within the f90/f08 code. Signed-off-by: Howard Pritchard <howardp@lanl.gov>
1 parent 800b047 commit a53c811

39 files changed

+250
-167
lines changed

ompi/mca/coll/base/coll_base_util.c

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ int ompi_rounddown(int num, int factor)
134134
/**
135135
* Release all objects and arrays stored into the nbc_request.
136136
* The release_arrays are temporary memory to stored the values
137-
* converted from Fortran, and should disappear in same time as the
137+
* converted from Fortran or elsewhere, and should disappear in same time as the
138138
* request itself.
139139
*/
140140
static void
@@ -220,30 +220,25 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
220220
int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype,
221221
ompi_datatype_t *rtype) {
222222
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;
223-
bool retain = false;
224223
if (REQUEST_COMPLETE(req)) {
225224
return OMPI_SUCCESS;
226225
}
227226
if (NULL != stype && !ompi_datatype_is_predefined(stype)) {
228227
OBJ_RETAIN(stype);
229228
request->data.refcounted.types.stype = stype;
230-
retain = true;
231229
}
232230
if (NULL != rtype && !ompi_datatype_is_predefined(rtype)) {
233231
OBJ_RETAIN(rtype);
234232
request->data.refcounted.types.rtype = rtype;
235-
retain = true;
236233
}
237-
if (OPAL_UNLIKELY(retain)) {
238-
if (req->req_persistent) {
239-
request->cb.req_free = req->req_free;
240-
req->req_free = free_objs_callback;
241-
} else {
242-
request->cb.req_complete_cb = req->req_complete_cb;
243-
request->req_complete_cb_data = req->req_complete_cb_data;
244-
req->req_complete_cb = complete_objs_callback;
245-
req->req_complete_cb_data = request;
246-
}
234+
if (req->req_persistent) {
235+
request->cb.req_free = req->req_free;
236+
req->req_free = free_objs_callback;
237+
} else {
238+
request->cb.req_complete_cb = req->req_complete_cb;
239+
request->req_complete_cb_data = req->req_complete_cb_data;
240+
req->req_complete_cb = complete_objs_callback;
241+
req->req_complete_cb_data = request;
247242
}
248243
return OMPI_SUCCESS;
249244
}
@@ -268,6 +263,7 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request)
268263
}
269264
request->data.refcounted.vecs.rtypes = NULL;
270265
}
266+
release_objs_callback(request);
271267
}
272268

273269
static int complete_vecs_callback(struct ompi_request_t *req) {
@@ -333,15 +329,33 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
333329
request->data.refcounted.vecs.rtypes = (ompi_datatype_t **) rtypes;
334330
request->data.refcounted.vecs.scount = scount;
335331
request->data.refcounted.vecs.rcount = rcount;
336-
if (req->req_persistent) {
337-
request->cb.req_free = req->req_free;
338-
req->req_free = free_vecs_callback;
339-
} else {
340-
request->cb.req_complete_cb = req->req_complete_cb;
341-
request->req_complete_cb_data = req->req_complete_cb_data;
342-
req->req_complete_cb = complete_vecs_callback;
343-
req->req_complete_cb_data = request;
344-
}
332+
}
333+
if (req->req_persistent) {
334+
request->cb.req_free = req->req_free;
335+
req->req_free = free_vecs_callback;
336+
} else {
337+
request->cb.req_complete_cb = req->req_complete_cb;
338+
request->req_complete_cb_data = req->req_complete_cb_data;
339+
req->req_complete_cb = complete_vecs_callback;
340+
req->req_complete_cb_data = request;
341+
}
342+
return OMPI_SUCCESS;
343+
}
344+
345+
int ompi_coll_base_run_release_arrays_cb(ompi_request_t *req)
346+
{
347+
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;
348+
349+
assert(NULL != request);
350+
351+
if (req->req_persistent && (NULL == req->req_free)) {
352+
request->cb.req_free = req->req_free;
353+
req->req_free = free_objs_callback;
354+
} else if(NULL != req->req_complete_cb) {
355+
request->cb.req_complete_cb = req->req_complete_cb;
356+
request->req_complete_cb_data = req->req_complete_cb_data;
357+
req->req_complete_cb = complete_objs_callback;
358+
req->req_complete_cb_data = request;
345359
}
346360
return OMPI_SUCCESS;
347361
}

ompi/mca/coll/base/coll_base_util.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,32 @@ ompi_coll_base_nbc_reserve_tags(ompi_communicator_t* comm, int32_t reserve)
9595
return tag;
9696
}
9797

98+
static inline int
99+
ompi_coll_base_append_array_to_release(struct ompi_request_t *req, void *array_ptr)
100+
{
101+
int i, ret = OMPI_SUCCESS;
102+
struct ompi_coll_base_nbc_request_t *request = (struct ompi_coll_base_nbc_request_t *)req;
103+
104+
for(i = 0; i < OMPI_REQ_NB_RELEASE_ARRAYS; i++ ) {
105+
if (NULL == request->data.release_arrays[i]) {
106+
break;
107+
}
108+
}
109+
110+
if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
111+
request->data.release_arrays[i] = array_ptr;
112+
++i;
113+
if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
114+
request->data.release_arrays[i] = NULL;
115+
}
116+
} else {
117+
ret = OMPI_ERR_OUT_OF_RESOURCE;
118+
}
119+
120+
assert(OMPI_SUCCESS == ret);
121+
return ret;
122+
}
123+
98124
typedef struct ompi_coll_base_nbc_request_t ompi_coll_base_nbc_request_t;
99125

100126
/*
@@ -188,6 +214,13 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *request,
188214
ompi_datatype_t * const rtypes[],
189215
bool use_topo);
190216

217+
/**
218+
* If necessary, set callback to free extra memory regions
219+
* set in release_arrays. Not set if a callback is already
220+
* associated with the request.
221+
*/
222+
int ompi_coll_base_run_release_arrays_cb(ompi_request_t *request);
223+
191224
/* File reading function */
192225
int ompi_coll_base_file_getnext_long(FILE *fptr, int *fileline, long* val);
193226
int ompi_coll_base_file_getnext_size_t(FILE *fptr, int *fileline, size_t* val);

ompi/mpi/fortran/mpif-h/allgatherv_init_f.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
7777
MPI_Datatype c_sendtype, c_recvtype;
7878
MPI_Request c_request;
7979
MPI_Info c_info;
80-
int size, idx = 0, ierr_c;
80+
int size, ierr_c;
8181
OMPI_ARRAY_NAME_DECL(recvcounts);
8282
OMPI_ARRAY_NAME_DECL(displs);
8383

@@ -105,12 +105,11 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
105105
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(ierr_c);
106106
if (MPI_SUCCESS == ierr_c) {
107107
*request = PMPI_Request_c2f(c_request);
108-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
109-
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
110-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
111-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
108+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
109+
ompi_coll_base_append_array_to_release(c_request,OMPI_ARRAY_NAME_CONVERT(recvcounts));
110+
ompi_coll_base_append_array_to_release(c_request,OMPI_ARRAY_NAME_CONVERT(displs));
111+
ompi_coll_base_run_release_arrays_cb(c_request);
112112
}
113-
nb_request->data.release_arrays[idx] = NULL;
114113
} else {
115114
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
116115
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);

ompi/mpi/fortran/mpif-h/alltoallv_init_f.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
7777
MPI_Datatype c_sendtype, c_recvtype;
7878
MPI_Info c_info;
7979
MPI_Request c_request;
80-
int size, idx = 0, c_ierr;
80+
int size, c_ierr;
8181
OMPI_ARRAY_NAME_DECL(sendcounts);
8282
OMPI_ARRAY_NAME_DECL(sdispls);
8383
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -109,14 +109,13 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
109109
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
110110
if (MPI_SUCCESS == c_ierr) {
111111
*request = PMPI_Request_c2f(c_request);
112-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
113-
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
114-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
115-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
116-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
117-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
112+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
113+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
114+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
115+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
116+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
117+
ompi_coll_base_run_release_arrays_cb(c_request);
118118
}
119-
nb_request->data.release_arrays[idx] = NULL;
120119
} else {
121120
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
122121
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);

ompi/mpi/fortran/mpif-h/alltoallw_init_f.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
7878
MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
7979
MPI_Info c_info;
8080
MPI_Request c_request;
81-
int size, idx = 0, c_ierr;
81+
int size, c_ierr;
8282
OMPI_ARRAY_NAME_DECL(sendcounts);
8383
OMPI_ARRAY_NAME_DECL(sdispls);
8484
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -119,20 +119,18 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
119119
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
120120
if (MPI_SUCCESS == c_ierr) {
121121
*request = PMPI_Request_c2f(c_request);
122-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
123-
nb_request->data.release_arrays[idx++] = c_recvtypes;
124-
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
125-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
126-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
122+
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
123+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
124+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
125+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
127126
}
128127
if (NULL != c_sendtypes) {
129-
nb_request->data.release_arrays[idx++] = c_sendtypes;
130-
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
131-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
132-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
128+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
129+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
130+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
133131
}
134132
}
135-
nb_request->data.release_arrays[idx] = NULL;
133+
ompi_coll_base_run_release_arrays_cb(c_request);
136134
} else {
137135
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
138136
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);

ompi/mpi/fortran/mpif-h/gatherv_init_f.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
7777
MPI_Datatype c_sendtype, c_recvtype;
7878
MPI_Info c_info;
7979
MPI_Request c_request;
80-
int size, idx = 0, c_ierr;
80+
int size, c_ierr;
8181
OMPI_ARRAY_NAME_DECL(recvcounts);
8282
OMPI_ARRAY_NAME_DECL(displs);
8383

@@ -104,12 +104,11 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
104104
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
105105
if (MPI_SUCCESS == c_ierr) {
106106
*request = PMPI_Request_c2f(c_request);
107-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
108-
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
109-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
110-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
107+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
108+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
109+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
110+
ompi_coll_base_run_release_arrays_cb(c_request);
111111
}
112-
nb_request->data.release_arrays[idx] = NULL;
113112
} else {
114113
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
115114
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);

ompi/mpi/fortran/mpif-h/iallgatherv_f.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
7676
MPI_Comm c_comm;
7777
MPI_Datatype c_sendtype, c_recvtype;
7878
MPI_Request c_request;
79-
int size, idx = 0, ierr_c;
79+
int size, ierr_c;
8080
OMPI_ARRAY_NAME_DECL(recvcounts);
8181
OMPI_ARRAY_NAME_DECL(displs);
8282

@@ -107,11 +107,10 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
107107
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
108108
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
109109
} else {
110-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
111-
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
112-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
113-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
110+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
111+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
112+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
113+
ompi_coll_base_run_release_arrays_cb(c_request);
114114
}
115-
nb_request->data.release_arrays[idx] = NULL;
116115
}
117116
}

ompi/mpi/fortran/mpif-h/ialltoallv_f.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,12 @@ void ompi_ialltoallv_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispls,
113113
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
114114
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
115115
} else {
116-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
117-
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
118-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
119-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
120-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
121-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
116+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
117+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
118+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
119+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
120+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
121+
ompi_coll_base_run_release_arrays_cb(c_request);
122122
}
123-
nb_request->data.release_arrays[idx] = NULL;
124123
}
125124
}

ompi/mpi/fortran/mpif-h/ialltoallw_f.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,16 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
129129
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
130130
} else {
131131
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
132-
if (sendcounts != OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
133-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sendcounts);
134-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
132+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
133+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
134+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
135135
}
136-
if (sdispls != OMPI_ARRAY_NAME_CONVERT(sdispls)) {
137-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(sdispls);
138-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(rdispls);
136+
if ((void *)sdispls != (void *)OMPI_ARRAY_NAME_CONVERT(sdispls)) {
137+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
138+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
139139
}
140-
nb_request->data.release_arrays[idx++] = c_recvtypes;
141-
nb_request->data.release_arrays[idx++] = c_sendtypes;
142-
nb_request->data.release_arrays[idx] = NULL;
140+
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
141+
ompi_coll_base_append_array_to_release(c_request, c_sendtypes);
142+
ompi_coll_base_run_release_arrays_cb(c_request);
143143
}
144144
}

ompi/mpi/fortran/mpif-h/igatherv_f.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void ompi_igatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
7676
MPI_Comm c_comm;
7777
MPI_Datatype c_sendtype, c_recvtype;
7878
MPI_Request c_request;
79-
int size, idx = 0, c_ierr;
79+
int size, c_ierr;
8080
OMPI_ARRAY_NAME_DECL(recvcounts);
8181
OMPI_ARRAY_NAME_DECL(displs);
8282

@@ -106,11 +106,10 @@ void ompi_igatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
106106
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
107107
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
108108
} else {
109-
ompi_coll_base_nbc_request_t* nb_request = (ompi_coll_base_nbc_request_t*)c_request;
110-
if (recvcounts != OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
111-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(recvcounts);
112-
nb_request->data.release_arrays[idx++] = OMPI_ARRAY_NAME_CONVERT(displs);
109+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
110+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
111+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
112+
ompi_coll_base_run_release_arrays_cb(c_request);
113113
}
114-
nb_request->data.release_arrays[idx] = NULL;
115114
}
116115
}

0 commit comments

Comments
 (0)