22 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
33 * University Research and Technology
44 * 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
66 * of Tennessee Research Foundation. All rights
77 * reserved.
88 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -127,14 +127,29 @@ int ompi_rounddown(int num, int factor)
127127 return num * factor ; /* floor(num / factor) * factor */
128128}
129129
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 ;
134142 }
135- if (NULL != request -> data .objs .objs [1 ]) {
136- OBJ_RELEASE (request -> data .objs .objs [1 ]);
137- request -> data .objs .objs [1 ] = NULL ;
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 ;
146+ }
147+ for (int i = 0 ; i < OMPI_REQ_NB_RELEASE_ARRAYS ; i ++ ) {
148+ if (NULL == request -> data .release_arrays [i ]) {
149+ break ;
150+ }
151+ free (request -> data .release_arrays [i ]);
152+ request -> data .release_arrays [i ] = NULL ;
138153 }
139154}
140155
@@ -168,12 +183,12 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
168183 }
169184 if (!ompi_op_is_intrinsic (op )) {
170185 OBJ_RETAIN (op );
171- request -> data .op .op = op ;
186+ request -> data .refcounted . op .op = op ;
172187 retain = true;
173188 }
174189 if (!ompi_datatype_is_predefined (type )) {
175190 OBJ_RETAIN (type );
176- request -> data .op .datatype = type ;
191+ request -> data .refcounted . op .datatype = type ;
177192 retain = true;
178193 }
179194 if (OPAL_UNLIKELY (retain )) {
@@ -207,12 +222,12 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
207222 }
208223 if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
209224 OBJ_RETAIN (stype );
210- request -> data .types .stype = stype ;
225+ request -> data .refcounted . types .stype = stype ;
211226 retain = true;
212227 }
213228 if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
214229 OBJ_RETAIN (rtype );
215- request -> data .types .rtype = rtype ;
230+ request -> data .refcounted . types .rtype = rtype ;
216231 retain = true;
217232 }
218233 if (OPAL_UNLIKELY (retain )) {
@@ -237,21 +252,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
237252 } else {
238253 scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
239254 }
240- if (NULL != request -> data .vecs .stypes ) {
255+ if (NULL != request -> data .refcounted . vecs .stypes ) {
241256 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 ]);
257+ if (NULL != request -> data .refcounted . vecs .stypes [i ]) {
258+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .stypes [i ]);
244259 }
245260 }
246- request -> data .vecs .stypes = NULL ;
261+ request -> data .refcounted . vecs .stypes = NULL ;
247262 }
248- if (NULL != request -> data .vecs .rtypes ) {
263+ if (NULL != request -> data .refcounted . vecs .rtypes ) {
249264 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 ]);
265+ if (NULL != request -> data .refcounted . vecs .rtypes [i ]) {
266+ OMPI_DATATYPE_RELEASE_NO_NULLIFY (request -> data .refcounted . vecs .rtypes [i ]);
252267 }
253268 }
254- request -> data .vecs .rtypes = NULL ;
269+ request -> data .refcounted . vecs .rtypes = NULL ;
255270 }
256271}
257272
@@ -304,8 +319,8 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
304319 }
305320 }
306321 if (OPAL_UNLIKELY (retain )) {
307- request -> data .vecs .stypes = (ompi_datatype_t * * ) stypes ;
308- request -> data .vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
322+ request -> data .refcounted . vecs .stypes = (ompi_datatype_t * * ) stypes ;
323+ request -> data .refcounted . vecs .rtypes = (ompi_datatype_t * * ) rtypes ;
309324 if (req -> req_persistent ) {
310325 request -> cb .req_free = req -> req_free ;
311326 req -> req_free = free_vecs_callback ;
@@ -319,15 +334,16 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
319334 return OMPI_SUCCESS ;
320335}
321336
322- static void nbc_req_cons (ompi_coll_base_nbc_request_t * req )
337+ static void nbc_req_constructor (ompi_coll_base_nbc_request_t * req )
323338{
324339 req -> cb .req_complete_cb = NULL ;
325340 req -> req_complete_cb_data = NULL ;
326- req -> data .objs .objs [0 ] = NULL ;
327- req -> data .objs .objs [1 ] = NULL ;
341+ req -> data .refcounted .objs .objs [0 ] = NULL ;
342+ req -> data .refcounted .objs .objs [1 ] = NULL ;
343+ req -> data .release_arrays [0 ] = NULL ;
328344}
329345
330- OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_cons , NULL );
346+ OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_constructor , NULL );
331347
332348/* File reading functions */
333349static void skiptonewline (FILE * fptr , int * fileline )
0 commit comments