2
2
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3
3
* University Research and Technology
4
4
* Corporation. All rights reserved.
5
- * Copyright (c) 2004-2020 The University of Tennessee and The University
5
+ * Copyright (c) 2004-2021 The University of Tennessee and The University
6
6
* of Tennessee Research Foundation. All rights
7
7
* reserved.
8
8
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -127,14 +127,28 @@ int ompi_rounddown(int num, int factor)
127
127
return num * factor ; /* floor(num / factor) * factor */
128
128
}
129
129
130
- 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 ;
130
+ /**
131
+ * Release all objects and arrays stored into the nbc_request.
132
+ * The release_arrays are temporary memory to stored the values
133
+ * converted from Fortran, and should dissapear in same time as the
134
+ * request itself.
135
+ */
136
+ static void
137
+ release_objs_callback (struct ompi_coll_base_nbc_request_t * request )
138
+ {
139
+ if (NULL != request -> data .refcounted .objs .objs [0 ]) {
140
+ OBJ_RELEASE (request -> data .refcounted .objs .objs [0 ]);
141
+ request -> data .refcounted .objs .objs [0 ] = NULL ;
142
+ }
143
+ if (NULL != request -> data .refcounted .objs .objs [1 ]) {
144
+ OBJ_RELEASE (request -> data .refcounted .objs .objs [1 ]);
145
+ request -> data .refcounted .objs .objs [1 ] = NULL ;
134
146
}
135
- if (NULL != request -> data .objs .objs [1 ]) {
136
- OBJ_RELEASE (request -> data .objs .objs [1 ]);
137
- request -> data .objs .objs [1 ] = NULL ;
147
+ for (int i = 0 ; i < OMPI_REQ_NB_RELEASE_ARRAYS ; i ++ ) {
148
+ if ( NULL == request -> data .release_arrays [i ] )
149
+ break ;
150
+ free (request -> data .release_arrays [i ]);
151
+ request -> data .release_arrays [i ] = NULL ;
138
152
}
139
153
}
140
154
@@ -168,12 +182,12 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
168
182
}
169
183
if (!ompi_op_is_intrinsic (op )) {
170
184
OBJ_RETAIN (op );
171
- request -> data .op .op = op ;
185
+ request -> data .refcounted . op .op = op ;
172
186
retain = true;
173
187
}
174
188
if (!ompi_datatype_is_predefined (type )) {
175
189
OBJ_RETAIN (type );
176
- request -> data .op .datatype = type ;
190
+ request -> data .refcounted . op .datatype = type ;
177
191
retain = true;
178
192
}
179
193
if (OPAL_UNLIKELY (retain )) {
@@ -207,12 +221,12 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
207
221
}
208
222
if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
209
223
OBJ_RETAIN (stype );
210
- request -> data .types .stype = stype ;
224
+ request -> data .refcounted . types .stype = stype ;
211
225
retain = true;
212
226
}
213
227
if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
214
228
OBJ_RETAIN (rtype );
215
- request -> data .types .rtype = rtype ;
229
+ request -> data .refcounted . types .rtype = rtype ;
216
230
retain = true;
217
231
}
218
232
if (OPAL_UNLIKELY (retain )) {
@@ -237,21 +251,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
237
251
} else {
238
252
scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
239
253
}
240
- if (NULL != request -> data .vecs .stypes ) {
254
+ if (NULL != request -> data .refcounted . vecs .stypes ) {
241
255
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 ]);
256
+ if (NULL != request -> data .refcounted . vecs .stypes [i ]) {
257
+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .stypes [i ]);
244
258
}
245
259
}
246
- request -> data .vecs .stypes = NULL ;
260
+ request -> data .refcounted . vecs .stypes = NULL ;
247
261
}
248
- if (NULL != request -> data .vecs .rtypes ) {
262
+ if (NULL != request -> data .refcounted . vecs .rtypes ) {
249
263
for (int i = 0 ; i < rcount ; i ++ ) {
250
- if (NULL != request -> data .vecs .rtypes [i ]) {
251
- OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .vecs .rtypes [i ]);
264
+ if (NULL != request -> data .refcounted . vecs .rtypes [i ]) {
265
+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .rtypes [i ]);
252
266
}
253
267
}
254
- request -> data .vecs .rtypes = NULL ;
268
+ request -> data .refcounted . vecs .rtypes = NULL ;
255
269
}
256
270
}
257
271
@@ -304,8 +318,8 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
304
318
}
305
319
}
306
320
if (OPAL_UNLIKELY (retain )) {
307
- request -> data .vecs .stypes = (ompi_datatype_t * * ) stypes ;
308
- request -> data .vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
321
+ request -> data .refcounted . vecs .stypes = (ompi_datatype_t * * ) stypes ;
322
+ request -> data .refcounted . vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
309
323
if (req -> req_persistent ) {
310
324
request -> cb .req_free = req -> req_free ;
311
325
req -> req_free = free_vecs_callback ;
@@ -319,15 +333,16 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
319
333
return OMPI_SUCCESS ;
320
334
}
321
335
322
- static void nbc_req_cons (ompi_coll_base_nbc_request_t * req )
336
+ static void nbc_req_constructor (ompi_coll_base_nbc_request_t * req )
323
337
{
324
338
req -> cb .req_complete_cb = NULL ;
325
339
req -> req_complete_cb_data = NULL ;
326
- req -> data .objs .objs [0 ] = NULL ;
327
- req -> data .objs .objs [1 ] = NULL ;
340
+ req -> data .refcounted .objs .objs [0 ] = NULL ;
341
+ req -> data .refcounted .objs .objs [1 ] = NULL ;
342
+ req -> data .release_arrays [0 ] = NULL ;
328
343
}
329
344
330
- OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_cons , NULL );
345
+ OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_constructor , NULL );
331
346
332
347
/* File reading functions */
333
348
static void skiptonewline (FILE * fptr , int * fileline )
0 commit comments