29
29
#include "ompi/mca/pml/pml.h"
30
30
#include "coll_base_util.h"
31
31
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
-
53
32
int ompi_coll_base_sendrecv_actual ( const void * sendbuf , size_t scount ,
54
33
ompi_datatype_t * sdatatype ,
55
34
int dest , int stag ,
@@ -126,111 +105,112 @@ int ompi_rounddown(int num, int factor)
126
105
}
127
106
128
107
static 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 ;
130
109
int rc = OMPI_SUCCESS ;
131
110
assert (NULL != p );
132
111
if (NULL != p -> req_complete_cb ) {
133
112
request -> req_complete_cb = p -> req_complete_cb ;
134
113
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 );
136
115
}
137
116
if (NULL != p -> op ) {
138
117
OBJ_RELEASE (p -> op );
139
118
}
140
119
if (NULL != p -> datatype ) {
141
120
OBJ_RELEASE (p -> datatype );
142
121
}
143
- free (p );
144
122
return rc ;
145
123
}
146
124
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 ,
148
126
ompi_datatype_t * type ) {
127
+ ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
149
128
bool retain = !ompi_op_is_intrinsic (op );
150
129
retain |= !ompi_datatype_is_predefined (type );
151
130
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
- }
156
131
if (!ompi_op_is_intrinsic (op )) {
157
132
OBJ_RETAIN (op );
158
- p -> op = op ;
133
+ request -> op = op ;
134
+ } else {
135
+ request -> op = NULL ;
159
136
}
160
137
if (!ompi_datatype_is_predefined (type )) {
161
138
OBJ_RETAIN (type );
162
- p -> datatype = type ;
139
+ request -> datatype = type ;
140
+ } else {
141
+ request -> datatype = NULL ;
163
142
}
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 ;
168
147
}
169
148
return OMPI_SUCCESS ;
170
149
}
171
150
172
151
static 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 ;
174
153
int rc = OMPI_SUCCESS ;
175
154
assert (NULL != p );
176
155
if (NULL != p -> req_complete_cb ) {
177
156
request -> req_complete_cb = p -> req_complete_cb ;
178
157
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 );
180
159
}
181
160
if (NULL != p -> stype ) {
182
161
OBJ_RELEASE (p -> stype );
183
162
}
184
163
if (NULL != p -> rtype ) {
185
164
OBJ_RELEASE (p -> rtype );
186
165
}
187
- free (p );
188
166
return rc ;
189
167
}
190
168
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 ,
192
170
ompi_datatype_t * rtype ) {
171
+ ompi_coll_base_nbc_request_t * request = (ompi_coll_base_nbc_request_t * )req ;
193
172
bool retain = NULL != stype && !ompi_datatype_is_predefined (stype );
194
173
retain |= NULL != rtype && !ompi_datatype_is_predefined (rtype );
195
174
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
- }
200
175
if (NULL != stype && !ompi_datatype_is_predefined (stype )) {
201
176
OBJ_RETAIN (stype );
202
- p -> stype = stype ;
177
+ request -> stype = stype ;
178
+ } else {
179
+ request -> stype = NULL ;
203
180
}
204
181
if (NULL != rtype && !ompi_datatype_is_predefined (rtype )) {
205
182
OBJ_RETAIN (rtype );
206
- p -> rtype = rtype ;
183
+ request -> rtype = rtype ;
184
+ } else {
185
+ request -> rtype = NULL ;
207
186
}
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 ;
212
191
}
213
192
return OMPI_SUCCESS ;
214
193
}
215
194
216
195
static 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 ;
218
197
int rc = OMPI_SUCCESS ;
219
198
assert (NULL != p );
220
- if (NULL != p -> req_complete_cb ) {
199
+ if (NULL != request -> req_complete_cb ) {
221
200
request -> req_complete_cb = p -> req_complete_cb ;
222
201
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 );
224
203
}
225
204
for (int i = 0 ; i < p -> count ; i ++ ) {
226
205
OBJ_RELEASE (p -> types [i ]);
227
206
}
228
- free (p );
207
+ free (p -> types );
229
208
return rc ;
230
209
}
231
210
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 ,
233
212
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 ;
234
214
int datatypes = 0 ;
235
215
for (int i = 0 ; i < count ; i ++ ) {
236
216
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,
241
221
}
242
222
}
243
223
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 )) {
246
226
return OMPI_ERR_OUT_OF_RESOURCE ;
247
227
}
248
228
datatypes = 0 ;
249
229
for (int i = 0 ; i < count ; i ++ ) {
250
230
if (NULL != stypes [i ] && !ompi_datatype_is_predefined (stypes [i ])) {
251
- p -> types [datatypes ++ ] = stypes [i ];
231
+ request -> types [datatypes ++ ] = stypes [i ];
252
232
OBJ_RETAIN (stypes [i ]);
253
233
}
254
234
if (NULL != rtypes [i ] && !ompi_datatype_is_predefined (rtypes [i ])) {
255
- p -> types [datatypes ++ ] = rtypes [i ];
235
+ request -> types [datatypes ++ ] = rtypes [i ];
256
236
OBJ_RETAIN (rtypes [i ]);
257
237
}
258
238
}
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 ;
263
243
}
264
244
return OMPI_SUCCESS ;
265
245
}
0 commit comments