int MPID_Recv(void * buf, int count, MPI_Datatype datatype, int rank, int tag, MPID_Comm * comm, int context_offset, MPI_Status * status, MPID_Request ** request) { /* FIXME: in the common case, we want to simply complete the message and make as few updates as possible. Note in addition that this routine is used only by MPI_Recv (a blocking routine; the intent of the interface (which returns a request) was to simplify the handling of the case where the message was not found in the unexpected queue. */ int mpi_errno = MPI_SUCCESS; MPID_Request * rreq; int found; MPIDI_STATE_DECL(MPID_STATE_MPID_RECV); MPIDI_FUNC_ENTER(MPID_STATE_MPID_RECV); MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST, "rank=%d, tag=%d, context=%d", rank, tag, comm->recvcontext_id + context_offset)); if (rank == MPI_PROC_NULL) { MPIR_Status_set_procnull(status); rreq = NULL; goto fn_exit; } /* Check to make sure the communicator hasn't already been revoked */ if (comm->revoked && MPIR_AGREE_TAG != MPIR_TAG_MASK_ERROR_BIT(tag & ~MPIR_Process.tagged_coll_mask) && MPIR_SHRINK_TAG != MPIR_TAG_MASK_ERROR_BIT(tag & ~MPIR_Process.tagged_coll_mask)) { MPIU_ERR_SETANDJUMP(mpi_errno,MPIX_ERR_REVOKED,"**revoked"); } MPIU_THREAD_CS_ENTER(MSGQUEUE,); rreq = MPIDI_CH3U_Recvq_FDU_or_AEP(rank, tag, comm->recvcontext_id + context_offset, comm, buf, count, datatype, &found); if (rreq == NULL) { MPIU_THREAD_CS_EXIT(MSGQUEUE,); MPIU_ERR_SETANDJUMP(mpi_errno,MPI_ERR_OTHER,"**nomemreq"); }
int MPID_Irecv(void * buf, int count, MPI_Datatype datatype, int rank, int tag, MPID_Comm * comm, int context_offset, MPID_Request ** request) { MPID_Request * rreq; int found; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPID_IRECV); MPIDI_FUNC_ENTER(MPID_STATE_MPID_IRECV); MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST, "rank=%d, tag=%d, context=%d", rank, tag, comm->recvcontext_id + context_offset)); if (rank == MPI_PROC_NULL) { rreq = MPID_Request_create(); if (rreq != NULL) { /* MT FIXME should these be handled by MPID_Request_create? */ MPIU_Object_set_ref(rreq, 1); MPID_cc_set(&rreq->cc, 0); rreq->kind = MPID_REQUEST_RECV; MPIR_Status_set_procnull(&rreq->status); } else { MPIU_ERR_SETANDJUMP(mpi_errno,MPI_ERR_OTHER,"**nomemreq"); } goto fn_exit; } MPIU_THREAD_CS_ENTER(MSGQUEUE,); rreq = MPIDI_CH3U_Recvq_FDU_or_AEP(rank, tag, comm->recvcontext_id + context_offset, comm, buf, count, datatype, &found); if (rreq == NULL) { MPIU_THREAD_CS_EXIT(MSGQUEUE,); MPIU_ERR_SETANDJUMP(mpi_errno,MPI_ERR_OTHER,"**nomemreq"); }