2929#include "ompi/mca/pml/pml.h"
3030#include "coll_base_util.h"
3131
32- struct retain_op_data {
33- ompi_request_complete_fn_t req_complete_cb ;
34- void * req_complete_cb_data ;
35- ompi_op_t * op ;
36- ompi_datatype_t * datatype ;
37- };
38-
39- struct retain_datatypes_data {
40- ompi_request_complete_fn_t req_complete_cb ;
41- void * req_complete_cb_data ;
42- ompi_datatype_t * stype ;
43- ompi_datatype_t * rtype ;
44- };
45-
46- struct retain_datatypes_w_data {
47- ompi_request_complete_fn_t req_complete_cb ;
48- void * req_complete_cb_data ;
49- int count ;
50- ompi_datatype_t * types [];
51- };
52-
5332int ompi_coll_base_sendrecv_actual ( const void * sendbuf , size_t scount ,
5433 ompi_datatype_t * sdatatype ,
5534 int dest , int stag ,
@@ -126,111 +105,112 @@ int ompi_rounddown(int num, int factor)
126105}
127106
128107static int release_op_callback (struct ompi_request_t * request ) {
129- struct retain_op_data * p = (struct retain_op_data * )request -> req_complete_cb_data ;
108+ struct ompi_coll_base_nbc_request_t * p = (ompi_coll_base_nbc_request_t * )request ;
130109 int rc = OMPI_SUCCESS ;
131110 assert (NULL != p );
132111 if (NULL != p -> req_complete_cb ) {
133112 request -> req_complete_cb = p -> req_complete_cb ;
134113 request -> req_complete_cb_data = p -> req_complete_cb_data ;
135- rc = request -> req_complete_cb (request );
114+ rc = request -> req_complete_cb (request -> req_complete_cb_data );
136115 }
137116 if (NULL != p -> op ) {
138117 OBJ_RELEASE (p -> op );
139118 }
140119 if (NULL != p -> datatype ) {
141120 OBJ_RELEASE (p -> datatype );
142121 }
143- free (p );
144122 return rc ;
145123}
146124
147- int ompi_coll_base_retain_op ( ompi_request_t * request , ompi_op_t * op ,
125+ int ompi_coll_base_retain_op ( ompi_request_t * req , ompi_op_t * op ,
148126 ompi_datatype_t * type ) {
127+ ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
149128 bool retain = !ompi_op_is_intrinsic (op );
150129 retain |= !ompi_datatype_is_predefined (type );
151130 if (OPAL_UNLIKELY (retain )) {
152- struct retain_op_data * p = (struct retain_op_data * )calloc (1 , sizeof (struct retain_op_data ));
153- if (OPAL_UNLIKELY (NULL == p )) {
154- return OMPI_ERR_OUT_OF_RESOURCE ;
155- }
156131 if (!ompi_op_is_intrinsic (op )) {
157132 OBJ_RETAIN (op );
158- p -> op = op ;
133+ request -> op = op ;
134+ } else {
135+ request -> op = NULL ;
159136 }
160137 if (!ompi_datatype_is_predefined (type )) {
161138 OBJ_RETAIN (type );
162- p -> datatype = type ;
139+ request -> datatype = type ;
140+ } else {
141+ request -> datatype = NULL ;
163142 }
164- p -> req_complete_cb = request -> req_complete_cb ;
165- p -> req_complete_cb_data = request -> req_complete_cb_data ;
166- request -> req_complete_cb = release_op_callback ;
167- request -> req_complete_cb_data = p ;
143+ request -> req_complete_cb = request -> super . req_complete_cb ;
144+ request -> req_complete_cb_data = request -> super . req_complete_cb_data ;
145+ req -> req_complete_cb = release_op_callback ;
146+ req -> req_complete_cb_data = request ;
168147 }
169148 return OMPI_SUCCESS ;
170149}
171150
172151static int release_datatypes_callback (struct ompi_request_t * request ) {
173- struct retain_datatypes_data * p = (struct retain_datatypes_data * )request -> req_complete_cb_data ;
152+ struct ompi_coll_base_nbc_request_t * p = (ompi_coll_base_nbc_request_t * )request ;
174153 int rc = OMPI_SUCCESS ;
175154 assert (NULL != p );
176155 if (NULL != p -> req_complete_cb ) {
177156 request -> req_complete_cb = p -> req_complete_cb ;
178157 request -> req_complete_cb_data = p -> req_complete_cb_data ;
179- rc = request -> req_complete_cb (request );
158+ rc = request -> req_complete_cb (request -> req_complete_cb_data );
180159 }
181160 if (NULL != p -> stype ) {
182161 OBJ_RELEASE (p -> stype );
183162 }
184163 if (NULL != p -> rtype ) {
185164 OBJ_RELEASE (p -> rtype );
186165 }
187- free (p );
188166 return rc ;
189167}
190168
191- int ompi_coll_base_retain_datatypes ( ompi_request_t * request , ompi_datatype_t * stype ,
169+ int ompi_coll_base_retain_datatypes ( ompi_request_t * req , ompi_datatype_t * stype ,
192170 ompi_datatype_t * rtype ) {
171+ ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
193172 bool retain = NULL != stype && !ompi_datatype_is_predefined (stype );
194173 retain |= NULL != rtype && !ompi_datatype_is_predefined (rtype );
195174 if (OPAL_UNLIKELY (retain )) {
196- struct retain_datatypes_data * p = (struct retain_datatypes_data * )calloc (1 , sizeof (struct retain_datatypes_data ));
197- if (OPAL_UNLIKELY (NULL == p )) {
198- return OMPI_ERR_OUT_OF_RESOURCE ;
199- }
200175 if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
201176 OBJ_RETAIN (stype );
202- p -> stype = stype ;
177+ request -> stype = stype ;
178+ } else {
179+ request -> stype = NULL ;
203180 }
204181 if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
205182 OBJ_RETAIN (rtype );
206- p -> rtype = rtype ;
183+ request -> rtype = rtype ;
184+ } else {
185+ request -> rtype = NULL ;
207186 }
208- p -> req_complete_cb = request -> req_complete_cb ;
209- p -> req_complete_cb_data = request -> req_complete_cb_data ;
210- request -> req_complete_cb = release_datatypes_callback ;
211- request -> req_complete_cb_data = p ;
187+ request -> req_complete_cb = req -> req_complete_cb ;
188+ request -> req_complete_cb_data = req -> req_complete_cb_data ;
189+ req -> req_complete_cb = release_datatypes_callback ;
190+ req -> req_complete_cb_data = request ;
212191 }
213192 return OMPI_SUCCESS ;
214193}
215194
216195static int release_datatypes_w_callback (struct ompi_request_t * request ) {
217- struct retain_datatypes_w_data * p = (struct retain_datatypes_w_data * )request -> req_complete_cb_data ;
196+ ompi_coll_base_nbc_request_t * p = (ompi_coll_base_nbc_request_t * )request ;
218197 int rc = OMPI_SUCCESS ;
219198 assert (NULL != p );
220- if (NULL != p -> req_complete_cb ) {
199+ if (NULL != request -> req_complete_cb ) {
221200 request -> req_complete_cb = p -> req_complete_cb ;
222201 request -> req_complete_cb_data = p -> req_complete_cb_data ;
223- rc = request -> req_complete_cb (request );
202+ rc = request -> req_complete_cb (request -> req_complete_cb_data );
224203 }
225204 for (int i = 0 ; i < p -> count ; i ++ ) {
226205 OBJ_RELEASE (p -> types [i ]);
227206 }
228- free (p );
207+ free (p -> types );
229208 return rc ;
230209}
231210
232- int ompi_coll_base_retain_datatypes_w ( ompi_request_t * request , int count ,
211+ int ompi_coll_base_retain_datatypes_w ( ompi_request_t * req , int count ,
233212 ompi_datatype_t * const stypes [], ompi_datatype_t * const rtypes []) {
213+ ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
234214 int datatypes = 0 ;
235215 for (int i = 0 ; i < count ; i ++ ) {
236216 if (NULL != stypes [i ] && !ompi_datatype_is_predefined (stypes [i ])) {
@@ -241,25 +221,25 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *request, int count,
241221 }
242222 }
243223 if (OPAL_UNLIKELY (0 < datatypes )) {
244- struct retain_datatypes_w_data * p = (struct retain_datatypes_w_data * )calloc (1 , sizeof ( struct retain_datatypes_data ) + ( datatypes - 1 ) * sizeof (ompi_datatype_t * ));
245- if (OPAL_UNLIKELY (NULL == p )) {
224+ request -> types = (ompi_datatype_t * * )calloc (datatypes , sizeof (ompi_datatype_t * ));
225+ if (OPAL_UNLIKELY (NULL == request -> types )) {
246226 return OMPI_ERR_OUT_OF_RESOURCE ;
247227 }
248228 datatypes = 0 ;
249229 for (int i = 0 ; i < count ; i ++ ) {
250230 if (NULL != stypes [i ] && !ompi_datatype_is_predefined (stypes [i ])) {
251- p -> types [datatypes ++ ] = stypes [i ];
231+ request -> types [datatypes ++ ] = stypes [i ];
252232 OBJ_RETAIN (stypes [i ]);
253233 }
254234 if (NULL != rtypes [i ] && !ompi_datatype_is_predefined (rtypes [i ])) {
255- p -> types [datatypes ++ ] = rtypes [i ];
235+ request -> types [datatypes ++ ] = rtypes [i ];
256236 OBJ_RETAIN (rtypes [i ]);
257237 }
258238 }
259- p -> req_complete_cb = request -> req_complete_cb ;
260- p -> req_complete_cb_data = request -> req_complete_cb_data ;
261- request -> req_complete_cb = release_datatypes_w_callback ;
262- request -> req_complete_cb_data = p ;
239+ request -> req_complete_cb = req -> req_complete_cb ;
240+ request -> req_complete_cb_data = req -> req_complete_cb_data ;
241+ req -> req_complete_cb = release_datatypes_w_callback ;
242+ req -> req_complete_cb_data = request ;
263243 }
264244 return OMPI_SUCCESS ;
265245}
0 commit comments