00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <mpi.h>
00026
00027 #include "comm.h"
00028 #include "mess.h"
00029 #include "node.h"
00030 #include "param.h"
00031 #include "../../core/peo_debug.h"
00032 #include "../../core/runner.h"
00033 #include "send.h"
00034 #include "recv.h"
00035 #include "scheduler.h"
00036
00037 static sem_t sem_comm_init;
00038
00039 static Communicator * the_thread;
00040
00041 Communicator :: Communicator (int * __argc, char * * * __argv) {
00042
00043 the_thread = this;
00044 initNode (__argc, __argv);
00045 loadRMCParameters (* __argc, * __argv);
00046 sem_post (& sem_comm_init);
00047 }
00048
00049 void Communicator :: start () {
00050
00051 while (true) {
00052
00053
00054 sleep ();
00055 sendMessages ();
00056
00057 if (! atLeastOneActiveRunner ())
00058 break;
00059 receiveMessages ();
00060 }
00061 waitBuffers ();
00062 printDebugMessage ("finalizing");
00063 MPI_Finalize ();
00064 }
00065
00066 void initCommunication () {
00067
00068 sem_init (& sem_comm_init, 0, 0);
00069 }
00070
00071 void waitNodeInitialization () {
00072
00073 sem_wait (& sem_comm_init);
00074 }
00075
00076 void wakeUpCommunicator () {
00077
00078 the_thread -> wakeUp ();
00079 }
00080
00081
00082