Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of framagit.org:Adrien.Gougeon/simgrid into master
[simgrid.git] / teshsuite / s4u / host-on-off / host-on-off.cpp
1 /* Copyright (c) 2010-2020. 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/s4u.hpp"
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
10
11 static void worker()
12 {
13   const std::string* payload;
14   simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name("jupi");
15
16   while (true) {
17     try {
18       payload = static_cast<std::string*>(mailbox->get());
19     } catch (const simgrid::HostFailureException&) {
20       XBT_DEBUG("The host has been turned off, this was expected");
21       return;
22     }
23
24     if (*payload == "finalize") {
25       delete payload;
26       break;
27     }
28     simgrid::s4u::this_actor::execute(5E7);
29
30     XBT_INFO("Task \"%s\" done", payload->c_str());
31     delete payload;
32   }
33   XBT_INFO("I'm done. See you!");
34 }
35
36 static void master()
37 {
38   simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name("jupi");
39   simgrid::s4u::Host* jupiter    = simgrid::s4u::Host::by_name("Jupiter");
40
41   std::string* payload = new std::string("task on");
42
43   XBT_INFO("Sending \"task on\"");
44   mailbox->put_async(payload, 1E6)->wait_for(1);
45
46   simgrid::s4u::this_actor::sleep_for(1);
47   jupiter->turn_off();
48
49   XBT_INFO("Sending \"task off\"");
50   payload = new std::string("task off");
51   try {
52     mailbox->put_async(payload, 1E6)->wait_for(1);
53   } catch (const simgrid::TimeoutException&) {
54     delete payload;
55   }
56
57   jupiter->turn_on();
58
59   std::vector<simgrid::s4u::ActorPtr> jupi_actors = jupiter->get_all_actors();
60   for (const auto& actor : jupi_actors)
61     actor->kill();
62
63   XBT_INFO("Sending \"task on without actor\"");
64   payload = new std::string("task on without actor");
65   try {
66     mailbox->put_async(payload, 1E6)->wait_for(1);
67   } catch (const simgrid::TimeoutException&) {
68     delete payload;
69   }
70
71   simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Jupiter"), worker);
72
73   XBT_INFO("Sending \"task on with actor\"");
74   payload = new std::string("task on with actor");
75   try {
76     mailbox->put_async(payload, 1E6)->wait_for(1);
77   } catch (const simgrid::TimeoutException&) {
78     delete payload;
79   }
80
81   XBT_INFO("Sending \"finalize\"");
82   payload = new std::string("finalize");
83   try {
84     mailbox->put_async(payload, 0)->wait_for(1);
85   } catch (const simgrid::TimeoutException&) {
86     delete payload;
87   }
88
89   XBT_INFO("Goodbye now!");
90 }
91
92 int main(int argc, char* argv[])
93 {
94   simgrid::s4u::Engine e(&argc, argv);
95   xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]);
96
97   e.load_platform(argv[1]);
98
99   simgrid::s4u::Actor::create("master", simgrid::s4u::Host::by_name("Tremblay"), master);
100   simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Jupiter"), worker);
101
102   e.run();
103
104   XBT_INFO("Simulation time %g", e.get_clock());
105
106   return 0;
107 }