runner.cpp

00001 // "runner.cpp"
00002 
00003 // (c) OPAC Team, LIFL, August 2005
00004 
00005 /* 
00006    Contact: paradiseo-help@lists.gforge.inria.fr
00007 */
00008 
00009 #include <vector>
00010 
00011 #include "runner.h"
00012 #include "reac_thread.h"
00013 #include "peo_debug.h"
00014 #include "messaging.h"
00015 
00016 static unsigned num_act = 0; /* Number of active runners */
00017 
00018 static std :: vector <pthread_t *> ll_threads; /* Low-level runner threads */ 
00019 
00020 static std :: vector <Runner *> the_runners;
00021 
00022 static unsigned num_runners = 0;
00023 
00024 Runner :: Runner () {
00025 
00026   id = ++ num_runners;
00027   the_runners.push_back (this);
00028   sem_init (& sem_start, 0, 0);
00029   num_act ++;  
00030 }
00031 
00032 extern int getNodeRank ();
00033 
00034 extern int getNumberOfNodes ();
00035 
00036 void unpackTerminationOfRunner () {
00037   
00038   RUNNER_ID id;
00039   unpack (id);    
00040   num_act --;
00041   printDebugMessage ("I'm noticed of the termination of a runner");
00042   if (! num_act) {
00043     printDebugMessage ("all the runners have terminated. Now stopping the reactive threads.");
00044     stopReactiveThreads ();
00045   }
00046 }
00047 
00048 bool atLeastOneActiveRunner () {
00049 
00050   return num_act;
00051 }
00052 
00053 RUNNER_ID Runner :: getID () {
00054 
00055   return id;
00056 }
00057 
00058 void Runner :: start () {
00059 
00060   setActive ();
00061   sem_post (& sem_start);
00062   run ();
00063   terminate ();
00064 }
00065 
00066 void Runner :: notifySendingTermination () {
00067 
00068   /*
00069   char b [1000];
00070   sprintf (b, "Il reste encore %d !!!!!!!!!!!!", n);
00071   printDebugMessage (b);
00072   */
00073   printDebugMessage ("je suis informe que tout le monde a recu ma terminaison");
00074   setPassive ();
00075   
00076 }
00077 
00078 void Runner :: waitStarting () {
00079 
00080   sem_wait (& sem_start);
00081 }
00082 
00083 Runner * getRunner (RUNNER_ID __key) {
00084 
00085   return dynamic_cast <Runner *> (getCommunicable (__key));
00086 }
00087 
00088 void startRunners () {
00089   
00090   /* Runners */
00091   for (unsigned i = 0; i < the_runners.size (); i ++)
00092     if (the_runners [i] -> isLocal ()) {
00093       addThread (the_runners [i], ll_threads);
00094       the_runners [i] -> waitStarting ();
00095     }
00096   printDebugMessage ("launched the parallel runners");
00097 }
00098 
00099 
00100 void joinRunners () {
00101 
00102 
00103   joinThreads (ll_threads);
00104 }

Generated on Thu Jun 28 15:51:15 2007 for ParadisEO-PEO by  doxygen 1.4.7