Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / teshsuite / s4u / seal-platform / seal-platform.cpp
1 /* Copyright (c) 2010-2023. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "simgrid/s4u.hpp"
7 namespace sg4 = simgrid::s4u;
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(seal_platform, "Messages specific for this s4u example");
10
11 class Sender {
12   long msg_size = 1e6; /* message size in bytes */
13   std::vector<sg4::Host*> hosts_;
14
15 public:
16   explicit Sender(const std::vector<sg4::Host*>& hosts) : hosts_{hosts} {}
17   void operator()() const
18   {
19     /* Vector in which we store all ongoing communications */
20     sg4::ActivitySet pending_comms;
21     /* Make a vector of the mailboxes to use */
22     std::vector<sg4::Mailbox*> mboxes;
23
24     std::string msg_content = "Hello, I'm alive and running on " + sg4::this_actor::get_host()->get_name();
25     for (const auto* host : hosts_) {
26       auto* payload = new std::string(msg_content);
27       /* Create a communication representing the ongoing communication, and store it in pending_comms */
28       auto* mbox = sg4::Mailbox::by_name(host->get_name());
29       mboxes.push_back(mbox);
30       sg4::CommPtr comm = mbox->put_async(payload, msg_size);
31       pending_comms.push(comm);
32     }
33
34     XBT_INFO("Done dispatching all messages");
35
36     /* Now that all message exchanges were initiated, wait for their completion in one single call */
37     pending_comms.wait_all();
38
39     XBT_INFO("Goodbye now!");
40   }
41 };
42
43 /* Receiver actor: wait for 1 message on the mailbox identified by the hostname */
44 class Receiver {
45 public:
46   void operator()() const
47   {
48     auto* mbox    = sg4::Mailbox::by_name(sg4::this_actor::get_host()->get_name());
49     auto received = mbox->get_unique<std::string>();
50     XBT_INFO("I got a '%s'.", received->c_str());
51
52     const sg4::Disk* disk = sg4::Host::current()->get_disks().front();
53     sg_size_t write_size  = disk->write(4e6);
54     XBT_INFO("Wrote %llu bytes on '%s'", write_size, disk->get_cname());
55   }
56 };
57
58 /*************************************************************************************************/
59 static sg4::NetZone* create_zone(const sg4::NetZone* root, const std::string& id)
60 {
61   auto* zone = sg4::create_star_zone(id)->set_parent(root);
62   constexpr int n_host = 2;
63
64   zone->set_gateway(zone->create_router("router" + id));
65   for (int i = 0; i < n_host; i++) {
66     std::string hostname = id + "-cpu-" + std::to_string(i);
67     auto* host           = zone->create_host(hostname, 1e9);
68     host->create_disk("disk-" + hostname, 1e9, 1e6);
69     const auto* link = zone->create_link("link-" + hostname, 1e9);
70     zone->add_route(host, nullptr, {link});
71   }
72   return zone;
73 }
74
75 /*************************************************************************************************/
76
77 int main(int argc, char* argv[])
78 {
79   sg4::Engine e(&argc, argv);
80
81   /* create platform: intentionally do not do the seal of objects */
82   auto* root  = sg4::create_full_zone("root");
83   auto* zoneA = create_zone(root, "A");
84   auto* zoneB = create_zone(root, "B");
85   const auto* link = root->create_link("root-link", 1e10);
86   root->add_route(zoneA, zoneB, {sg4::LinkInRoute(link)}, true);
87
88   std::vector<sg4::Host*> host_list = e.get_all_hosts();
89   /* create the sender actor running on first host */
90   sg4::Actor::create("sender", host_list[0], Sender(host_list));
91   /* create receiver in every host */
92   for (auto* host : host_list) {
93     sg4::Actor::create("receiver-" + host->get_name(), host, Receiver());
94   }
95
96   /* runs the simulation */
97   e.run();
98
99   return 0;
100 }