Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 2 // See the file tools.license for terms. 3 4 #ifndef toolx_mpi_wait_buffer 5 #define toolx_mpi_wait_buffer 6 7 #include <mpi.h> 8 9 #include <ostream> 10 11 namespace toolx { 12 namespace mpi { 13 14 inline bool wait_buffer(std::ostream& a_out,in 15 int& a_buffer_size,cha 16 a_buffer = 0; 17 a_buffer_size = 0; 18 a_probe_src = -1; 19 20 MPI_Status status; 21 if(::MPI_Probe(a_src,a_tag,a_comm,&status)!= 22 a_out << "toolx::mpi::wait_buffer : rank " 23 return false; 24 } 25 26 if(::MPI_Get_count(&status,MPI_CHAR,&a_buffe 27 a_out << "toolx::mpi::wait_buffer : rank " 28 a_buffer_size = 0; 29 return false; 30 } 31 32 a_probe_src = status.MPI_SOURCE; 33 34 if(!a_buffer_size) { 35 a_out << "exlb::mpi::wait_buffer : MPI_Get 36 a_probe_src = -1; 37 return false; 38 } 39 40 if(a_verbose) a_out << "toolx::mpi::wait_buf 41 42 a_buffer = new char[a_buffer_size]; 43 if(!a_buffer) { 44 a_out << "toolx::mpi::wait_buffer : rank " 45 a_buffer_size = 0; 46 a_probe_src = -1; 47 return false; 48 } 49 50 if(::MPI_Recv(a_buffer,a_buffer_size,MPI_CHA 51 a_out << "toolx::mpi::wait_buffer : rank " 52 a_buffer_size = 0; 53 delete [] a_buffer; 54 a_buffer = 0; 55 a_probe_src = -1; 56 return false; 57 } 58 59 if(a_verbose) a_out << "toolx::mpi::wait_buf 60 61 return true; 62 } 63 64 }} 65 66 #endif