diff --git a/ompi/mca/crcp/coord/crcp_coord_pml.c b/ompi/mca/crcp/coord/crcp_coord_pml.c index 6d58068b4f..4aead0c000 100644 --- a/ompi/mca/crcp/coord/crcp_coord_pml.c +++ b/ompi/mca/crcp/coord/crcp_coord_pml.c @@ -1041,11 +1041,10 @@ ompi_crcp_base_pml_state_t* ompi_crcp_coord_pml_irecv( void *buf, size_t count, tag = drain_msg_ref->tag; memcpy(buf, drain_msg_ref->buffer, tmp_ddt_size * count); + *request = drain_msg_ref->request; + OBJ_RETAIN(*request); + /* Remove the message from the list */ - if( NULL != drain_msg_ref->datatype ) { - OBJ_RELEASE(drain_msg_ref->datatype); - drain_msg_ref->datatype = NULL; - } opal_list_remove_item(&drained_msg_list, &(drain_msg_ref->super)); OBJ_RELEASE(drain_msg_ref); @@ -1196,10 +1195,6 @@ ompi_crcp_base_pml_state_t* ompi_crcp_coord_pml_recv( void *buf, size_t count, memcpy(status, &drain_msg_ref->status, sizeof(ompi_status_public_t)); /* Remove the message from the list */ - if( NULL != drain_msg_ref->datatype ) { - OBJ_RELEASE(drain_msg_ref->datatype); - drain_msg_ref->datatype = NULL; - } opal_list_remove_item(&drained_msg_list, &(drain_msg_ref->super)); OBJ_RELEASE(drain_msg_ref); diff --git a/ompi/mca/pml/crcpw/pml_crcpw_module.c b/ompi/mca/pml/crcpw/pml_crcpw_module.c index 32bb1d952c..409d5fea0d 100644 --- a/ompi/mca/pml/crcpw/pml_crcpw_module.c +++ b/ompi/mca/pml/crcpw/pml_crcpw_module.c @@ -513,6 +513,10 @@ int mca_pml_crcpw_irecv( void *buf, size_t count, ompi_datatype_t *datatype, int return ret; } + if( OMPI_CRCP_PML_DONE == pml_state->state) { + goto CLEANUP; + } + if( OMPI_CRCP_PML_SKIP != pml_state->state) { if( OMPI_SUCCESS != (ret = mca_pml_crcpw_module.wrapped_pml_module.pml_irecv(buf, count, datatype, src, tag, comm, request) ) ) { PML_CRCP_STATE_RETURN(pml_state); @@ -528,6 +532,7 @@ int mca_pml_crcpw_irecv( void *buf, size_t count, ompi_datatype_t *datatype, int return ret; } + CLEANUP: PML_CRCP_STATE_RETURN(pml_state); return OMPI_SUCCESS;