00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "comm.h"
00025 #include "tags.h"
00026 #include "worker.h"
00027 #include "scheduler.h"
00028 #include "mess.h"
00029 #include "node.h"
00030 #include "../../core/runner.h"
00031 #include "../../core/cooperative.h"
00032 #include "../../core/peo_debug.h"
00033
00034 void receiveMessages () {
00035
00036 cleanBuffers ();
00037
00038 do {
00039
00040 if (! atLeastOneActiveThread ()) {
00041
00042 waitMessage ();
00043
00044 }
00045
00046 int src, tag;
00047
00048 while (probeMessage (src, tag)) {
00049
00050 receiveMessage (src, tag);
00051 initMessage ();
00052
00053
00054
00055
00056
00057
00058 switch (tag) {
00059
00060 case RUNNER_STOP_TAG:
00061 unpackTerminationOfRunner ();
00062 wakeUpCommunicator ();
00063 break;
00064
00065 case COOP_TAG:
00066
00067 COOP_ID coop_id;
00068 unpack (coop_id);
00069 getCooperative (coop_id) -> unpack ();
00070 break;
00071
00072 case SCHED_REQUEST_TAG:
00073 unpackResourceRequest ();
00074 break;
00075
00076 case SCHED_RESULT_TAG:
00077 {
00078
00079 SERVICE_ID serv_id;
00080 unpack (serv_id);
00081 Service * serv = getService (serv_id);
00082 int dest;
00083 unpack (dest);
00084 WORKER_ID worker_id;
00085 unpack (worker_id);
00086
00087
00088 initMessage ();
00089 pack (worker_id);
00090 pack (serv_id);
00091 serv -> packData ();
00092 serv -> notifySendingData ();
00093 sendMessage (dest, TASK_DATA_TAG);
00094 break;
00095 }
00096
00097 case TASK_DATA_TAG:
00098 {
00099 WORKER_ID worker_id;
00100 unpack (worker_id);
00101 Worker * worker = getWorker (worker_id);
00102 worker -> setSource (src);
00103 worker -> unpackData ();
00104 worker -> wakeUp ();
00105 break;
00106 }
00107
00108 case TASK_RESULT_TAG:
00109 {
00110 SERVICE_ID serv_id;
00111 unpack (serv_id);
00112 Service * serv = getService (serv_id);
00113 serv -> unpackResult ();
00114 break;
00115 }
00116
00117 case TASK_DONE_TAG:
00118 unpackTaskDone ();
00119 break;
00120
00121 default:
00122 ;
00123 };
00124 }
00125
00126 } while (! atLeastOneActiveThread () && atLeastOneActiveRunner () );
00127 }