@@ -108,9 +108,11 @@ int ompi_rounddown(int num, int factor)
108
108
static void release_objs_callback (struct ompi_coll_base_nbc_request_t * request ) {
109
109
if (NULL != request -> data .objs .objs [0 ]) {
110
110
OBJ_RELEASE (request -> data .objs .objs [0 ]);
111
+ request -> data .objs .objs [0 ] = NULL ;
111
112
}
112
113
if (NULL != request -> data .objs .objs [1 ]) {
113
114
OBJ_RELEASE (request -> data .objs .objs [1 ]);
115
+ request -> data .objs .objs [1 ] = NULL ;
114
116
}
115
117
}
116
118
@@ -139,6 +141,9 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
139
141
ompi_datatype_t * type ) {
140
142
ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
141
143
bool retain = false;
144
+ if (REQUEST_COMPLETE (req )) {
145
+ return OMPI_SUCCESS ;
146
+ }
142
147
if (!ompi_op_is_intrinsic (op )) {
143
148
OBJ_RETAIN (op );
144
149
request -> data .op .op = op ;
@@ -175,6 +180,9 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
175
180
ompi_datatype_t * rtype ) {
176
181
ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
177
182
bool retain = false;
183
+ if (REQUEST_COMPLETE (req )) {
184
+ return OMPI_SUCCESS ;
185
+ }
178
186
if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
179
187
OBJ_RETAIN (stype );
180
188
request -> data .types .stype = stype ;
@@ -207,15 +215,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
207
215
} else {
208
216
scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
209
217
}
210
- for (int i = 0 ; i < scount ; i ++ ) {
211
- if (NULL != request -> data .vecs .stypes && NULL != request -> data .vecs .stypes [i ]) {
212
- OMPI_DATATYPE_RELEASE (request -> data .vecs .stypes [i ]);
218
+ if (NULL != request -> data .vecs .stypes ) {
219
+ for (int i = 0 ; i < scount ; i ++ ) {
220
+ if (NULL != request -> data .vecs .stypes [i ]) {
221
+ OMPI_DATATYPE_RELEASE (request -> data .vecs .stypes [i ]);
222
+ }
213
223
}
224
+ request -> data .vecs .stypes = NULL ;
214
225
}
215
- for (int i = 0 ; i < rcount ; i ++ ) {
216
- if (NULL != request -> data .vecs .rtypes && NULL != request -> data .vecs .rtypes [i ]) {
217
- OMPI_DATATYPE_RELEASE (request -> data .vecs .rtypes [i ]);
226
+ if (NULL != request -> data .vecs .rtypes ) {
227
+ for (int i = 0 ; i < rcount ; i ++ ) {
228
+ if (NULL != request -> data .vecs .rtypes [i ]) {
229
+ OMPI_DATATYPE_RELEASE (request -> data .vecs .rtypes [i ]);
230
+ }
218
231
}
232
+ request -> data .vecs .rtypes = NULL ;
219
233
}
220
234
}
221
235
@@ -246,6 +260,9 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
246
260
bool retain = false;
247
261
ompi_communicator_t * comm = request -> super .req_mpi_object .comm ;
248
262
int scount , rcount ;
263
+ if (REQUEST_COMPLETE (req )) {
264
+ return OMPI_SUCCESS ;
265
+ }
249
266
if (OMPI_COMM_IS_TOPO (comm )) {
250
267
(void )mca_topo_base_neighbor_count (comm , & rcount , & scount );
251
268
} else {
0 commit comments