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,28 @@ 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 ;
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 ;
134146 }
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 ;
138152 }
139153}
140154
@@ -168,12 +182,12 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
168182 }
169183 if (!ompi_op_is_intrinsic (op )) {
170184 OBJ_RETAIN (op );
171- request -> data .op .op = op ;
185+ request -> data .refcounted . op .op = op ;
172186 retain = true;
173187 }
174188 if (!ompi_datatype_is_predefined (type )) {
175189 OBJ_RETAIN (type );
176- request -> data .op .datatype = type ;
190+ request -> data .refcounted . op .datatype = type ;
177191 retain = true;
178192 }
179193 if (OPAL_UNLIKELY (retain )) {
@@ -207,12 +221,12 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
207221 }
208222 if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
209223 OBJ_RETAIN (stype );
210- request -> data .types .stype = stype ;
224+ request -> data .refcounted . types .stype = stype ;
211225 retain = true;
212226 }
213227 if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
214228 OBJ_RETAIN (rtype );
215- request -> data .types .rtype = rtype ;
229+ request -> data .refcounted . types .rtype = rtype ;
216230 retain = true;
217231 }
218232 if (OPAL_UNLIKELY (retain )) {
@@ -237,21 +251,21 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
237251 } else {
238252 scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
239253 }
240- if (NULL != request -> data .vecs .stypes ) {
254+ if (NULL != request -> data .refcounted . vecs .stypes ) {
241255 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 ]);
244258 }
245259 }
246- request -> data .vecs .stypes = NULL ;
260+ request -> data .refcounted . vecs .stypes = NULL ;
247261 }
248- if (NULL != request -> data .vecs .rtypes ) {
262+ if (NULL != request -> data .refcounted . vecs .rtypes ) {
249263 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 ]);
252266 }
253267 }
254- request -> data .vecs .rtypes = NULL ;
268+ request -> data .refcounted . vecs .rtypes = NULL ;
255269 }
256270}
257271
@@ -304,8 +318,8 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
304318 }
305319 }
306320 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 ;
309323 if (req -> req_persistent ) {
310324 request -> cb .req_free = req -> req_free ;
311325 req -> req_free = free_vecs_callback ;
@@ -319,15 +333,16 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
319333 return OMPI_SUCCESS ;
320334}
321335
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 )
323337{
324338 req -> cb .req_complete_cb = NULL ;
325339 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 ;
328343}
329344
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 );
331346
332347/* File reading functions */
333348static void skiptonewline (FILE * fptr , int * fileline )
0 commit comments