@@ -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-
164161struct 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)
520517static 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