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 "comm.h"
00038 #include "tags.h"
00039 #include "worker.h"
00040 #include "scheduler.h"
00041 #include "synchron.h"
00042 #include "mess.h"
00043 #include "node.h"
00044 #include "../../core/runner.h"
00045 #include "../../core/cooperative.h"
00046 #include "../../core/peo_debug.h"
00047
00048 void receiveMessages ()
00049 {
00050
00051 cleanBuffers ();
00052
00053 do
00054 {
00055
00056 if (! atLeastOneActiveThread ())
00057 {
00058
00059 waitMessage ();
00060 }
00061
00062 int src, tag;
00063
00064 while (probeMessage (src, tag))
00065 {
00066
00067 receiveMessage (src, tag);
00068 initMessage ();
00069
00070 switch (tag)
00071 {
00072
00073 case RUNNER_STOP_TAG:
00074 unpackTerminationOfRunner ();
00075 break;
00076
00077 case SYNCHRONIZE_REQ_TAG:
00078 unpackSynchronRequest ();
00079 break;
00080
00081 case SYNCHRONIZED_TAG:
00082 {
00083 RUNNER_ID runner_id;
00084 unpack (runner_id);
00085
00086 COOP_ID coop_id;
00087 unpack (coop_id);
00088
00089 getCooperative (coop_id) -> notifySynchronized ();
00090 break;
00091 }
00092
00093 case COOP_TAG:
00094 COOP_ID coop_id;
00095 unpack (coop_id);
00096 getCooperative (coop_id) -> unpack ();
00097 getCooperative (coop_id) -> notifyReceiving ();
00098 break;
00099
00100 case SCHED_REQUEST_TAG:
00101 unpackResourceRequest ();
00102 break;
00103
00104 case SCHED_RESULT_TAG:
00105 {
00106
00107 SERVICE_ID serv_id;
00108 unpack (serv_id);
00109 Service * serv = getService (serv_id);
00110 int dest;
00111 unpack (dest);
00112 WORKER_ID worker_id;
00113 unpack (worker_id);
00114
00115
00116 initMessage ();
00117 pack (worker_id);
00118 pack (serv_id);
00119 serv -> packData ();
00120 serv -> notifySendingData ();
00121 sendMessage (dest, TASK_DATA_TAG);
00122 break;
00123 }
00124
00125 case TASK_DATA_TAG:
00126 {
00127 WORKER_ID worker_id;
00128 unpack (worker_id);
00129 Worker * worker = getWorker (worker_id);
00130 worker -> setSource (src);
00131 worker -> unpackData ();
00132 worker -> wakeUp ();
00133 break;
00134 }
00135
00136 case TASK_RESULT_TAG:
00137 {
00138 SERVICE_ID serv_id;
00139 unpack (serv_id);
00140 Service * serv = getService (serv_id);
00141 serv -> unpackResult ();
00142 break;
00143 }
00144
00145 case TASK_DONE_TAG:
00146 unpackTaskDone ();
00147 break;
00148
00149 default:
00150 ;
00151 };
00152 }
00153
00154 }
00155 while ( ! atLeastOneActiveThread () && atLeastOneActiveRunner () );
00156 }