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 <iostream>
00038 #include <assert.h>
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 std :: vector <Node> the_schema;
00047
00048 Node * my_node;
00049
00050 RANK_ID getRankOfRunner (RUNNER_ID __key) {
00051
00052 for (unsigned i = 0; i < the_schema.size (); i ++)
00053 for (unsigned j = 0; j < the_schema [i].id_run.size (); j ++)
00054 if (the_schema [i].id_run [j] == __key)
00055 return the_schema [i].rk;
00056 assert (false);
00057 return 0;
00058 }
00059
00060 static void loadNode (int __rk_sched) {
00061
00062 Node node;
00063
00064 node.rk_sched = __rk_sched;
00065
00066
00067 node.rk = getRankFromName (getAttributeValue ("name"));
00068
00069 node.num_workers = atoi (getAttributeValue ("num_workers").c_str ());
00070
00071 while (true) {
00072
00073
00074 std :: string name = getNextNode ();
00075 assert (name == "runner" || name == "node");
00076 if (name == "runner") {
00077
00078 node.id_run.push_back (atoi (getNextNode ().c_str ()));
00079
00080 assert (getNextNode () == "runner");
00081 }
00082 else {
00083
00084 the_schema.push_back (node);
00085 break;
00086 }
00087 }
00088 }
00089
00090 static void loadGroup () {
00091
00092 std :: string name;
00093
00094
00095 int rk_sched = getRankFromName (getAttributeValue ("scheduler"));
00096
00097 while (true) {
00098
00099
00100 name = getNextNode ();
00101 assert (name == "node" || name == "group");
00102 if (name == "node")
00103
00104 loadNode (rk_sched);
00105 else
00106
00107 break;
00108 }
00109 }
00110
00111 bool isScheduleNode () {
00112
00113 return my_node -> rk == my_node -> rk_sched;
00114 }
00115
00116 void loadSchema (const char * __filename) {
00117
00118 openXMLDocument (__filename);
00119
00120 std :: string name;
00121
00122
00123 name = getNextNode ();
00124 assert (name == "schema");
00125
00126 while (true) {
00127
00128
00129 name = getNextNode ();
00130 assert (name == "group" || name == "schema");
00131 if (name == "group")
00132
00133 loadGroup ();
00134 else
00135
00136 break;
00137 }
00138
00139
00140 for (unsigned i = 0; i < the_schema.size (); i ++)
00141 if (the_schema [i].rk == getNodeRank ())
00142 my_node = & (the_schema [i]);
00143
00144
00145 char mess [1000];
00146
00147 sprintf (mess, "my rank is %d", my_node -> rk);
00148 printDebugMessage (mess);
00149 if (isScheduleNode ())
00150 printDebugMessage ("I'am a scheduler");
00151 for (unsigned i = 0; i < my_node -> id_run.size (); i ++) {
00152 sprintf (mess, "I manage the runner %d", my_node -> id_run [i]);
00153 printDebugMessage (mess);
00154 }
00155 if (my_node -> num_workers) {
00156
00157 sprintf (mess, "I manage %d worker(s)", my_node -> num_workers);
00158 printDebugMessage (mess);
00159 }
00160
00161 closeXMLDocument ();
00162 }
00163