Blame src/mpid/ch3/src/mpid_mrecv.c

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