1 /* Copyright (c) 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */
9 #include "surf/surfxml_parse.h" /* to override surf_parse and bypass the parser */
11 /* Create a log channel to have nice outputs. */
13 #include "xbt/asserts.h"
14 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
15 "Messages specific for this msg example");
17 #define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
19 MSG_error_t test_all(const char *platform_file);
22 int master(int argc, char *argv[]);
23 int slave(int argc, char *argv[]);
25 /** Emitter function */
26 int master(int argc, char *argv[])
29 m_host_t *slaves = NULL;
30 m_task_t *todo = NULL;
31 int number_of_tasks = 0;
32 double task_comp_size = 0;
33 double task_comm_size = 0;
35 _XBT_GNUC_UNUSED int read;
37 read = sscanf(argv[1], "%d", &number_of_tasks);
38 xbt_assert(read, "Invalid argument %s\n", argv[1]);
39 read = sscanf(argv[2], "%lg", &task_comp_size);
40 xbt_assert(read, "Invalid argument %s\n", argv[2]);
41 read = sscanf(argv[3], "%lg", &task_comm_size);
42 xbt_assert(read, "Invalid argument %s\n", argv[3]);
45 char sprintf_buffer[64];
47 todo = xbt_new0(m_task_t, number_of_tasks);
49 for (i = 0; i < number_of_tasks; i++) {
50 sprintf(sprintf_buffer, "Task_%d", i);
52 MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size,
57 { /* Process organisation */
58 slaves_count = argc - 4;
59 slaves = xbt_new0(m_host_t, slaves_count);
61 for (i = 4; i < argc; i++) {
62 slaves[i - 4] = MSG_get_host_by_name(argv[i]);
63 if (slaves[i - 4] == NULL) {
64 XBT_INFO("Unknown host %s. Stopping Now! ", argv[i]);
70 XBT_INFO("Got %d slave(s) :", slaves_count);
71 for (i = 0; i < slaves_count; i++)
72 XBT_INFO("\t %s", slaves[i]->name);
74 XBT_INFO("Got %d task to process :", number_of_tasks);
76 for (i = 0; i < number_of_tasks; i++)
77 XBT_INFO("\t\"%s\"", todo[i]->name);
79 for (i = 0; i < number_of_tasks; i++) {
80 XBT_INFO("Sending \"%s\" to \"%s\"",
81 todo[i]->name, slaves[i % slaves_count]->name);
82 if (MSG_host_self() == slaves[i % slaves_count]) {
83 XBT_INFO("Hey ! It's me ! :)");
85 MSG_task_send(todo[i], MSG_host_get_name(slaves[i % slaves_count]));
86 XBT_INFO("Send completed");
90 ("All tasks have been dispatched. Let's tell everybody the computation is over.");
91 for (i = 0; i < slaves_count; i++)
92 MSG_task_send(MSG_task_create("finalize", 0, 0, FINALIZE),
93 MSG_host_get_name(slaves[i]));
95 XBT_INFO("Goodbye now!");
101 /** Receiver function */
102 int slave(int argc, char *argv[])
104 XBT_INFO("I'm a slave");
106 m_task_t task = NULL;
108 a = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
110 XBT_INFO("Received \"%s\" ", MSG_task_get_name(task));
111 if (MSG_task_get_data(task) == FINALIZE) {
112 MSG_task_destroy(task);
115 XBT_INFO("Processing \"%s\" ", MSG_task_get_name(task));
116 MSG_task_execute(task);
117 XBT_INFO("\"%s\" done ", MSG_task_get_name(task));
118 MSG_task_destroy(task);
120 XBT_INFO("Hey ?! What's up ? ");
121 xbt_die("Unexpected behavior");
124 XBT_INFO("I'm done. See you!");
129 /** Bypass deployment **/
130 static int bypass_deployment(void)
134 static int surfxml_bufferstack_size = 2048;
135 static int surfxml_buffer_stack_stack_ptr = 0;
136 static int surfxml_buffer_stack_stack[1024];
137 /* allocating memory to the buffer, I think 2MB should be enough */
138 surfxml_bufferstack = xbt_new0(char, surfxml_bufferstack_size);
139 nb_host = MSG_get_host_number();
142 SURFXML_BUFFER_SET(platform_version, "3");
143 SURFXML_START_TAG(platform);
144 XBT_DEBUG("<platform version=\"3\">");
146 XBT_DEBUG(" <process host=\"c-0.me\" function=\"master\">");
147 SURFXML_BUFFER_SET(process_host, "c-0.me");
148 SURFXML_BUFFER_SET(process_function, "master");
149 SURFXML_BUFFER_SET(process_start_time, "-1.0");
150 SURFXML_BUFFER_SET(process_kill_time, "-1.0");
151 SURFXML_START_TAG(process);
153 XBT_DEBUG(" <argument value=\"%s\"/>",bprintf("%d",nb_host-1));
154 SURFXML_BUFFER_SET(argument_value, bprintf("%d",nb_host-1));
155 SURFXML_START_TAG(argument);
156 SURFXML_END_TAG(argument);
158 XBT_DEBUG(" <argument value=\"5000000\"/>");
159 SURFXML_BUFFER_SET(argument_value, "5000000");
160 SURFXML_START_TAG(argument);
161 SURFXML_END_TAG(argument);
163 XBT_DEBUG(" <argument value=\"100000\"/>");
164 SURFXML_BUFFER_SET(argument_value, "100000");
165 SURFXML_START_TAG(argument);
166 SURFXML_END_TAG(argument);
168 for(i=1 ; i<nb_host ; i++)
170 XBT_DEBUG(" <argument value=\"%s.me\"/>",bprintf("c-%d",i));
171 SURFXML_BUFFER_SET(argument_value, bprintf("c-%d.me",i));
172 SURFXML_START_TAG(argument);
173 SURFXML_END_TAG(argument);
175 XBT_DEBUG(" </process>");
176 SURFXML_END_TAG(process);
178 for(i=1 ; i<nb_host ; i++)
180 XBT_DEBUG(" <process host=\"%s.me\" function=\"slave\"/>",bprintf("c-%d",i));
181 SURFXML_BUFFER_SET(process_host, bprintf("c-%d.me",i));
182 SURFXML_BUFFER_SET(process_function, "slave");
183 SURFXML_BUFFER_SET(process_start_time, "-1.0");
184 SURFXML_BUFFER_SET(process_kill_time, "-1.0");
185 SURFXML_START_TAG(process);
186 SURFXML_END_TAG(process);
189 XBT_DEBUG("</platform>");
190 SURFXML_END_TAG(platform);
192 free(surfxml_bufferstack);
197 MSG_error_t test_all(const char *platform_file)
199 MSG_error_t res = MSG_OK;
200 MSG_create_environment(platform_file);
201 MSG_function_register("master", master);
202 MSG_function_register("slave", slave);
203 surf_parse = bypass_deployment;
204 MSG_launch_application(NULL);
208 XBT_INFO("Simulation time %g", MSG_get_clock());
210 } /* end_of_test_all */
214 int main(int argc, char *argv[])
216 MSG_error_t res = MSG_OK;
218 MSG_global_init(&argc, argv);
219 res = test_all(argv[1]);