int MPIC_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status) { MPID_Request *recv_req_ptr=NULL, *send_req_ptr=NULL; int mpi_errno, context_id; MPID_Comm *comm_ptr = NULL; MPIDI_STATE_DECL(MPID_STATE_MPIC_SENDRECV); MPIDI_PT2PT_FUNC_ENTER_BOTH(MPID_STATE_MPIC_SENDRECV); 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_Irecv(recvbuf, recvcount, recvtype, source, recvtag, comm_ptr, context_id, &recv_req_ptr); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } mpi_errno = MPID_Isend(sendbuf, sendcount, sendtype, dest, sendtag, comm_ptr, context_id, &send_req_ptr); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } mpi_errno = MPIC_Wait(send_req_ptr); if (mpi_errno) { MPIU_ERR_POP(mpi_errno); } mpi_errno = MPIC_Wait(recv_req_ptr); if (mpi_errno) { MPIU_ERR_POPFATAL(mpi_errno); } if (status != MPI_STATUS_IGNORE) *status = recv_req_ptr->status; mpi_errno = recv_req_ptr->status.MPI_ERROR; MPID_Request_release(send_req_ptr); MPID_Request_release(recv_req_ptr); fn_fail: /* --BEGIN ERROR HANDLING-- */ MPIDI_PT2PT_FUNC_EXIT_BOTH(MPID_STATE_MPIC_SENDRECV); return mpi_errno; /* --END ERROR HANDLING-- */ }
int MPIC_Sendrecv(const void *sendbuf, MPI_Aint sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, MPI_Aint recvcount, MPI_Datatype recvtype, int source, int recvtag, MPID_Comm *comm_ptr, MPI_Status *status, mpir_errflag_t *errflag) { int mpi_errno = MPI_SUCCESS; int context_id; MPI_Status mystatus; MPID_Request *recv_req_ptr = NULL, *send_req_ptr = NULL; MPIDI_STATE_DECL(MPID_STATE_MPIC_SENDRECV); MPIDI_FUNC_ENTER(MPID_STATE_MPIC_SENDRECV); MPIU_DBG_MSG_S(PT2PT, TYPICAL, "IN: errflag = %s", *errflag?"TRUE":"FALSE"); MPIU_ERR_CHKANDJUMP1((sendcount < 0), mpi_errno, MPI_ERR_COUNT, "**countneg", "**countneg %d", sendcount); MPIU_ERR_CHKANDJUMP1((recvcount < 0), mpi_errno, MPI_ERR_COUNT, "**countneg", "**countneg %d", recvcount); context_id = (comm_ptr->comm_kind == MPID_INTRACOMM) ? MPID_CONTEXT_INTRA_COLL : MPID_CONTEXT_INTER_COLL; if (status == MPI_STATUS_IGNORE) status = &mystatus; switch(*errflag) { case MPIR_ERR_NONE: break; case MPIR_ERR_PROC_FAILED: MPIR_TAG_SET_PROC_FAILURE_BIT(sendtag); default: MPIR_TAG_SET_ERROR_BIT(sendtag); } mpi_errno = MPID_Irecv(recvbuf, recvcount, recvtype, source, recvtag, comm_ptr, context_id, &recv_req_ptr); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_Isend(sendbuf, sendcount, sendtype, dest, sendtag, comm_ptr, context_id, &send_req_ptr); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPIC_Wait(send_req_ptr, errflag); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPIC_Wait(recv_req_ptr, errflag); if (mpi_errno) MPIU_ERR_POPFATAL(mpi_errno); *status = recv_req_ptr->status; if (mpi_errno == MPI_SUCCESS) { mpi_errno = recv_req_ptr->status.MPI_ERROR; if (mpi_errno == MPI_SUCCESS) { mpi_errno = send_req_ptr->status.MPI_ERROR; } } MPID_Request_release(send_req_ptr); MPID_Request_release(recv_req_ptr); fn_exit: MPIU_DBG_MSG_D(PT2PT, TYPICAL, "OUT: errflag = %d", *errflag); MPIDI_FUNC_EXIT(MPID_STATE_MPIC_SENDRECV); return mpi_errno; fn_fail: if (send_req_ptr) MPID_Request_release(send_req_ptr); if (recv_req_ptr) MPID_Request_release(recv_req_ptr); goto fn_exit; }
int MPIR_Datatype_init_names(void) { #ifdef HAVE_ERROR_CHECKING static const char FCNAME[] = "MPIR_Datatype_init_names"; #endif int mpi_errno = MPI_SUCCESS; int i; MPID_Datatype *datatype_ptr = NULL; MPIU_THREADSAFE_INIT_DECL(needsInit); if (needsInit) { MPIU_THREADSAFE_INIT_BLOCK_BEGIN(needsInit); /* Make sure that the basics have datatype structures allocated * and filled in for them. They are just integers prior to this * call. */ mpi_errno = MPIR_Datatype_builtin_fillin(); if (mpi_errno != MPI_SUCCESS) { MPIU_ERR_POPFATAL(mpi_errno); } /* For each predefined type, ensure that there is a corresponding object and that the object's name is set */ for (i=0; mpi_names[i].name != 0; i++) { /* The size-specific types may be DATATYPE_NULL, as might be those based on 'long long' and 'long double' if those types were disabled at configure time. */ if (mpi_names[i].dtype == MPI_DATATYPE_NULL) continue; MPID_Datatype_get_ptr(mpi_names[i].dtype, datatype_ptr); if (datatype_ptr < MPID_Datatype_builtin || datatype_ptr > MPID_Datatype_builtin + MPID_DATATYPE_N_BUILTIN) { MPIU_ERR_SETFATALANDJUMP1(mpi_errno,MPI_ERR_INTERN, "**typeinitbadmem","**typeinitbadmem %d", i); } if (!datatype_ptr) { MPIU_ERR_SETFATALANDJUMP1(mpi_errno,MPI_ERR_INTERN, "**typeinitfail", "**typeinitfail %d", i - 1); } MPIU_DBG_MSG_FMT(DATATYPE,VERBOSE,(MPIU_DBG_FDEST, "mpi_names[%d].name = %p", i, mpi_names[i].name)); MPIU_Strncpy(datatype_ptr->name, mpi_names[i].name, MPI_MAX_OBJECT_NAME); } /* Handle the minloc/maxloc types */ for (i=0; mpi_maxloc_names[i].name != 0; i++) { /* types based on 'long long' and 'long double' may be disabled at configure time, and their values set to MPI_DATATYPE_NULL. skip those types. */ if (mpi_maxloc_names[i].dtype == MPI_DATATYPE_NULL) continue; MPID_Datatype_get_ptr(mpi_maxloc_names[i].dtype, datatype_ptr); if (!datatype_ptr) { MPIU_ERR_SETFATALANDJUMP(mpi_errno,MPI_ERR_INTERN, "**typeinitminmaxloc"); } MPIU_Strncpy(datatype_ptr->name, mpi_maxloc_names[i].name, MPI_MAX_OBJECT_NAME); } MPIU_THREADSAFE_INIT_CLEAR(needsInit); fn_fail:; MPIU_THREADSAFE_INIT_BLOCK_END(needsInit); } return mpi_errno; }