@@ -127,15 +127,37 @@ int ompi_rounddown(int num, int factor)
127127 return num * factor ; /* floor(num / factor) * factor */
128128}
129129
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+
130151static 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 ;
134155 }
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 ;
138159 }
160+ release_other_arrays (request );
139161}
140162
141163static 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,
168190 }
169191 if (!ompi_op_is_intrinsic (op )) {
170192 OBJ_RETAIN (op );
171- request -> data .op .op = op ;
193+ request -> data .refcounted . op .op = op ;
172194 retain = true;
173195 }
174196 if (!ompi_datatype_is_predefined (type )) {
175197 OBJ_RETAIN (type );
176- request -> data .op .datatype = type ;
198+ request -> data .refcounted . op .datatype = type ;
177199 retain = true;
178200 }
179201 if (OPAL_UNLIKELY (retain )) {
@@ -207,12 +229,12 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
207229 }
208230 if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
209231 OBJ_RETAIN (stype );
210- request -> data .types .stype = stype ;
232+ request -> data .refcounted . types .stype = stype ;
211233 retain = true;
212234 }
213235 if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
214236 OBJ_RETAIN (rtype );
215- request -> data .types .rtype = rtype ;
237+ request -> data .refcounted . types .rtype = rtype ;
216238 retain = true;
217239 }
218240 if (OPAL_UNLIKELY (retain )) {
@@ -237,27 +259,27 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
237259 } else {
238260 scount = rcount = OMPI_COMM_IS_INTER (comm )?ompi_comm_remote_size (comm ):ompi_comm_size (comm );
239261 }
240- if (NULL != request -> data .vecs .stypes ) {
262+ if (NULL != request -> data .refcounted . vecs .stypes ) {
241263 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 ]);
244266 }
245267 }
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 );
248270 }
249- request -> data .vecs .stypes = NULL ;
271+ request -> data .refcounted . vecs .stypes = NULL ;
250272 }
251- if (NULL != request -> data .vecs .rtypes ) {
273+ if (NULL != request -> data .refcounted . vecs .rtypes ) {
252274 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 ]);
255277 }
256278 }
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 );
259281 }
260- request -> data .vecs .rtypes = NULL ;
282+ request -> data .refcounted . vecs .rtypes = NULL ;
261283 }
262284}
263285
@@ -310,8 +332,8 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
310332 }
311333 }
312334 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 ;
315337 if (OMPI_REQ_IS_PERSISTENT (req )) {
316338 request -> cb .req_free = req -> req_free ;
317339 req -> req_free = free_vecs_callback ;
@@ -329,8 +351,8 @@ static void nbc_req_cons(ompi_coll_base_nbc_request_t *req)
329351{
330352 req -> cb .req_complete_cb = NULL ;
331353 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 ;
334356}
335357
336358OBJ_CLASS_INSTANCE (ompi_coll_base_nbc_request_t , ompi_request_t , nbc_req_cons , NULL );
0 commit comments