-/* $Id: masterslave_forwarder.c 5108 2007-12-04 16:29:05Z mquinson $ */\r
-\r
-/* Copyright (c) 2002,2003,2004 Arnaud Legrand. All rights reserved. */\r
-\r
-/* This program is free software; you can redistribute it and/or modify it\r
- * under the terms of the license (GNU LGPL) which comes with this package. */\r
-\r
-#include <stdio.h>\r
-#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */\r
-#include "xbt/sysdep.h" /* calloc, printf */\r
-\r
-/* Create a log channel to have nice outputs. */\r
-#include "xbt/log.h"\r
-#include "xbt/asserts.h"\r
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,"Messages specific for this msg example");\r
-\r
-\r
-typedef enum {\r
- PORT_22 = 0,\r
- MAX_CHANNEL\r
-} channel_t;\r
-\r
-int master(int argc, char *argv[]);\r
-int slave(int argc, char *argv[]);\r
-int forwarder(int argc, char *argv[]);\r
-MSG_error_t test_all(const char *platform_file, const char *application_file);\r
-\r
-\r
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */\r
-\r
-/** Emitter function */\r
-int master(int argc, char *argv[])\r
-{\r
- int alias_count = 0;\r
- char** aliases = NULL;\r
- m_task_t *todo = NULL;\r
- int number_of_tasks = 0;\r
- double task_comp_size = 0;\r
- double task_comm_size = 0;\r
-\r
-\r
- int i;\r
-\r
- xbt_assert1(sscanf(argv[1],"%d", &number_of_tasks),"Invalid argument %s\n",argv[1]);\r
- xbt_assert1(sscanf(argv[2],"%lg", &task_comp_size),"Invalid argument %s\n",argv[2]);\r
- xbt_assert1(sscanf(argv[3],"%lg", &task_comm_size),"Invalid argument %s\n",argv[3]);\r
-\r
- {\r
- /* Task creation */\r
- char sprintf_buffer[64];\r
-\r
- todo = xbt_new0(m_task_t,number_of_tasks);\r
-\r
- for (i = 0; i < number_of_tasks; i++) \r
- {\r
- sprintf(sprintf_buffer, "Task_%d", i);\r
- todo[i] = MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size, NULL);\r
- }\r
- }\r
-\r
- { \r
- /* Process organisation */\r
- alias_count = argc - 4;\r
- aliases = xbt_new0(char*,alias_count);\r
-\r
- for(i = 4; i < argc; i++) \r
- {\r
- aliases[i-4] = strdup(argv[i]);\r
- }\r
- }\r
-\r
- INFO2("Got %d aliases and %d tasks to process", alias_count,number_of_tasks);\r
- \r
- for (i = 0; i < alias_count; i++)\r
- DEBUG1("%s", aliases[i]);\r
-\r
- for (i = 0; i < number_of_tasks; i++) \r
- {\r
- INFO2("Sending \"%s\" to \"%s\"",todo[i]->name,aliases[i % alias_count]);\r
- \r
- if(!strcmp(MSG_host_get_name(MSG_host_self()), aliases[i % alias_count])) \r
- {\r
- INFO0("Hey ! It's me ! :)");\r
- }\r
-\r
- MSG_task_send(todo[i], aliases[i % alias_count]);\r
- INFO0("Sent");\r
- }\r
-\r
- INFO0("All tasks have been dispatched. Let's tell everybody the computation is over.");\r
- \r
- for (i = 0; i < alias_count; i++) \r
- MSG_task_send(MSG_task_create("finalize", 0, 0, FINALIZE),aliases[i]);\r
-\r
- INFO0("Goodbye now!");\r
- \r
- for(i = 0; i < alias_count; i++)\r
- free(aliases[i]);\r
- \r
- free(aliases);\r
- free(todo);\r
- return 0;\r
-} /* end_of_master */\r
-\r
-/** Receiver function */\r
-int slave(int argc, char *argv[])\r
-{\r
- m_task_t task = NULL;\r
- int res;\r
- \r
- while(1) \r
- {\r
- res = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));\r
- xbt_assert0(res == MSG_OK, "MSG_task_receive failed");\r
- \r
- INFO1("Received \"%s\"", MSG_task_get_name(task));\r
- \r
- if (!strcmp(MSG_task_get_name(task),"finalize")) \r
- {\r
- MSG_task_destroy(task);\r
- break;\r
- }\r
-\r
- INFO1("Processing \"%s\"", MSG_task_get_name(task));\r
- MSG_task_execute(task);\r
- INFO1("\"%s\" done", MSG_task_get_name(task));\r
- MSG_task_destroy(task);\r
- task = NULL;\r
- }\r
- \r
- INFO0("I'm done. See you!");\r
- return 0;\r
-} /* end_of_slave */\r
-\r
-/** Forwarder function */\r
-int forwarder(int argc, char *argv[])\r
-{\r
- int i;\r
- int alias_count;\r
- char** aliases;\r
- \r
- { /* Process organisation */\r
- alias_count = argc - 1;\r
- aliases = xbt_new0(char*,alias_count);\r
- \r
- for (i = 1; i < argc; i++) \r
- aliases[i-1] =strdup(argv[i]);\r
- }\r
-\r
- i=0;\r
- \r
- while(1) \r
- {\r
- m_task_t task = NULL;\r
- int a;\r
- \r
- a = MSG_task_receive(&(task),MSG_host_get_name(MSG_host_self()));\r
- \r
- if (a == MSG_OK) \r
- {\r
- INFO1("Received \"%s\"", MSG_task_get_name(task));\r
- \r
- if(MSG_task_get_data(task)==FINALIZE) \r
- {\r
- INFO0("All tasks have been dispatched. Let's tell everybody the computation is over.");\r
- \r
- for (i = 0; i < alias_count; i++) \r
- MSG_task_send(MSG_task_create("finalize", 0, 0, FINALIZE),aliases[i]);\r
- \r
- MSG_task_destroy(task);\r
- break;\r
- }\r
- \r
- INFO2("Sending \"%s\" to \"%s\"",MSG_task_get_name(task),aliases[i% alias_count]);\r
- MSG_task_send(task, aliases[i % alias_count]);\r
- i++;\r
- } \r
- else \r
- {\r
- INFO0("Hey ?! What's up ? ");\r
- xbt_assert0(0,"Unexpected behavior");\r
- }\r
- }\r
- \r
- for(i = 0; i < alias_count; i++)\r
- free(aliases[i]);\r
-\r
- INFO0("I'm done. See you!");\r
- return 0;\r
- \r
-} /* end_of_forwarder */\r
-\r
-/** Test function */\r
-MSG_error_t test_all(const char *platform_file,const char *application_file)\r
-{\r
- MSG_error_t res = MSG_OK;\r
-\r
- { /* Simulation setting */\r
- MSG_set_channel_number(MAX_CHANNEL);\r
- MSG_paje_output("msg_test.trace");\r
- MSG_create_environment(platform_file);\r
- }\r
- \r
- {\r
- /* Application deployment */\r
- MSG_function_register("master", master);\r
- MSG_function_register("slave", slave);\r
- MSG_function_register("forwarder", forwarder);\r
- MSG_launch_application(application_file);\r
- }\r
- \r
- res = MSG_main();\r
-\r
- INFO1("Simulation time %g",MSG_get_clock());\r
- return res;\r
-} /* end_of_test_all */\r
-\r
-\r
-/** Main function */\r
-int main(int argc, char *argv[])\r
-{\r
- MSG_error_t res = MSG_OK;\r
- \r
- MSG_global_init(&argc,argv);\r
- \r
- if (argc < 3) \r
- {\r
- printf ("Usage: %s platform_file deployment_file\n",argv[0]);\r
- printf ("example: %s msg_platform.xml msg_deployment.xml\n",argv[0]);\r
- exit(1);\r
- }\r
- \r
- res = test_all(argv[1],argv[2]);\r
- MSG_clean();\r
- \r
- if(res==MSG_OK)\r
- return 0;\r
- else\r
- return 1;\r
-} /* end_of_main */\r
+/* Copyright (c) 2008, 2010. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+
+typedef enum {
+ PORT_22 = 0,
+ MAX_CHANNEL
+} channel_t;
+
+int master(int argc, char *argv[]);
+int slave(int argc, char *argv[]);
+int forwarder(int argc, char *argv[]);
+MSG_error_t test_all(const char *platform_file,
+ const char *application_file);
+
+
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
+
+/** Emitter function */
+int master(int argc, char *argv[])
+{
+ int alias_count = 0;
+ char **aliases = NULL;
+ m_task_t *todo = NULL;
+ int number_of_tasks = 0;
+ double task_comp_size = 0;
+ double task_comm_size = 0;
+
+
+ int i;
+
+ xbt_assert1(sscanf(argv[1], "%d", &number_of_tasks),
+ "Invalid argument %s\n", argv[1]);
+ xbt_assert1(sscanf(argv[2], "%lg", &task_comp_size),
+ "Invalid argument %s\n", argv[2]);
+ xbt_assert1(sscanf(argv[3], "%lg", &task_comm_size),
+ "Invalid argument %s\n", argv[3]);
+
+ {
+ /* Task creation */
+ char sprintf_buffer[64];
+
+ todo = xbt_new0(m_task_t, number_of_tasks);
+
+ for (i = 0; i < number_of_tasks; i++) {
+ sprintf(sprintf_buffer, "Task_%d", i);
+ todo[i] =
+ MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size,
+ NULL);
+ }
+ }
+
+ {
+ /* Process organisation */
+ alias_count = argc - 4;
+ aliases = xbt_new0(char *, alias_count);
+
+ for (i = 4; i < argc; i++) {
+ aliases[i - 4] = strdup(argv[i]);
+ }
+ }
+
+ INFO2("Got %d aliases and %d tasks to process", alias_count,
+ number_of_tasks);
+
+ for (i = 0; i < alias_count; i++)
+ DEBUG1("%s", aliases[i]);
+
+ for (i = 0; i < number_of_tasks; i++) {
+ INFO2("Sending \"%s\" to \"%s\"", todo[i]->name,
+ aliases[i % alias_count]);
+
+ if (!strcmp
+ (MSG_host_get_name(MSG_host_self()), aliases[i % alias_count])) {
+ INFO0("Hey ! It's me ! :)");
+ }
+
+ MSG_task_send(todo[i], aliases[i % alias_count]);
+ INFO0("Sent");
+ }
+
+ INFO0
+ ("All tasks have been dispatched. Let's tell everybody the computation is over.");
+
+ for (i = 0; i < alias_count; i++)
+ MSG_task_send(MSG_task_create("finalize", 0, 0, FINALIZE), aliases[i]);
+
+ INFO0("Goodbye now!");
+
+ for (i = 0; i < alias_count; i++)
+ free(aliases[i]);
+
+ free(aliases);
+ free(todo);
+ return 0;
+} /* end_of_master */
+
+/** Receiver function */
+int slave(int argc, char *argv[])
+{
+ m_task_t task = NULL;
+ int res;
+
+ while (1) {
+ res = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
+ xbt_assert0(res == MSG_OK, "MSG_task_receive failed");
+
+ INFO1("Received \"%s\"", MSG_task_get_name(task));
+
+ if (!strcmp(MSG_task_get_name(task), "finalize")) {
+ MSG_task_destroy(task);
+ break;
+ }
+
+ INFO1("Processing \"%s\"", MSG_task_get_name(task));
+ MSG_task_execute(task);
+ INFO1("\"%s\" done", MSG_task_get_name(task));
+ MSG_task_destroy(task);
+ task = NULL;
+ }
+
+ INFO0("I'm done. See you!");
+ return 0;
+} /* end_of_slave */
+
+/** Forwarder function */
+int forwarder(int argc, char *argv[])
+{
+ int i;
+ int alias_count;
+ char **aliases;
+
+ { /* Process organisation */
+ alias_count = argc - 1;
+ aliases = xbt_new0(char *, alias_count);
+
+ for (i = 1; i < argc; i++)
+ aliases[i - 1] = strdup(argv[i]);
+ }
+
+ i = 0;
+
+ while (1) {
+ m_task_t task = NULL;
+ int a;
+
+ a = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
+
+ if (a == MSG_OK) {
+ INFO1("Received \"%s\"", MSG_task_get_name(task));
+
+ if (MSG_task_get_data(task) == FINALIZE) {
+ INFO0
+ ("All tasks have been dispatched. Let's tell everybody the computation is over.");
+
+ for (i = 0; i < alias_count; i++)
+ MSG_task_send(MSG_task_create("finalize", 0, 0, FINALIZE),
+ aliases[i]);
+
+ MSG_task_destroy(task);
+ break;
+ }
+
+ INFO2("Sending \"%s\" to \"%s\"", MSG_task_get_name(task),
+ aliases[i % alias_count]);
+ MSG_task_send(task, aliases[i % alias_count]);
+ i++;
+ } else {
+ INFO0("Hey ?! What's up ? ");
+ xbt_assert0(0, "Unexpected behavior");
+ }
+ }
+
+ for (i = 0; i < alias_count; i++)
+ free(aliases[i]);
+
+ INFO0("I'm done. See you!");
+ return 0;
+
+} /* end_of_forwarder */
+
+/** Test function */
+MSG_error_t test_all(const char *platform_file,
+ const char *application_file)
+{
+ MSG_error_t res = MSG_OK;
+
+ { /* Simulation setting */
+ MSG_set_channel_number(MAX_CHANNEL);
+ MSG_paje_output("msg_test.trace");
+ MSG_create_environment(platform_file);
+ }
+
+ {
+ /* Application deployment */
+ MSG_function_register("master", master);
+ MSG_function_register("slave", slave);
+ MSG_function_register("forwarder", forwarder);
+ MSG_launch_application(application_file);
+ }
+
+ res = MSG_main();
+
+ INFO1("Simulation time %g", MSG_get_clock());
+ return res;
+} /* end_of_test_all */
+
+
+/** Main function */
+int main(int argc, char *argv[])
+{
+ MSG_error_t res = MSG_OK;
+
+ MSG_global_init(&argc, argv);
+
+ if (argc < 3) {
+ printf("Usage: %s platform_file deployment_file\n", argv[0]);
+ printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]);
+ exit(1);
+ }
+
+ res = test_all(argv[1], argv[2]);
+ MSG_clean();
+
+ if (res == MSG_OK)
+ return 0;
+ else
+ return 1;
+} /* end_of_main */