Skip to content

Commit b1256df

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 or freeing of the persistent request except for instances where the 'c' interface detected certain cases for the arguments (in particular user-defined data types). 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 as well as suppressing some compiler warnings. Signed-off-by: Howard Pritchard <howardp@lanl.gov>
1 parent 800b047 commit b1256df

40 files changed

+305
-165
lines changed

ompi/mca/coll/base/coll_base_util.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
* Copyright (c) 2023 Jeffrey M. Squyres. All rights reserved.
1515
*
1616
* Copyright (c) 2024 NVIDIA CORPORATION. All rights reserved.
17+
* Copyright (c) 2025 Triad National Security, LLC. All rights
18+
* reserved.
1719
*
1820
* $COPYRIGHT$
1921
*
@@ -134,7 +136,7 @@ int ompi_rounddown(int num, int factor)
134136
/**
135137
* Release all objects and arrays stored into the nbc_request.
136138
* The release_arrays are temporary memory to stored the values
137-
* converted from Fortran, and should disappear in same time as the
139+
* converted from Fortran or elsewhere, and should disappear in same time as the
138140
* request itself.
139141
*/
140142
static void
@@ -268,6 +270,7 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request)
268270
}
269271
request->data.refcounted.vecs.rtypes = NULL;
270272
}
273+
release_objs_callback(request);
271274
}
272275

273276
static int complete_vecs_callback(struct ompi_request_t *req) {
@@ -346,6 +349,24 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
346349
return OMPI_SUCCESS;
347350
}
348351

352+
int ompi_coll_base_run_release_arrays_cb(ompi_request_t *req)
353+
{
354+
ompi_coll_base_nbc_request_t *request = (ompi_coll_base_nbc_request_t *)req;
355+
356+
assert(NULL != request);
357+
358+
if (req->req_persistent && (NULL == req->req_free)) {
359+
request->cb.req_free = req->req_free;
360+
req->req_free = free_objs_callback;
361+
} else if(NULL != req->req_complete_cb) {
362+
request->cb.req_complete_cb = req->req_complete_cb;
363+
request->req_complete_cb_data = req->req_complete_cb_data;
364+
req->req_complete_cb = complete_objs_callback;
365+
req->req_complete_cb_data = request;
366+
}
367+
return OMPI_SUCCESS;
368+
}
369+
349370
static void nbc_req_constructor(ompi_coll_base_nbc_request_t *req)
350371
{
351372
req->cb.req_complete_cb = NULL;

ompi/mca/coll/base/coll_base_util.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2014-2020 Research Organization for Information Science
1313
* and Technology (RIST). All rights reserved.
1414
* Copyright (c) 2024 NVIDIA CORPORATION. All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -95,6 +97,43 @@ ompi_coll_base_nbc_reserve_tags(ompi_communicator_t* comm, int32_t reserve)
9597
return tag;
9698
}
9799

100+
/**
101+
* Append an array to a request object to be freed upon completion
102+
* of the associated operation.
103+
* The request object must be of type ompi_coll_base_nbc_request_t.
104+
*/
105+
static inline int
106+
ompi_coll_base_append_array_to_release(struct ompi_request_t *req, void *array_ptr)
107+
{
108+
int i, ret = OMPI_SUCCESS;
109+
struct ompi_coll_base_nbc_request_t *request = (struct ompi_coll_base_nbc_request_t *)req;
110+
111+
/*
112+
* important sanity check - doing steps below on a non-libnbc request can lead
113+
* to nasty difficult to debug memory corruption problems
114+
*/
115+
assert(request->super.req_type == OMPI_REQUEST_COLL);
116+
117+
for(i = 0; i < OMPI_REQ_NB_RELEASE_ARRAYS; i++ ) {
118+
if (NULL == request->data.release_arrays[i]) {
119+
break;
120+
}
121+
}
122+
123+
if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
124+
request->data.release_arrays[i] = array_ptr;
125+
++i;
126+
if (OMPI_REQ_NB_RELEASE_ARRAYS > i) {
127+
request->data.release_arrays[i] = NULL;
128+
}
129+
} else {
130+
ret = OMPI_ERR_OUT_OF_RESOURCE;
131+
}
132+
133+
assert(OMPI_SUCCESS == ret);
134+
return ret;
135+
}
136+
98137
typedef struct ompi_coll_base_nbc_request_t ompi_coll_base_nbc_request_t;
99138

100139
/*
@@ -188,6 +227,13 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *request,
188227
ompi_datatype_t * const rtypes[],
189228
bool use_topo);
190229

230+
/**
231+
* If necessary, set callback to free extra memory regions
232+
* set in release_arrays. Not set if a callback is already
233+
* associated with the request.
234+
*/
235+
int ompi_coll_base_run_release_arrays_cb(ompi_request_t *request);
236+
191237
/* File reading function */
192238
int ompi_coll_base_file_getnext_long(FILE *fptr, int *fileline, long* val);
193239
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: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015-2021 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -77,7 +79,7 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
7779
MPI_Datatype c_sendtype, c_recvtype;
7880
MPI_Request c_request;
7981
MPI_Info c_info;
80-
int size, idx = 0, ierr_c;
82+
int size, ierr_c;
8183
OMPI_ARRAY_NAME_DECL(recvcounts);
8284
OMPI_ARRAY_NAME_DECL(displs);
8385

@@ -105,12 +107,11 @@ void ompi_allgatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendty
105107
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(ierr_c);
106108
if (MPI_SUCCESS == ierr_c) {
107109
*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);
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);
112114
}
113-
nb_request->data.release_arrays[idx] = NULL;
114115
} else {
115116
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
116117
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015-2021 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -77,7 +79,7 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
7779
MPI_Datatype c_sendtype, c_recvtype;
7880
MPI_Info c_info;
7981
MPI_Request c_request;
80-
int size, idx = 0, c_ierr;
82+
int size, c_ierr;
8183
OMPI_ARRAY_NAME_DECL(sendcounts);
8284
OMPI_ARRAY_NAME_DECL(sdispls);
8385
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -109,14 +111,13 @@ void ompi_alltoallv_init_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispl
109111
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
110112
if (MPI_SUCCESS == c_ierr) {
111113
*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);
114+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
115+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
116+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
117+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
118+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
119+
ompi_coll_base_run_release_arrays_cb(c_request);
118120
}
119-
nb_request->data.release_arrays[idx] = NULL;
120121
} else {
121122
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
122123
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015-2021 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -78,7 +80,7 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
7880
MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
7981
MPI_Info c_info;
8082
MPI_Request c_request;
81-
int size, idx = 0, c_ierr;
83+
int size, c_ierr;
8284
OMPI_ARRAY_NAME_DECL(sendcounts);
8385
OMPI_ARRAY_NAME_DECL(sdispls);
8486
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -119,20 +121,19 @@ void ompi_alltoallw_init_f(char *sendbuf, MPI_Fint *sendcounts,
119121
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
120122
if (MPI_SUCCESS == c_ierr) {
121123
*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);
124+
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
125+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
126+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
127+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
127128
}
128129
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);
130+
ompi_coll_base_append_array_to_release(c_request, c_sendtypes);
131+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
132+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
133+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
133134
}
134135
}
135-
nb_request->data.release_arrays[idx] = NULL;
136+
ompi_coll_base_run_release_arrays_cb(c_request);
136137
} else {
137138
OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
138139
OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015-2021 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -77,7 +79,7 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
7779
MPI_Datatype c_sendtype, c_recvtype;
7880
MPI_Info c_info;
7981
MPI_Request c_request;
80-
int size, idx = 0, c_ierr;
82+
int size, c_ierr;
8183
OMPI_ARRAY_NAME_DECL(recvcounts);
8284
OMPI_ARRAY_NAME_DECL(displs);
8385

@@ -104,12 +106,11 @@ void ompi_gatherv_init_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
104106
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
105107
if (MPI_SUCCESS == c_ierr) {
106108
*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);
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);
111113
}
112-
nb_request->data.release_arrays[idx] = NULL;
113114
} else {
114115
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
115116
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -76,7 +78,7 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
7678
MPI_Comm c_comm;
7779
MPI_Datatype c_sendtype, c_recvtype;
7880
MPI_Request c_request;
79-
int size, idx = 0, ierr_c;
81+
int size, ierr_c;
8082
OMPI_ARRAY_NAME_DECL(recvcounts);
8183
OMPI_ARRAY_NAME_DECL(displs);
8284

@@ -107,11 +109,10 @@ void ompi_iallgatherv_f(char *sendbuf, MPI_Fint *sendcount, MPI_Fint *sendtype,
107109
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
108110
OMPI_ARRAY_FINT_2_INT_CLEANUP(displs);
109111
} 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);
112+
if ((void *)recvcounts != (void *)OMPI_ARRAY_NAME_CONVERT(recvcounts)) {
113+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
114+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(displs));
115+
ompi_coll_base_run_release_arrays_cb(c_request);
114116
}
115-
nb_request->data.release_arrays[idx] = NULL;
116117
}
117118
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -76,7 +78,7 @@ void ompi_ialltoallv_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispls,
7678
MPI_Comm c_comm;
7779
MPI_Datatype c_sendtype, c_recvtype;
7880
MPI_Request c_request;
79-
int size, idx = 0, c_ierr;
81+
int size, c_ierr;
8082
OMPI_ARRAY_NAME_DECL(sendcounts);
8183
OMPI_ARRAY_NAME_DECL(sdispls);
8284
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -113,13 +115,12 @@ void ompi_ialltoallv_f(char *sendbuf, MPI_Fint *sendcounts, MPI_Fint *sdispls,
113115
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
114116
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
115117
} 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);
118+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
119+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
120+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
121+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
122+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
123+
ompi_coll_base_run_release_arrays_cb(c_request);
122124
}
123-
nb_request->data.release_arrays[idx] = NULL;
124125
}
125126
}

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
1313
* Copyright (c) 2015-2019 Research Organization for Information Science
1414
* and Technology (RIST). All rights reserved.
15+
* Copyright (c) 2025 Triad National Security, LLC. All rights
16+
* reserved.
1517
* $COPYRIGHT$
1618
*
1719
* Additional copyrights may follow
@@ -78,7 +80,7 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
7880
MPI_Comm c_comm;
7981
MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
8082
MPI_Request c_request;
81-
int size, idx = 0, c_ierr;
83+
int size, c_ierr;
8284
OMPI_ARRAY_NAME_DECL(sendcounts);
8385
OMPI_ARRAY_NAME_DECL(sdispls);
8486
OMPI_ARRAY_NAME_DECL(recvcounts);
@@ -128,17 +130,16 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
128130
OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
129131
OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
130132
} else {
131-
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);
133+
if ((void *)sendcounts != (void *)OMPI_ARRAY_NAME_CONVERT(sendcounts)) {
134+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sendcounts));
135+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(recvcounts));
135136
}
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);
137+
if ((void *)sdispls != (void *)OMPI_ARRAY_NAME_CONVERT(sdispls)) {
138+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(sdispls));
139+
ompi_coll_base_append_array_to_release(c_request, OMPI_ARRAY_NAME_CONVERT(rdispls));
139140
}
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;
141+
ompi_coll_base_append_array_to_release(c_request, c_recvtypes);
142+
ompi_coll_base_append_array_to_release(c_request, c_sendtypes);
143+
ompi_coll_base_run_release_arrays_cb(c_request);
143144
}
144145
}

0 commit comments

Comments
 (0)