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