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 <set>
00038 #include <cassert>
00039
00040 #include "schema.h"
00041 #include "xml_parser.h"
00042 #include "comm.h"
00043 #include "node.h"
00044 #include "../../core/peo_debug.h"
00045
00046
00047 std :: vector <Node> the_schema;
00048
00049 Node * my_node;
00050
00051 static unsigned maxSpecifiedRunnerID = 0;
00052
00053
00054 RANK_ID getRankOfRunner (RUNNER_ID __key)
00055 {
00056
00057 for (unsigned i = 0; i < the_schema.size (); i ++)
00058 for (unsigned j = 0; j < the_schema [i].id_run.size (); j ++)
00059 if (the_schema [i].id_run [j] == __key)
00060 return the_schema [i].rk;
00061 assert (false);
00062 return 0;
00063 }
00064
00065 static void loadNode (int __rk_sched)
00066 {
00067
00068 Node node;
00069
00070 node.rk_sched = __rk_sched;
00071
00072
00073 node.rk = getRankFromName (getAttributeValue ("name"));
00074
00075 node.num_workers = atoi (getAttributeValue ("num_workers").c_str ());
00076
00077 while (true)
00078 {
00079
00080
00081 std :: string name = getNextNode ();
00082 assert (name == "runner" || name == "node");
00083 if (name == "runner")
00084 {
00085
00086 node.id_run.push_back (atoi (getNextNode ().c_str ()));
00087 if ( node.id_run.back() > maxSpecifiedRunnerID )
00088 maxSpecifiedRunnerID = node.id_run.back();
00089
00090 assert (getNextNode () == "runner");
00091 }
00092 else
00093 {
00094
00095 node.execution_id_run = node.id_run;
00096 the_schema.push_back (node);
00097 break;
00098 }
00099 }
00100 }
00101
00102 static void loadGroup ()
00103 {
00104
00105 std :: string name;
00106
00107
00108 int rk_sched = getRankFromName (getAttributeValue ("scheduler"));
00109
00110 while (true)
00111 {
00112
00113
00114 name = getNextNode ();
00115 assert (name == "node" || name == "group");
00116 if (name == "node")
00117
00118 loadNode (rk_sched);
00119 else
00120
00121 break;
00122 }
00123 }
00124
00125 bool isScheduleNode ()
00126 {
00127
00128 return my_node -> rk == my_node -> rk_sched;
00129 }
00130
00131 void loadSchema (const char * __filename)
00132 {
00133
00134 openXMLDocument (__filename);
00135
00136 std :: string name;
00137
00138
00139 name = getNextNode ();
00140 assert (name == "schema");
00141
00142 the_schema.clear();
00143 maxSpecifiedRunnerID = 0;
00144
00145 while (true)
00146 {
00147
00148
00149 name = getNextNode ();
00150 assert (name == "group" || name == "schema");
00151 if (name == "group")
00152
00153 loadGroup ();
00154 else
00155
00156 break;
00157 }
00158
00159
00160 std :: set<unsigned> uniqueRunnerIDs;
00161 unsigned nbUniqueIDs = 0;
00162 for (unsigned i = 0; i < the_schema.size (); i ++)
00163 {
00164 for (unsigned j = 0; j < the_schema [i].id_run.size(); j ++)
00165 {
00166 uniqueRunnerIDs.insert( the_schema [i].id_run[j] );
00167
00168 if ( uniqueRunnerIDs.size() == nbUniqueIDs )
00169 {
00170 the_schema [i].execution_id_run[j] = ++maxSpecifiedRunnerID;
00171 }
00172 nbUniqueIDs = uniqueRunnerIDs.size();
00173 }
00174 }
00175
00176
00177 for (unsigned i = 0; i < the_schema.size (); i ++)
00178 {
00179 if (the_schema [i].rk == getNodeRank ())
00180 my_node = & (the_schema [i]);
00181 }
00182
00183
00184
00185 char mess [1000];
00186
00187 sprintf (mess, "my rank is %d", my_node -> rk);
00188 printDebugMessage (mess);
00189
00190 if (isScheduleNode ())
00191 printDebugMessage ("I'am a scheduler");
00192
00193 for (unsigned i = 0; i < my_node -> id_run.size (); i ++)
00194 {
00195 sprintf (mess, "I manage the runner %d", my_node -> id_run [i]);
00196 printDebugMessage (mess);
00197 }
00198
00199 if (my_node -> num_workers)
00200 {
00201
00202 sprintf (mess, "I manage %d worker(s)", my_node -> num_workers);
00203 printDebugMessage (mess);
00204 }
00205
00206 closeXMLDocument ();
00207 }