Skip to content

Commit 1d07dae

Browse files
authored
Merge pull request #11499 from devreal/ompi-request-cb-mt-cas-revert
Revert "Fix a race condition between registering a callback and completing a request"
2 parents f007cea + 236e180 commit 1d07dae

File tree

1 file changed

+12
-20
lines changed

1 file changed

+12
-20
lines changed

ompi/request/request.h

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,6 @@ typedef struct ompi_request_t ompi_request_t;
158158
#define REQUEST_PENDING (void *)0L
159159
#define REQUEST_COMPLETED (void *)1L
160160

161-
#define REQUEST_CB_PENDING (void *)0L
162-
#define REQUEST_CB_COMPLETED (void *)1L
163-
164161
struct ompi_predefined_request_t {
165162
struct ompi_request_t request;
166163
char padding[PREDEFINED_REQUEST_PAD - sizeof(ompi_request_t)];
@@ -520,12 +517,12 @@ static inline void ompi_request_wait_completion(ompi_request_t *req)
520517
static inline int ompi_request_complete(ompi_request_t* request, bool with_signal)
521518
{
522519
int rc = 0;
523-
ompi_request_complete_fn_t cb;
524-
cb = (ompi_request_complete_fn_t)OPAL_ATOMIC_SWAP_PTR((opal_atomic_intptr_t*)&request->req_complete_cb,
525-
(intptr_t)REQUEST_CB_COMPLETED);
526-
if (REQUEST_CB_PENDING != cb) {
527-
request->req_complete_cb = REQUEST_CB_PENDING;
528-
rc = cb(request);
520+
521+
if(NULL != request->req_complete_cb) {
522+
/* Set the request cb to NULL to allow resetting in the callback */
523+
ompi_request_complete_fn_t fct = request->req_complete_cb;
524+
request->req_complete_cb = NULL;
525+
rc = fct( request );
529526
}
530527

531528
if (0 == rc) {
@@ -549,17 +546,12 @@ static inline int ompi_request_set_callback(ompi_request_t* request,
549546
void* cb_data)
550547
{
551548
request->req_complete_cb_data = cb_data;
552-
opal_atomic_wmb();
553-
if ((REQUEST_CB_COMPLETED == request->req_complete_cb) ||
554-
(REQUEST_CB_COMPLETED == (void*)OPAL_ATOMIC_SWAP_PTR((opal_atomic_intptr_t*)&request->req_complete_cb,
555-
(intptr_t)cb))) {
556-
if (NULL != cb) {
557-
/* the request was marked at least partially completed, make sure it's fully complete */
558-
while (!REQUEST_COMPLETE(request)) {}
559-
/* Set the request cb to NULL to allow resetting in the callback */
560-
request->req_complete_cb = REQUEST_CB_PENDING;
561-
cb(request);
562-
}
549+
request->req_complete_cb = cb;
550+
/* If request is completed and the callback is not called, need to call callback */
551+
if ((NULL != request->req_complete_cb) && (request->req_complete == REQUEST_COMPLETED)) {
552+
ompi_request_complete_fn_t fct = request->req_complete_cb;
553+
request->req_complete_cb = NULL;
554+
return fct( request );
563555
}
564556
return OMPI_SUCCESS;
565557
}

0 commit comments

Comments
 (0)