Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
IIUC return std::move(...) is discouraged.
[simgrid.git] / teshsuite / s4u / comm-pt2pt / comm-pt2pt.cpp
1 /* Copyright (c) 2010-2019. 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 /* We want this test to be exhaustive in term of:
7  *   - communication involved (regular, asynchronous, detached, with a permanent receiver declared)
8  *   - whether the send or the receive was posted first
9  *
10  * FIXME: Missing elements: timeouts, host/actor failures, link failures
11  */
12
13 #include "simgrid/s4u.hpp"
14
15 #include <cstring>
16
17 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
18
19 static void usage(const char* binaryName, const char* defaultSend, const char* defaultRecv)
20 {
21   std::fprintf(stderr, "Usage: %s examples/platforms/cluster_backbone.xml <send_spec> <recv_spec>\n"
22                        "where spec is a list of letters giving the kind of tests you want to see.\n"
23                        "Existing sender spec:\n"
24                        " r regular send\n"
25                        " R regular send (after a little delay)\n"
26                        " i asynchronous isend\n"
27                        " I asynchronous isend (after a little delay)\n"
28                        " d detached send\n"
29                        " D detached send (after a little delay)\n"
30                        "Existing receiver spec:\n"
31                        " r regular receive\n"
32                        " R regular receive (after a little delay)\n"
33                        " i asynchronous irecv\n"
34                        " I asynchronous irecv (after a little delay)\n"
35                        " p regular receive on permanent mailbox (after a little delay)\n"
36                        " P regular receive on permanent mailbox (after a little delay)\n"
37                        " j irecv on permanent mailbox (after a little delay)\n"
38                        " J irecv on permanent mailbox (after a little delay)\n"
39                        "\n"
40                        "Example 1: %s examples/platforms/cluster_backbone.xml rRiIdD rrrrrr # testing all send functions\n"
41                        "Default specs: %s %s (all possible pairs)\n",
42                binaryName, binaryName, defaultSend, defaultRecv);
43   exit(1);
44 }
45
46 static void sender(std::vector<std::string> args)
47 {
48   XBT_INFO("Sender spec: %s", args[0].c_str());
49   for (unsigned int test = 1; test <= args[0].size(); test++) {
50     simgrid::s4u::this_actor::sleep_until(test * 5 - 5);
51     std::string* mboxName         = new std::string("Test #" + std::to_string(test));
52     simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName->c_str());
53
54     switch (args[0][test - 1]) {
55       case 'r':
56         XBT_INFO("Test %u: r (regular send)", test);
57         mbox->put((void*)mboxName, 42.0);
58         break;
59       case 'R':
60         XBT_INFO("Test %u: R (sleep + regular send)", test);
61         simgrid::s4u::this_actor::sleep_for(0.5);
62         mbox->put((void*)mboxName, 42.0);
63         break;
64
65       case 'i':
66         XBT_INFO("Test %u: i (asynchronous isend)", test);
67         mbox->put_async((void*)mboxName, 42.0)->wait();
68         break;
69       case 'I':
70         XBT_INFO("Test %u: I (sleep + isend)", test);
71         simgrid::s4u::this_actor::sleep_for(0.5);
72         mbox->put_async((void*)mboxName, 42.0)->wait();
73         break;
74
75       case 'd':
76         XBT_INFO("Test %u: d (detached send)", test);
77         mbox->put_init((void*)mboxName, 42.0)->detach();
78         break;
79       case 'D':
80         XBT_INFO("Test %u: D (sleep + detached send)", test);
81         simgrid::s4u::this_actor::sleep_for(0.5);
82         mbox->put_init((void*)mboxName, 42.0)->detach();
83         break;
84       default:
85         xbt_die("Unknown sender spec for test %u: '%c'", test, args[0][test - 1]);
86     }
87     XBT_INFO("Test %u OK", test);
88   }
89   simgrid::s4u::this_actor::sleep_for(0.5);
90   // FIXME: we should test what happens when the process ends before the end of remote comm instead of hiding it
91 }
92
93 static void receiver(std::vector<std::string> args)
94 {
95   XBT_INFO("Receiver spec: %s", args[0].c_str());
96   for (unsigned int test = 1; test <= args[0].size(); test++) {
97     simgrid::s4u::this_actor::sleep_until(test * 5 - 5);
98     std::string mboxName          = "Test #" + std::to_string(test);
99     simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName.c_str());
100     void* received                = nullptr;
101
102     switch (args[0][test - 1]) {
103       case 'r':
104         XBT_INFO("Test %u: r (regular receive)", test);
105         received = mbox->get();
106         break;
107       case 'R':
108         XBT_INFO("Test %u: R (sleep + regular receive)", test);
109         simgrid::s4u::this_actor::sleep_for(0.5);
110         received = mbox->get();
111         break;
112
113       case 'i':
114         XBT_INFO("Test %u: i (asynchronous irecv)", test);
115         mbox->get_async(&received)->wait();
116         break;
117       case 'I':
118         XBT_INFO("Test %u: I (sleep + asynchronous irecv)", test);
119         simgrid::s4u::this_actor::sleep_for(0.5);
120         mbox->get_async(&received)->wait();
121         break;
122       case 'p':
123         XBT_INFO("Test %u: p (regular receive on permanent mailbox)", test);
124         mbox->set_receiver(simgrid::s4u::Actor::self());
125         received = mbox->get();
126         break;
127       case 'P':
128         XBT_INFO("Test %u: P (sleep + regular receive on permanent mailbox)", test);
129         simgrid::s4u::this_actor::sleep_for(0.5);
130         mbox->set_receiver(simgrid::s4u::Actor::self());
131         received = mbox->get();
132         break;
133       case 'j':
134         XBT_INFO("Test %u: j (irecv on permanent mailbox)", test);
135         mbox->set_receiver(simgrid::s4u::Actor::self());
136         mbox->get_async(&received)->wait();
137         break;
138       case 'J':
139         XBT_INFO("Test %u: J (sleep + irecv on permanent mailbox)", test);
140         simgrid::s4u::this_actor::sleep_for(0.5);
141         mbox->set_receiver(simgrid::s4u::Actor::self());
142         mbox->get_async(&received)->wait();
143         break;
144       default:
145         xbt_die("Unknown receiver spec for test %u: '%c'", test, args[0][test - 1]);
146     }
147     std::string* receivedStr = static_cast<std::string*>(received);
148     xbt_assert(*receivedStr == mboxName);
149     delete receivedStr;
150     XBT_INFO("Test %u OK", test);
151   }
152   simgrid::s4u::this_actor::sleep_for(0.5);
153 }
154
155 int main(int argc, char* argv[])
156 {
157   std::string specSend;
158   std::string specRecv;
159   for (char s : {'r', 'R', 'i', 'I', 'd', 'D'})
160     for (char r : {'r', 'R', 'i', 'I', 'p', 'P', 'j', 'J'}) {
161       specSend += s;
162       specRecv += r;
163     }
164   std::vector<std::string> argSend{specSend.c_str()};
165   std::vector<std::string> argRecv{specRecv.c_str()};
166
167   simgrid::s4u::Engine e(&argc, argv);
168   if (argc < 2)
169     usage(argv[0], specSend.c_str(), specRecv.c_str());
170
171   e.load_platform(argv[1]);
172
173   if (argc >= 3) {
174     argSend.clear();
175     argSend.push_back(argv[2]);
176   }
177   if (argc >= 4) {
178     argRecv.clear();
179     argRecv.push_back(argv[3]);
180   }
181   xbt_assert(argSend.front().size() == argRecv.front().size(), "Sender and receiver spec must be of the same size");
182
183   std::vector<simgrid::s4u::Host*> hosts = e.get_all_hosts();
184
185   simgrid::s4u::Actor::create("sender", hosts[0], sender, argSend);
186   simgrid::s4u::Actor::create("recver", hosts[1], receiver, argRecv);
187
188   e.run();
189   XBT_INFO("Simulation time %g", e.get_clock());
190
191   return 0;
192 }