|
17 | 17 | #include "opal/class/opal_fifo.h" |
18 | 18 | #include "opal/class/opal_free_list.h" |
19 | 19 | #include "opal/sys/atomic.h" |
| 20 | +#include "opal/util/show_help.h" |
20 | 21 | #include "ompi/mpiext/continue/c/continuation.h" |
| 22 | +#include "ompi/request/request.h" |
21 | 23 |
|
22 | 24 |
|
23 | 25 | static opal_free_list_t ompi_continuation_freelist; |
@@ -457,7 +459,7 @@ static int request_completion_cb(ompi_request_t *request) |
457 | 459 |
|
458 | 460 | /* set the status object */ |
459 | 461 | if (NULL != req_cont_data->cont_status) { |
460 | | - *req_cont_data->cont_status = request->req_status; |
| 462 | + OMPI_COPY_STATUS(req_cont_data->cont_status, request->req_status, true); |
461 | 463 | req_cont_data->cont_status = NULL; |
462 | 464 | } |
463 | 465 |
|
@@ -507,16 +509,23 @@ int ompi_continue_attach( |
507 | 509 | ompi_continuation_t *cont = ompi_continue_cont_create(count, cont_req, cont_cb, |
508 | 510 | cont_data, statuses); |
509 | 511 |
|
| 512 | + /* memory barrier to make sure a thread completing a request see |
| 513 | + * a correct continuation object */ |
510 | 514 | opal_atomic_wmb(); |
511 | 515 |
|
512 | 516 | int32_t num_registered = 0; |
513 | 517 | for (int i = 0; i < count; ++i) { |
514 | 518 | ompi_request_t *request = requests[i]; |
515 | | - if (MPI_REQUEST_NULL != request) { |
| 519 | + if (MPI_REQUEST_NULL == request) { |
| 520 | + /* set the status for null-request */ |
| 521 | + if (statuses != MPI_STATUSES_IGNORE) { |
| 522 | + OMPI_COPY_STATUS(&statuses[i], ompi_status_empty, true); |
| 523 | + } |
| 524 | + } else { |
516 | 525 | if (&ompi_request_empty == request) { |
517 | 526 | /* empty request: do not modify, just copy out the status */ |
518 | 527 | if (statuses != MPI_STATUSES_IGNORE) { |
519 | | - statuses[i] = request->req_status; |
| 528 | + OMPI_COPY_STATUS(&statuses[i], request->req_status, true); |
520 | 529 | } |
521 | 530 | requests[i] = MPI_REQUEST_NULL; |
522 | 531 | } else { |
|
0 commit comments