From a67ac801806f9b120209e18f91cf1a8bf367d143 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Tue, 16 May 2023 13:38:37 -0400 Subject: [PATCH] Propagate the error up to the user. Make sure to reset the generalized request to guarantee not to call the free callback a second time. Signed-off-by: George Bosilca --- ompi/request/grequest.c | 50 ++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/ompi/request/grequest.c b/ompi/request/grequest.c index 01daa28ea0a..ab9258e563c 100644 --- a/ompi/request/grequest.c +++ b/ompi/request/grequest.c @@ -37,9 +37,36 @@ */ static int ompi_grequest_free(ompi_request_t** req) { - OBJ_RELEASE(*req); - *req = MPI_REQUEST_NULL; - return OMPI_SUCCESS; + ompi_grequest_t* greq = (ompi_grequest_t*)*req; + int rc = OMPI_SUCCESS; + + if (NULL != greq->greq_free.c_free) { + /* We were already putting query_fn()'s return value into + * status.MPI_ERROR but for MPI_{Wait,Test}*. If there's a + * free callback to invoke, the standard says to use the + * return value from free_fn() callback, too. + */ + if (greq->greq_funcs_are_c) { + greq->greq_base.req_status.MPI_ERROR = + greq->greq_free.c_free(greq->greq_state); + } else { + MPI_Fint ierr; + greq->greq_free.f_free((MPI_Aint*)greq->greq_state, &ierr); + greq->greq_base.req_status.MPI_ERROR = + OMPI_FINT_2_INT(ierr); + } + rc = greq->greq_base.req_status.MPI_ERROR; + } + if (OMPI_SUCCESS == rc ) { + OBJ_RELEASE(*req); + *req = MPI_REQUEST_NULL; + } else { + /* Make sure we will not be calling the grequest free function + * a second time when we release the request. + */ + greq->greq_free.c_free = NULL; + } + return rc; } static int ompi_grequest_cancel(ompi_request_t* req, int flag) @@ -122,23 +149,6 @@ static void ompi_grequest_construct(ompi_grequest_t* greq) */ static void ompi_grequest_destruct(ompi_grequest_t* greq) { - if (greq->greq_free.c_free != NULL) { - /* We were already putting query_fn()'s return value into - * status.MPI_ERROR but for MPI_{Wait,Test}*. If there's a - * free callback to invoke, the standard says to use the - * return value from free_fn() callback, too. - */ - if (greq->greq_funcs_are_c) { - greq->greq_base.req_status.MPI_ERROR = - greq->greq_free.c_free(greq->greq_state); - } else { - MPI_Fint ierr; - greq->greq_free.f_free((MPI_Aint*)greq->greq_state, &ierr); - greq->greq_base.req_status.MPI_ERROR = - OMPI_FINT_2_INT(ierr); - } - } - OMPI_REQUEST_FINI(&greq->greq_base); }