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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <vector>
00038
00039 #include "tags.h"
00040 #include "send.h"
00041 #include "node.h"
00042 #include "schema.h"
00043 #include "worker.h"
00044 #include "mess.h"
00045 #include "../../core/peo_debug.h"
00046
00047 static std :: vector <Worker *> key_to_worker (1);
00048
00049 extern void wakeUpCommunicator ();
00050
00051 Worker * getWorker (WORKER_ID __key)
00052 {
00053
00054 return key_to_worker [__key];
00055 }
00056
00057 Worker :: Worker ()
00058 {
00059
00060 recvAndCompleted = false;
00061 taskAssigned = 0;
00062 id = key_to_worker.size ();
00063 key_to_worker.push_back (this);
00064
00065 sem_init( &sem_task_done, 0, 0 );
00066 }
00067
00068 void Worker :: packResult ()
00069 {
00070
00071 pack (serv_id);
00072 serv -> packResult ();
00073 }
00074
00075 void Worker :: unpackData ()
00076 {
00077
00078 taskAssigned ++;
00079 printDebugMessage ("unpacking the ID. of the service.");
00080 unpack (serv_id);
00081 serv = getService (serv_id);
00082 printDebugMessage ("found the service.");
00083 serv -> unpackData ();
00084 printDebugMessage ("unpacking the data.");
00085 setActive ();
00086 }
00087
00088 void Worker :: packTaskDone ()
00089 {
00090
00091 pack (getNodeRank ());
00092 pack (id);
00093 }
00094
00095 void Worker :: notifySendingResult ()
00096 {
00097
00098
00099 recvAndCompleted = true;
00100 wakeUp ();
00101 }
00102
00103 void Worker :: notifySendingTaskDone ()
00104 {
00105
00106 sem_post(&sem_task_done);
00107 setPassive ();
00108 }
00109
00110 void Worker :: setSource (int __rank)
00111 {
00112
00113 src = __rank;
00114 }
00115
00116 void Worker :: start ()
00117 {
00118
00119 while (true)
00120 {
00121
00122 sleep ();
00123
00124 if (! atLeastOneActiveRunner () && ! taskAssigned)
00125 break;
00126
00127 if (recvAndCompleted)
00128 {
00129 send (this, my_node -> rk_sched, TASK_DONE_TAG);
00130 recvAndCompleted = false;
00131 sem_wait(&sem_task_done);
00132 taskAssigned --;
00133 }
00134 else
00135 {
00136
00137 serv -> execute ();
00138 send (this, src, TASK_RESULT_TAG);
00139 }
00140 }
00141
00142 printDebugMessage ("Worker finished execution.");
00143 setPassive ();
00144
00145 wakeUpCommunicator();
00146 }
00147
00148 void initWorkersEnv ()
00149 {
00150
00151 key_to_worker.resize (1);
00152 }