int MPIC_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { int mpi_errno, context_id; MPID_Request *request_ptr=NULL; MPID_Comm *comm_ptr=NULL; MPIDI_STATE_DECL(MPID_STATE_MPIC_SEND); MPIDI_PT2PT_FUNC_ENTER_FRONT(MPID_STATE_MPIC_SEND); MPID_Comm_get_ptr( comm, comm_ptr ); context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ? MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL; mpi_errno = MPID_Send(buf, count, datatype, dest, tag, comm_ptr, context_id, &request_ptr); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } if (request_ptr) { mpi_errno = MPIC_Wait(request_ptr); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } MPID_Request_release(request_ptr); } fn_exit: MPIDI_PT2PT_FUNC_EXIT(MPID_STATE_MPIC_SEND); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ if (request_ptr) { MPID_Request_release(request_ptr); } goto fn_exit; /* --END ERROR HANDLING-- */ }
int MPIC_Wait(MPID_Request * request_ptr, mpir_errflag_t *errflag) { int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIC_WAIT); MPIDI_PT2PT_FUNC_ENTER(MPID_STATE_MPIC_WAIT); MPIU_DBG_MSG_S(PT2PT, TYPICAL, "IN: errflag = %s", *errflag?"TRUE":"FALSE"); if (request_ptr->kind == MPID_REQUEST_SEND) request_ptr->status.MPI_TAG = 0; if (!MPID_Request_is_complete(request_ptr)) { MPID_Progress_state progress_state; MPID_Progress_start(&progress_state); while (!MPID_Request_is_complete(request_ptr)) { mpi_errno = MPID_Progress_wait(&progress_state); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } } MPID_Progress_end(&progress_state); } if (request_ptr->kind == MPID_REQUEST_RECV) MPIR_Process_status(&request_ptr->status, errflag); MPIR_TAG_CLEAR_ERROR_BITS(request_ptr->status.MPI_TAG); fn_exit: MPIU_DBG_MSG_D(PT2PT, TYPICAL, "OUT: errflag = %d", *errflag); MPIDI_PT2PT_FUNC_EXIT(MPID_STATE_MPIC_WAIT); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ goto fn_exit; /* --END ERROR HANDLING-- */ }