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 <queue>
00038
00039 #include "scheduler.h"
00040 #include "tags.h"
00041 #include "mess.h"
00042 #include "../../core/peo_debug.h"
00043
00044 static std :: queue <SCHED_RESOURCE> resources;
00045
00046 static std :: queue <SCHED_REQUEST> requests;
00047
00048 static unsigned initNumberOfRes = 0;
00049
00050 void initScheduler () {
00051
00052 for (unsigned i = 0; i < the_schema.size (); i ++) {
00053
00054 const Node & node = the_schema [i];
00055
00056 if (node.rk_sched == my_node -> rk)
00057 for (unsigned j = 0; j < node.num_workers; j ++)
00058 resources.push (std :: pair <RANK_ID, WORKER_ID> (i, j + 1));
00059 }
00060 initNumberOfRes = resources.size ();
00061 }
00062
00063 bool allResourcesFree () {
00064
00065 return resources.size () == initNumberOfRes;
00066 }
00067
00068 static void update () {
00069
00070 unsigned num_alloc = std :: min (resources.size (), requests.size ());
00071
00072 for (unsigned i = 0; i < num_alloc; i ++) {
00073
00074 SCHED_REQUEST req = requests.front ();
00075 requests.pop ();
00076
00077 SCHED_RESOURCE res = resources.front ();
00078 resources.pop ();
00079
00080 printDebugMessage ("allocating a resource.");
00081 initMessage ();
00082 pack (req.second);
00083 pack (res);
00084 sendMessage (req.first, SCHED_RESULT_TAG);
00085 }
00086 }
00087
00088 void unpackResourceRequest () {
00089
00090 printDebugMessage ("queuing a resource request.");
00091 SCHED_REQUEST req;
00092 unpack (req);
00093 requests.push (req);
00094 update ();
00095 }
00096
00097 void unpackTaskDone () {
00098
00099 printDebugMessage ("I'm notified a worker is now idle.");
00100 SCHED_RESOURCE res;
00101 unpack (res);
00102 resources.push (res);
00103 if (resources.size () == initNumberOfRes)
00104 printDebugMessage ("all the resources are now free.");
00105 update ();
00106 }