|
Packit |
0848f5 |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* (C) 2012 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
* See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#include "mpidimpl.h"
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#undef FUNCNAME
|
|
Packit |
0848f5 |
#define FUNCNAME MPID_Imrecv
|
|
Packit |
0848f5 |
#undef FCNAME
|
|
Packit |
0848f5 |
#define FCNAME MPL_QUOTE(FUNCNAME)
|
|
Packit |
0848f5 |
int MPID_Mrecv(void *buf, int count, MPI_Datatype datatype,
|
|
Packit |
0848f5 |
MPID_Request *message, MPI_Status *status)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int mpi_errno = MPI_SUCCESS;
|
|
Packit |
0848f5 |
MPI_Request req_handle; /* dummy for MPIR_Request_complete */
|
|
Packit |
0848f5 |
int active_flag; /* dummy for MPIR_Request_complete */
|
|
Packit |
0848f5 |
MPID_Request *rreq = NULL;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (message == NULL) {
|
|
Packit |
0848f5 |
/* treat as though MPI_MESSAGE_NO_PROC was passed */
|
|
Packit |
0848f5 |
MPIR_Status_set_procnull(status);
|
|
Packit |
0848f5 |
goto fn_exit;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* There is no optimized MPID_Mrecv at this time because there is no real
|
|
Packit |
0848f5 |
* optimization potential in that case. MPID_Recv exists to prevent
|
|
Packit |
0848f5 |
* creating a request unnecessarily for messages that are already present
|
|
Packit |
0848f5 |
* and eligible for immediate completion. */
|
|
Packit |
0848f5 |
mpi_errno = MPID_Imrecv(buf, count, datatype, message, &rreq);
|
|
Packit |
0848f5 |
if (mpi_errno) MPIR_ERR_POP(mpi_errno);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (!MPID_Request_is_complete(rreq)) {
|
|
Packit |
0848f5 |
MPID_Progress_state progress_state;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPID_Progress_start(&progress_state);
|
|
Packit |
0848f5 |
while (!MPID_Request_is_complete(rreq))
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
mpi_errno = MPID_Progress_wait(&progress_state);
|
|
Packit |
0848f5 |
if (mpi_errno) {
|
|
Packit |
0848f5 |
/* --BEGIN ERROR HANDLING-- */
|
|
Packit |
0848f5 |
MPID_Progress_end(&progress_state);
|
|
Packit |
0848f5 |
MPIR_ERR_POP(mpi_errno);
|
|
Packit |
0848f5 |
/* --END ERROR HANDLING-- */
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPID_Progress_end(&progress_state);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
mpi_errno = MPIR_Request_complete(&req_handle, rreq, status, &active_flag);
|
|
Packit |
0848f5 |
if (mpi_errno) MPIR_ERR_POP(mpi_errno);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
fn_exit:
|
|
Packit |
0848f5 |
return mpi_errno;
|
|
Packit |
0848f5 |
fn_fail:
|
|
Packit |
0848f5 |
goto fn_exit;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|