@@ -127,15 +127,37 @@ int ompi_rounddown(int num, int factor)
127
127
return num * factor ; /* floor(num / factor) * factor */
128
128
}
129
129
130
+ static inline
131
+ release_other_arrays (struct ompi_coll_base_nbc_request_t * request )
132
+ {
133
+ if ( OMPI_REQ_NB_RELEASE_DISPLS ) {
134
+ assert (NULL != request -> data .sdispls );
135
+ free (request -> data .sdispls );
136
+ request -> data .sdispls = NULL ;
137
+ assert (NULL != request -> data .rdispls );
138
+ free (request -> data .rdispls );
139
+ request -> data .rdispls = NULL ;
140
+ }
141
+ if ( OMPI_REQ_NB_RELEASE_COUNTS ) {
142
+ assert (NULL != request -> data .scounts );
143
+ free (request -> data .scounts );
144
+ request -> data .scounts = NULL ;
145
+ assert (NULL != request -> data .rcounts );
146
+ free (request -> data .rcounts );
147
+ request -> data .rcounts = NULL ;
148
+ }
149
+ }
150
+
130
151
static void release_objs_callback (struct ompi_coll_base_nbc_request_t * request ) {
131
- if (NULL != request -> data .objs .objs [0 ]) {
132
- OBJ_RELEASE (request -> data .objs .objs [0 ]);
133
- request -> data .objs .objs [0 ] = NULL ;
152
+ if (NULL != request -> data .refcounted . objs .objs [0 ]) {
153
+ OBJ_RELEASE (request -> data .refcounted . objs .objs [0 ]);
154
+ request -> data .refcounted . objs .objs [0 ] = NULL ;
134
155
}
135
- if (NULL != request -> data .objs .objs [1 ]) {
136
- OBJ_RELEASE (request -> data .objs .objs [1 ]);
137
- request -> data .objs .objs [1 ] = NULL ;
156
+ if (NULL != request -> data .refcounted . objs .objs [1 ]) {
157
+ OBJ_RELEASE (request -> data .refcounted . objs .objs [1 ]);
158
+ request -> data .refcounted . objs .objs [1 ] = NULL ;
138
159
}
160
+ release_other_arrays (request );
139
161
}
140
162
141
163
static int complete_objs_callback (struct ompi_request_t * req ) {
@@ -168,12 +190,12 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
168
190
}
169
191
if (!ompi_op_is_intrinsic (op )) {
170
192
OBJ_RETAIN (op );
171
- request -> data .op .op = op ;
193
+ request -> data .refcounted . op .op = op ;
172
194
retain = true;
173
195
}
174
196
if (!ompi_datatype_is_predefined (type )) {
175
197
OBJ_RETAIN (type );
176
- request -> data .op .datatype = type ;
198
+ request -> data .refcounted . op .datatype = type ;
177
199
retain = true;
178
200
}
179
201
if (OPAL_UNLIKELY (retain )) {
@@ -207,12 +229,12 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
207
229
}
208
230
if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
209
231
OBJ_RETAIN (stype );
210
- request -> data .types .stype = stype ;
232
+ request -> data .refcounted . types .stype = stype ;
211
233
retain = true;
212
234
}
213
235
if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
214
236
OBJ_RETAIN (rtype );
215
- request -> data .types .rtype = rtype ;
237
+ request -> data .refcounted . types .rtype = rtype ;
216
238
retain = true;
217
239
}
218
240
if (OPAL_UNLIKELY (retain )) {
@@ -237,27 +259,27 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
237
259
} else {
238
260
scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
239
261
}
240
- if (NULL != request -> data .vecs .stypes ) {
262
+ if (NULL != request -> data .refcounted . vecs .stypes ) {
241
263
for (int i = 0 ; i < scount ; i ++ ) {
242
- if (NULL != request -> data .vecs .stypes [i ]) {
243
- OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .vecs .stypes [i ]);
264
+ if (NULL != request -> data .refcounted . vecs .stypes [i ]) {
265
+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .stypes [i ]);
244
266
}
245
267
}
246
- if ( request -> super .req_flags & OMPI_REQ_NB_RELEASE_DATA ) {
247
- free ((void * )request -> data .vecs .stypes );
268
+ if ( request -> super .req_flags & OMPI_REQ_NB_RELEASE_DATATYPES ) {
269
+ free ((void * )request -> data .refcounted . vecs .stypes );
248
270
}
249
- request -> data .vecs .stypes = NULL ;
271
+ request -> data .refcounted . vecs .stypes = NULL ;
250
272
}
251
- if (NULL != request -> data .vecs .rtypes ) {
273
+ if (NULL != request -> data .refcounted . vecs .rtypes ) {
252
274
for (int i = 0 ; i < rcount ; i ++ ) {
253
- if (NULL != request -> data .vecs .rtypes [i ]) {
254
- OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .vecs .rtypes [i ]);
275
+ if (NULL != request -> data .refcounted . vecs .rtypes [i ]) {
276
+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .rtypes [i ]);
255
277
}
256
278
}
257
- if ( request -> super .req_flags & OMPI_REQ_NB_RELEASE_DATA ) {
258
- free ((void * )request -> data .vecs .rtypes );
279
+ if ( request -> super .req_flags & OMPI_REQ_NB_RELEASE_DATATYPES ) {
280
+ free ((void * )request -> data .refcounted . vecs .rtypes );
259
281
}
260
- request -> data .vecs .rtypes = NULL ;
282
+ request -> data .refcounted . vecs .rtypes = NULL ;
261
283
}
262
284
}
263
285
@@ -310,8 +332,8 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
310
332
}
311
333
}
312
334
if (OPAL_UNLIKELY (retain )) {
313
- request -> data .vecs .stypes = (ompi_datatype_t * * ) stypes ;
314
- request -> data .vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
335
+ request -> data .refcounted . vecs .stypes = (ompi_datatype_t * * ) stypes ;
336
+ request -> data .refcounted . vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
315
337
if (OMPI_REQ_IS_PERSISTENT (req )) {
316
338
request -> cb .req_free = req -> req_free ;
317
339
req -> req_free = free_vecs_callback ;
@@ -329,8 +351,8 @@ static void nbc_req_cons(ompi_coll_base_nbc_request_t *req)
329
351
{
330
352
req -> cb .req_complete_cb = NULL ;
331
353
req -> req_complete_cb_data = NULL ;
332
- req -> data .objs .objs [0 ] = NULL ;
333
- req -> data .objs .objs [1 ] = NULL ;
354
+ req -> data .refcounted . objs .objs [0 ] = NULL ;
355
+ req -> data .refcounted . objs .objs [1 ] = NULL ;
334
356
}
335
357
336
358
OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_cons , NULL );
0 commit comments