Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
keep playing
[simgrid.git] / examples / msg / platform-failures / platform-failures.c
1 /* Copyright (c) 2007-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include "simgrid/msg.h"
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
10
11 #define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
12
13 static int master(int argc, char *argv[])
14 {
15   int i;
16
17   long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");
18   double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");
19   double task_comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");
20   long workers_count = xbt_str_parse_int(argv[4], "Invalid amount of workers: %s");
21
22   XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, number_of_tasks);
23
24   for (i = 0; i < number_of_tasks; i++) {
25     char mailbox[256];
26     snprintf(mailbox, 255, "worker-%ld", i % workers_count);
27
28     msg_task_t task = MSG_task_create("Task", task_comp_size, task_comm_size, xbt_new0(double, 1));
29     *((double *) task->data) = MSG_get_clock();
30
31     msg_error_t a = MSG_task_send_with_timeout(task,mailbox,10.0);
32
33     if (a == MSG_OK) {
34       XBT_INFO("Send completed");
35     } else if (a == MSG_HOST_FAILURE) {
36       XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
37       free(task->data);
38       MSG_task_destroy(task);
39       return 0;
40     } else if (a == MSG_TRANSFER_FAILURE) {
41       XBT_INFO("Mmh. Something went wrong with '%s'. Nevermind. Let's keep going!", mailbox);
42       free(task->data);
43       MSG_task_destroy(task);
44     } else if (a == MSG_TIMEOUT) {
45       XBT_INFO ("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox);
46       free(task->data);
47       MSG_task_destroy(task);
48     } else {
49       XBT_INFO("Hey ?! What's up ? ");
50       xbt_die( "Unexpected behavior");
51     }
52   }
53
54   XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
55   for (i = 0; i < workers_count; i++) {
56     char mailbox[256];
57     snprintf(mailbox, 255, "worker-%ld", i % workers_count);
58     msg_task_t task = MSG_task_create("finalize", 0, 0, FINALIZE);
59     int a = MSG_task_send_with_timeout(task,mailbox,1.0);
60     if (a != MSG_OK){
61       MSG_task_destroy(task);
62     }
63     if (a == MSG_HOST_FAILURE) {
64       XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
65       return 0;
66     } else if (a == MSG_TRANSFER_FAILURE) {
67       XBT_INFO("Mmh. Can't reach '%s'! Nevermind. Let's keep going!", mailbox);
68     } else if (a == MSG_TIMEOUT) {
69       XBT_INFO("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox);
70     } else if (a != MSG_OK){
71       XBT_INFO("Hey ?! What's up ? ");
72       xbt_die("Unexpected behavior with '%s': %d", mailbox, a);
73     }
74   }
75
76   XBT_INFO("Goodbye now!");
77   return 0;
78 }
79
80 static int worker(int argc, char *argv[])
81 {
82   msg_task_t task = NULL;
83   char mailbox[80];
84
85   long id= xbt_str_parse_int(argv[1], "Invalid argument %s");
86
87   snprintf(mailbox, 79,"worker-%ld", id);
88
89   while (1) {
90     double time1 = MSG_get_clock();
91     int a = MSG_task_receive( &(task), mailbox);
92     double time2 = MSG_get_clock();
93     if (a == MSG_OK) {
94       XBT_INFO("Received \"%s\"", MSG_task_get_name(task));
95       if (MSG_task_get_data(task) == FINALIZE) {
96         MSG_task_destroy(task);
97         task = NULL;
98         break;
99       }
100       if (time1 < *((double *) task->data))
101         time1 = *((double *) task->data);
102       XBT_INFO("Communication time : \"%f\"", time2 - time1);
103       XBT_INFO("Processing \"%s\"", MSG_task_get_name(task));
104       a = MSG_task_execute(task);
105       if (a == MSG_OK) {
106         XBT_INFO("\"%s\" done", MSG_task_get_name(task));
107         free(task->data);
108         MSG_task_destroy(task);
109         task = NULL;
110       } else if (a == MSG_HOST_FAILURE) {
111         XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
112         free(task->data);
113         MSG_task_destroy(task);
114         task = NULL;
115         return 0;
116       } else {
117         XBT_INFO("Hey ?! What's up ? ");
118         xbt_die("Unexpected behavior");
119       }
120     } else if (a == MSG_HOST_FAILURE) {
121       XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
122       return 0;
123     } else if (a == MSG_TRANSFER_FAILURE) {
124       XBT_INFO("Mmh. Something went wrong. Nevermind. Let's keep going!");
125     } else {
126       XBT_INFO("Hey ?! What's up ? ");
127       xbt_die("Unexpected behavior");
128     }
129   }
130   XBT_INFO("I'm done. See you!");
131   return 0;
132 }
133
134 int main(int argc, char *argv[])
135 {
136   msg_error_t res = MSG_OK;
137
138   MSG_init(&argc, argv);
139   xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
140              "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
141
142   MSG_create_environment(argv[1]);
143
144   MSG_function_register("master", master);
145   MSG_function_register("worker", worker);
146   MSG_launch_application(argv[2]);
147
148   res = MSG_main();
149
150   XBT_INFO("Simulation time %g", MSG_get_clock());
151
152   return res != MSG_OK;
153 }