Skip to content

Commit ec98496

Browse files
committed
req_flags instead of req_persistent
Change the request base struct to contain a int flag to indicate additional features of the request. Keep the same sizeof by replacing the req_persistent. Signed-off-by: George Bosilca <[email protected]>
1 parent eba1796 commit ec98496

File tree

16 files changed

+50
-37
lines changed

16 files changed

+50
-37
lines changed

ompi/debuggers/predefined_gap_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ int main(int argc, char **argv) {
9797
GAP_CHECK("req_status", test_req, req_status, req_type, 1);
9898
GAP_CHECK("req_complete", test_req, req_complete, req_status, 1);
9999
GAP_CHECK("req_state", test_req, req_state, req_complete, 1);
100-
GAP_CHECK("req_persistent", test_req, req_persistent, req_state, 1);
101-
GAP_CHECK("req_f_to_c_index", test_req, req_f_to_c_index, req_persistent, 1);
100+
GAP_CHECK("req_flags", test_req, req_flags, req_state, 1);
101+
GAP_CHECK("req_f_to_c_index", test_req, req_f_to_c_index, req_flags, 1);
102102
GAP_CHECK("req_free", test_req, req_free, req_f_to_c_index, 1);
103103

104104
/* Test Predefined op sizes */

ompi/include/ompi/memchecker.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,9 @@ static inline int memchecker_request(MPI_Request *request)
308308
opal_memchecker_base_isdefined (&(*request)->req_status._ucount, sizeof(size_t));
309309
#endif
310310

311-
opal_memchecker_base_isdefined ((void*)&(*request)->req_complete, sizeof(volatile _Bool));
311+
opal_memchecker_base_isdefined ((void*)&(*request)->req_complete, sizeof(volatile void*));
312312
opal_memchecker_base_isdefined ((void*)&(*request)->req_state, sizeof(volatile ompi_request_state_t));
313-
opal_memchecker_base_isdefined (&(*request)->req_persistent, sizeof(_Bool));
313+
opal_memchecker_base_isdefined (&(*request)->req_flags, sizeof(int));
314314
opal_memchecker_base_isdefined (&(*request)->req_f_to_c_index, sizeof(int));
315315
opal_memchecker_base_isdefined (&(*request)->req_free, sizeof(ompi_request_free_fn_t));
316316
opal_memchecker_base_isdefined (&(*request)->req_cancel, sizeof(ompi_request_cancel_fn_t));

ompi/mca/coll/base/coll_base_util.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ int ompi_coll_base_retain_op( ompi_request_t *req, ompi_op_t *op,
185185
* the objects can only be released when the request is freed
186186
* (e.g. MPI_Request_free() completes) and we use req_free callback
187187
*/
188-
if (req->req_persistent) {
188+
if (OMPI_REQ_IS_PERSISTENT(req)) {
189189
request->cb.req_free = req->req_free;
190190
req->req_free = free_objs_callback;
191191
} else {
@@ -216,7 +216,7 @@ int ompi_coll_base_retain_datatypes( ompi_request_t *req, ompi_datatype_t *stype
216216
retain = true;
217217
}
218218
if (OPAL_UNLIKELY(retain)) {
219-
if (req->req_persistent) {
219+
if (OMPI_REQ_IS_PERSISTENT(req)) {
220220
request->cb.req_free = req->req_free;
221221
req->req_free = free_objs_callback;
222222
} else {
@@ -243,6 +243,9 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
243243
OMPI_DATATYPE_RELEASE_NO_NULLIFY(request->data.vecs.stypes[i]);
244244
}
245245
}
246+
if( request->super.req_flags & OMPI_REQ_NB_RELEASE_DATA ) {
247+
free((void*)request->data.vecs.stypes);
248+
}
246249
request->data.vecs.stypes = NULL;
247250
}
248251
if (NULL != request->data.vecs.rtypes) {
@@ -251,6 +254,9 @@ static void release_vecs_callback(ompi_coll_base_nbc_request_t *request) {
251254
OMPI_DATATYPE_RELEASE_NO_NULLIFY(request->data.vecs.rtypes[i]);
252255
}
253256
}
257+
if( request->super.req_flags & OMPI_REQ_NB_RELEASE_DATA ) {
258+
free((void*)request->data.vecs.rtypes);
259+
}
254260
request->data.vecs.rtypes = NULL;
255261
}
256262
}
@@ -306,7 +312,7 @@ int ompi_coll_base_retain_datatypes_w( ompi_request_t *req,
306312
if (OPAL_UNLIKELY(retain)) {
307313
request->data.vecs.stypes = (ompi_datatype_t **) stypes;
308314
request->data.vecs.rtypes = (ompi_datatype_t **) rtypes;
309-
if (req->req_persistent) {
315+
if (OMPI_REQ_IS_PERSISTENT(req)) {
310316
request->cb.req_free = req->req_free;
311317
req->req_free = free_vecs_callback;
312318
} else {

ompi/mca/coll/libnbc/coll_libnbc_component.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,11 +456,11 @@ ompi_coll_libnbc_progress(void)
456456
else {
457457
request->super.super.req_status.MPI_ERROR = res;
458458
}
459-
if(request->super.super.req_persistent) {
459+
if( OMPI_REQ_IS_PERSISTENT(&request->super.super) ) {
460460
/* reset for the next communication */
461461
request->row_offset = 0;
462462
}
463-
if(!request->super.super.req_persistent || !REQUEST_COMPLETE(&request->super.super)) {
463+
if(!OMPI_REQ_IS_PERSISTENT(&request->super.super) || !REQUEST_COMPLETE(&request->super.super)) {
464464
ompi_request_complete(&request->super.super, true);
465465
}
466466
completed++;

ompi/mca/coll/libnbc/nbc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ int NBC_Progress(NBC_Handle *handle) {
383383
res = handle->super.super.req_status.MPI_ERROR;
384384
NBC_Error("NBC_Progress: an error %d was found during schedule %p at row-offset %li - aborting the schedule\n", res, handle->schedule, handle->row_offset);
385385
handle->nbc_complete = true;
386-
if (!handle->super.super.req_persistent) {
386+
if (!OMPI_REQ_IS_PERSISTENT(&handle->super.super)) {
387387
NBC_Free(handle);
388388
}
389389
return res;
@@ -403,7 +403,7 @@ int NBC_Progress(NBC_Handle *handle) {
403403
NBC_DEBUG(5, "NBC_Progress last round finished - we're done\n");
404404

405405
handle->nbc_complete = true;
406-
if (!handle->super.super.req_persistent) {
406+
if (!OMPI_REQ_IS_PERSISTENT(&handle->super.super)) {
407407
NBC_Free(handle);
408408
}
409409

ompi/mca/part/persist/part_persist.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,8 @@ mca_part_persist_precv_init(void *buf,
369369

370370

371371
/* Set ompi request initial values */
372-
req->req_ompi.req_persistent = true;
373-
req->req_part_complete = true;
372+
req->req_ompi.req_flags |= OMPI_REQ_PERSISTENT;
373+
req->req_part_complete = true;
374374
req->req_ompi.req_complete = REQUEST_COMPLETED;
375375
req->req_ompi.req_state = OMPI_REQUEST_INACTIVE;
376376

@@ -456,11 +456,11 @@ mca_part_persist_psend_init(const void* buf,
456456
}
457457

458458
/* Initilaize completion variables */
459-
sendreq->req_base.req_ompi.req_persistent = true;
459+
sendreq->req_base.req_ompi.req_flags |= OMPI_REQ_PERSISTENT;
460460
req->req_part_complete = true;
461461
req->req_ompi.req_complete = REQUEST_COMPLETED;
462462
req->req_ompi.req_state = OMPI_REQUEST_INACTIVE;
463-
463+
464464
/* add element to progress queue */
465465
new_progress_elem = OBJ_NEW(mca_part_persist_list_t);
466466
new_progress_elem->item = req;

ompi/mca/part/persist/part_persist_recvreq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ mca_part_persist_precv_request_construct(mca_part_persist_precv_request_t* recvr
2929
recvreq->req_base.req_ompi.req_start = mca_part_persist_start;
3030
recvreq->req_base.req_ompi.req_free = mca_part_persist_free;
3131
recvreq->req_base.req_ompi.req_cancel = NULL;
32-
recvreq->req_base.req_ompi.req_persistent = true;
32+
recvreq->req_base.req_ompi.req_flags = OMPI_REQ_PERSISTENT;
3333
OBJ_CONSTRUCT( &(recvreq->req_base.req_convertor), opal_convertor_t );
3434
}
3535

ompi/mca/part/persist/part_persist_sendreq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static void mca_part_persist_psend_request_construct(mca_part_persist_psend_requ
2828
/* no need to reinit for every send -- never changes */
2929
sendreq->req_base.req_ompi.req_start = mca_part_persist_start;
3030
sendreq->req_base.req_ompi.req_free = mca_part_persist_free;
31-
sendreq->req_base.req_ompi.req_persistent = true;
31+
sendreq->req_base.req_ompi.req_flags = OMPI_REQ_PERSISTENT;
3232
sendreq->req_base.req_ompi.req_cancel = NULL;
3333
}
3434

ompi/mca/pml/cm/pml_cm_recvreq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ do { \
341341
MCA_PML_CM_HVY_RECV_REQUEST_RETURN( recvreq ); \
342342
} else { \
343343
/* initialize request status */ \
344-
if(recvreq->req_base.req_ompi.req_persistent) { \
344+
if(OMPI_REQ_IS_PERSISTENT(&recvreq->req_base.req_ompi)) { \
345345
/* rewind convertor */ \
346346
size_t offset = 0; \
347347
opal_convertor_set_position(&recvreq->req_base.req_convertor, &offset); \

ompi/mca/pml/cm/pml_cm_sendreq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ do {
442442
if( sendreq->req_send.req_base.req_free_called ) { \
443443
MCA_PML_CM_HVY_SEND_REQUEST_RETURN( sendreq ); \
444444
} else { \
445-
if(sendreq->req_send.req_base.req_ompi.req_persistent) { \
445+
if(OMPI_REQ_IS_PERSISTENT(&sendreq->req_send.req_base.req_ompi)) { \
446446
/* rewind convertor */ \
447447
size_t offset = 0; \
448448
opal_convertor_set_position(&sendreq->req_send.req_base.req_convertor, \

ompi/mpi/c/start.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ int MPI_Start(MPI_Request *request)
7878
case OMPI_REQUEST_PML:
7979
case OMPI_REQUEST_COLL:
8080
case OMPI_REQUEST_PART:
81-
if ( MPI_PARAM_CHECK && !(*request)->req_persistent) {
81+
if ( MPI_PARAM_CHECK && !OMPI_REQ_IS_PERSISTENT(*request)) {
8282
return OMPI_ERRHANDLER_NOHANDLE_INVOKE(MPI_ERR_REQUEST, FUNC_NAME);
8383
}
8484

ompi/mpi/c/startall.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int MPI_Startall(int count, MPI_Request requests[])
6666
} else {
6767
for (i = 0; i < count; ++i) {
6868
if (NULL == requests[i] ||
69-
! requests[i]->req_persistent ||
69+
! OMPI_REQ_IS_PERSISTENT(requests[i]) ||
7070
(OMPI_REQUEST_PML != requests[i]->req_type &&
7171
OMPI_REQUEST_COLL != requests[i]->req_type &&
7272
OMPI_REQUEST_NOOP != requests[i]->req_type)) {

ompi/request/req_test.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ int ompi_request_default_test(ompi_request_t ** rptr,
6565
*status = request->req_status;
6666
status->MPI_ERROR = old_error;
6767
}
68-
if( request->req_persistent ) {
68+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
6969
request->req_state = OMPI_REQUEST_INACTIVE;
7070
return request->req_status.MPI_ERROR;
7171
}
@@ -149,7 +149,7 @@ int ompi_request_default_test_any(
149149
status->MPI_ERROR = old_error;
150150
}
151151

152-
if( request->req_persistent ) {
152+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
153153
request->req_state = OMPI_REQUEST_INACTIVE;
154154
return OMPI_SUCCESS;
155155
}
@@ -253,7 +253,7 @@ int ompi_request_default_test_all(
253253
ompi_grequest_invoke_query(request, &request->req_status);
254254
}
255255
statuses[i] = request->req_status;
256-
if( request->req_persistent ) {
256+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
257257
request->req_state = OMPI_REQUEST_INACTIVE;
258258
continue;
259259
}
@@ -288,7 +288,7 @@ int ompi_request_default_test_all(
288288
if (OMPI_REQUEST_GEN == request->req_type) {
289289
ompi_grequest_invoke_query(request, &request->req_status);
290290
}
291-
if( request->req_persistent ) {
291+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
292292
request->req_state = OMPI_REQUEST_INACTIVE;
293293
continue;
294294
}
@@ -400,7 +400,7 @@ int ompi_request_default_test_some(
400400
#endif /* OPAL_ENABLE_FT_MPI */
401401
}
402402

403-
if( request->req_persistent ) {
403+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
404404
request->req_state = OMPI_REQUEST_INACTIVE;
405405
} else {
406406
/* Only free the request if there was no error */

ompi/request/req_wait.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int ompi_request_default_wait(
6666
status->_ucount = req->req_status._ucount;
6767
status->_cancelled = req->req_status._cancelled;
6868
}
69-
if( req->req_persistent ) {
69+
if( OMPI_REQ_IS_PERSISTENT(req) ) {
7070
if( req->req_state == OMPI_REQUEST_INACTIVE ) {
7171
if (MPI_STATUS_IGNORE != status) {
7272
*status = ompi_status_empty;
@@ -213,7 +213,7 @@ int ompi_request_default_wait_any(size_t count,
213213
status->MPI_ERROR = old_error;
214214
}
215215
rc = request->req_status.MPI_ERROR;
216-
if( request->req_persistent ) {
216+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
217217
request->req_state = OMPI_REQUEST_INACTIVE;
218218
} else if (MPI_SUCCESS == rc) {
219219
/* Only free the request if there is no error on it */
@@ -358,7 +358,7 @@ int ompi_request_default_wait_all( size_t count,
358358

359359
statuses[i] = request->req_status;
360360

361-
if( request->req_persistent ) {
361+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
362362
request->req_state = OMPI_REQUEST_INACTIVE;
363363
continue;
364364
}
@@ -423,7 +423,7 @@ int ompi_request_default_wait_all( size_t count,
423423

424424
rc = request->req_status.MPI_ERROR;
425425

426-
if( request->req_persistent ) {
426+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
427427
request->req_state = OMPI_REQUEST_INACTIVE;
428428
} else if (MPI_SUCCESS == rc) {
429429
/* Only free the request if there is no error on it */
@@ -619,7 +619,7 @@ int ompi_request_default_wait_some(size_t count,
619619
rc = MPI_ERR_IN_STATUS;
620620
}
621621

622-
if( request->req_persistent ) {
622+
if( OMPI_REQ_IS_PERSISTENT(request) ) {
623623
request->req_state = OMPI_REQUEST_INACTIVE;
624624
} else {
625625
/* Only free the request if there was no error */

ompi/request/request.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static void ompi_request_construct(ompi_request_t* req)
5555
* be no matching _FINI invocation */
5656
req->req_state = OMPI_REQUEST_INVALID;
5757
req->req_complete = REQUEST_COMPLETED;
58-
req->req_persistent = false;
58+
req->req_flags = 0;
5959
req->req_start = NULL;
6060
req->req_free = NULL;
6161
req->req_cancel = NULL;
@@ -122,7 +122,7 @@ int ompi_request_init(void)
122122

123123
ompi_request_null.request.req_complete = REQUEST_COMPLETED;
124124
ompi_request_null.request.req_state = OMPI_REQUEST_INACTIVE;
125-
ompi_request_null.request.req_persistent = false;
125+
ompi_request_null.request.req_flags = 0;
126126
ompi_request_null.request.req_f_to_c_index =
127127
opal_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_null);
128128
ompi_request_null.request.req_start = NULL; /* should not be called */
@@ -155,7 +155,7 @@ int ompi_request_init(void)
155155

156156
ompi_request_empty.req_complete = REQUEST_COMPLETED;
157157
ompi_request_empty.req_state = OMPI_REQUEST_ACTIVE;
158-
ompi_request_empty.req_persistent = false;
158+
ompi_request_empty.req_flags = 0;
159159
ompi_request_empty.req_f_to_c_index =
160160
opal_pointer_array_add(&ompi_request_f_to_c_table, &ompi_request_empty);
161161
ompi_request_empty.req_start = NULL; /* should not be called */
@@ -203,7 +203,7 @@ int ompi_request_persistent_noop_create(ompi_request_t** request)
203203
req->req_status = ompi_request_empty.req_status;
204204
req->req_complete = REQUEST_COMPLETED;
205205
req->req_state = OMPI_REQUEST_INACTIVE;
206-
req->req_persistent = true;
206+
req->req_flags = OMPI_REQ_PERSISTENT;
207207
req->req_free = ompi_request_persistent_noop_free;
208208

209209
*request = req;

ompi/request/request.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ typedef union ompi_mpi_object_t {
120120
struct ompi_win_t *win;
121121
} ompi_mpi_object_t;
122122

123+
#define OMPI_REQ_PERSISTENT 0x0001
124+
#define OMPI_REQ_NB_RELEASE_DATATYPES 0x0002
125+
#define OMPI_REQ_NB_RELEASE_DISPLS 0x0004
126+
#define OMPI_REQ_NB_RELEASE_COUNTS 0x0008
127+
128+
#define OMPI_REQ_IS_PERSISTENT(REQ) (OMPI_REQ_PERSISTENT & (REQ)->req_flags)
129+
123130
/**
124131
* Main top-level request struct definition
125132
*/
@@ -129,7 +136,7 @@ struct ompi_request_t {
129136
ompi_status_public_t req_status; /**< Completion status */
130137
volatile void *req_complete; /**< Flag indicating wether request has completed */
131138
volatile ompi_request_state_t req_state; /**< enum indicate state of the request */
132-
bool req_persistent; /**< flag indicating if the this is a persistent request */
139+
int req_flags; /**< flag indicating properties of the request (persistency, release resources) */
133140
int req_f_to_c_index; /**< Index in Fortran <-> C translation array */
134141
ompi_request_start_fn_t req_start; /**< Called by MPI_START and MPI_STARTALL */
135142
ompi_request_free_fn_t req_free; /**< Called by free */
@@ -173,7 +180,7 @@ typedef struct ompi_predefined_request_t ompi_predefined_request_t;
173180
(request)->req_complete = \
174181
(persistent) ? REQUEST_COMPLETED : REQUEST_PENDING; \
175182
(request)->req_state = OMPI_REQUEST_INACTIVE; \
176-
(request)->req_persistent = (persistent); \
183+
(request)->req_flags = (persistent ? OMPI_REQ_PERSISTENT : 0); \
177184
(request)->req_complete_cb = NULL; \
178185
(request)->req_complete_cb_data = NULL; \
179186
} while (0);

0 commit comments

Comments
 (0)