Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Examples of CPP versions of Msg
[simgrid.git] / examples / cxx / basic / Master.cxx
diff --git a/examples/cxx/basic/Master.cxx b/examples/cxx/basic/Master.cxx
new file mode 100644 (file)
index 0000000..f6e06d2
--- /dev/null
@@ -0,0 +1,110 @@
+#include "Master.hpp"\r
+#include "BasicTask.hpp"\r
+#include "FinalizeTask.hpp"\r
+#include <Host.hpp>\r
+#include <HostNotFoundException.hpp>\r
+\r
+#include <iostream>\r
+using namespace std;\r
+\r
+\r
+#ifndef BUFFMAX\r
+#define BUFFMAX 260\r
+#endif\r
+\r
+MSG_IMPLEMENT_DYNAMIC(Master, Process);\r
+\r
+int Master::main(int argc, char** argv)\r
+{\r
+       int channel = 0;\r
+       char buff[BUFFMAX + 1] = {0};\r
+       int numberOfTasks;              \r
+       double taskComputeSize;         \r
+       double taskCommunicateSize;\r
+\r
+       if (argc < 3) \r
+       {\r
+               cerr <<"Master needs 3 arguments" << endl;\r
+               exit(1);\r
+       }\r
+       \r
+       cout << "Hello I'm " << getName() << " on " << getHost().getName() << "!" << endl;\r
+       \r
+       int slaveCount = 0;\r
+       Host* slaves = NULL;\r
+       \r
+       cout << "argc=" <<  argc << endl;\r
+       \r
+       for (int i = 0; i< argc; i++)       \r
+               cout << "argv:" << argv[i] << endl;\r
+       \r
+       sscanf(argv[0],"%d", &numberOfTasks);\r
+       \r
+       sscanf(argv[1],"%lg", &taskComputeSize);\r
+       \r
+       sscanf(argv[2],"%lg", &taskCommunicateSize);\r
+       \r
+       BasicTaskPtr* todo = new BasicTaskPtr[numberOfTasks];\r
+       \r
+       for (int i = 0; i < numberOfTasks; i++) \r
+       {\r
+               sprintf(buff,"Task_%d",i);\r
+               todo[i] = new BasicTask(buff, taskComputeSize, taskCommunicateSize);\r
+               memset(buff, 0 , BUFFMAX + 1); \r
+       }\r
+       \r
+       slaveCount = argc - 3;\r
+       slaves = new Host[slaveCount];\r
+       \r
+       for(int i = 3; i < argc ; i++)  \r
+       {\r
+               try \r
+               {\r
+                       slaves[i-3] = Host::getByName(argv[i]);\r
+               }\r
+               \r
+               catch(HostNotFoundException e) \r
+               {\r
+                       cerr << e.toString() <<". Stopping Now!" << endl;\r
+                       exit(1);\r
+               }\r
+       }\r
+       \r
+       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Got slave(s) :"  << slaveCount << endl;\r
+       \r
+       for (int i = 0; i < slaveCount; i++)\r
+               cout <<"[" << getName() << ":" << getHost().getName() << "] " << "\t" << slaves[i].getName() << endl;\r
+       \r
+       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Got " << numberOfTasks << " task to process." << endl;\r
+       \r
+       for (int i = 0; i < numberOfTasks; i++) \r
+       {\r
+               cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Sending \"" << todo[i]->getName() << "\" to \"" << slaves[i % slaveCount].getName() << "\"" << endl;\r
+       \r
+               if(!strcmp(Host::currentHost().getName(), slaves[i % slaveCount].getName())) \r
+                       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Hey ! It's me ! ";\r
+       \r
+               slaves[i % slaveCount].put(channel, todo[i]);\r
+       }\r
+       \r
+       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Send completed" << endl;\r
+       \r
+       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "All tasks have been dispatched. Let's tell everybody the computation is over." << endl;\r
+       \r
+       for (int i = 0; i < slaveCount; i++) \r
+       {\r
+               slaves[i].put(channel, new FinalizeTask());\r
+       }\r
+       \r
+\r
+       for(int i = 0; i < numberOfTasks; i++)\r
+               delete todo[i];\r
+\r
+       delete[] todo;\r
+\r
+       delete[] slaves;\r
+       \r
+       cout <<"[" << getName() << ":" << getHost().getName() << "] " << "Goodbye now!" << endl;\r
+\r
+       return 0;\r
+}
\ No newline at end of file