/*! \file ep_wait.cpp \since 2 may 2016 \brief Definitions of MPI wait function: MPI_Wait, MPI_Waitall, MPI_Waitsome, MPI_Waitany */ #include "ep_lib.hpp" #include #include "ep_declaration.hpp" #include "ep_mpi.hpp" using namespace std; extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests; #pragma omp threadprivate(EP_PendingRequests) namespace ep_lib { int MPI_Wait(MPI_Request *request, MPI_Status *status) { if((*request)->type !=1 && (*request)->type !=2 && (*request)->type !=3) { printf("MPI_Wait : Error in request type\n"); exit(1); } while((*request)->type == 2) Request_Check(); ::MPI_Status mpi_status; ::MPI_Wait(to_mpi_request_ptr(*request), &mpi_status); status->mpi_status = new ::MPI_Status(mpi_status); status->ep_src = (*request)->ep_src; status->ep_tag = (*request)->ep_tag; status->ep_datatype = (*request)->ep_datatype; //(*request)->state = 2; memcheck("delete "<< (*request)->mpi_request << " : in ep_lib::MPI_Wait, delete (*request)->mpi_request"); delete (*request)->mpi_request; delete *request; *request=0; return Request_Check(); } /*end of mpi_wait*/ int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses) { std::vector finished(count, 0); ::MPI_Request* mpi_request = new ::MPI_Request[count]; ::MPI_Status* mpi_status = new ::MPI_Status[count]; while(std::accumulate(finished.begin(), finished.end(), 0) < count) { for(int i=0; itype !=1 && array_of_requests[i]->type !=2 && array_of_requests[i]->type !=3) { printf("Error in request type\n"); exit(1); } if(array_of_requests[i]->type == 2) Request_Check(); if(array_of_requests[i]->type != 2 && finished.at(i) == 0) { finished.at(i) = 1; mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request); } } } ::MPI_Waitall(count, mpi_request, mpi_status); for(int i=0; iep_src; array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag; array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype; //array_of_requests[i]->state = 2; memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Waitall, array_of_requests["<mpi_request"); delete array_of_requests[i]->mpi_request; delete array_of_requests[i]; array_of_requests[i] = 0; } delete[] mpi_request; delete[] mpi_status; return Request_Check(); } /* end of mpi_waitall*/ }