00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <iostream>
00010 #include <assert.h>
00011
00012 #include "schema.h"
00013 #include "xml_parser.h"
00014 #include "comm.h"
00015 #include "node.h"
00016 #include "../../core/peo_debug.h"
00017
00018 std :: vector <Node> the_schema;
00019
00020 Node * my_node;
00021
00022 RANK_ID getRankOfRunner (RUNNER_ID __key) {
00023
00024 for (unsigned i = 0; i < the_schema.size (); i ++)
00025 for (unsigned j = 0; j < the_schema [i].id_run.size (); j ++)
00026 if (the_schema [i].id_run [j] == __key)
00027 return the_schema [i].rk;
00028 assert (false);
00029 return 0;
00030 }
00031
00032 static void loadNode (int __rk_sched) {
00033
00034 Node node;
00035
00036 node.rk_sched = __rk_sched;
00037
00038
00039 node.rk = getRankFromName (getAttributeValue ("name"));
00040
00041 node.num_workers = atoi (getAttributeValue ("num_workers").c_str ());
00042
00043 while (true) {
00044
00045
00046 std :: string name = getNextNode ();
00047 assert (name == "runner" || name == "node");
00048 if (name == "runner") {
00049
00050 node.id_run.push_back (atoi (getNextNode ().c_str ()));
00051
00052 assert (getNextNode () == "runner");
00053 }
00054 else {
00055
00056 the_schema.push_back (node);
00057 break;
00058 }
00059 }
00060 }
00061
00062 static void loadGroup () {
00063
00064 std :: string name;
00065
00066
00067 int rk_sched = getRankFromName (getAttributeValue ("scheduler"));
00068
00069 while (true) {
00070
00071
00072 name = getNextNode ();
00073 assert (name == "node" || name == "group");
00074 if (name == "node")
00075
00076 loadNode (rk_sched);
00077 else
00078
00079 break;
00080 }
00081 }
00082
00083 bool isScheduleNode () {
00084
00085 return my_node -> rk == my_node -> rk_sched;
00086 }
00087
00088 void loadSchema (const char * __filename) {
00089
00090 openXMLDocument (__filename);
00091
00092 std :: string name;
00093
00094
00095 name = getNextNode ();
00096 assert (name == "schema");
00097
00098 while (true) {
00099
00100
00101 name = getNextNode ();
00102 assert (name == "group" || name == "schema");
00103 if (name == "group")
00104
00105 loadGroup ();
00106 else
00107
00108 break;
00109 }
00110
00111
00112 for (unsigned i = 0; i < the_schema.size (); i ++)
00113 if (the_schema [i].rk == getNodeRank ())
00114 my_node = & (the_schema [i]);
00115
00116
00117 char mess [1000];
00118
00119 sprintf (mess, "my rank is %d", my_node -> rk);
00120 printDebugMessage (mess);
00121 if (isScheduleNode ())
00122 printDebugMessage ("I'am a scheduler");
00123 for (unsigned i = 0; i < my_node -> id_run.size (); i ++) {
00124 sprintf (mess, "I manage the runner %d", my_node -> id_run [i]);
00125 printDebugMessage (mess);
00126 }
00127 if (my_node -> num_workers) {
00128
00129 sprintf (mess, "I manage %d worker(s)", my_node -> num_workers);
00130 printDebugMessage (mess);
00131 }
00132
00133 closeXMLDocument ();
00134 }
00135