Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines with new year.
[simgrid.git] / teshsuite / s4u / listen_async / listen_async.cpp
1 /* Copyright (c) 2017-2020. 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 /* Bug report: https://github.com/simgrid/simgrid/issues/40
7  *
8  * Task.listen used to be on async mailboxes as it always returned false.
9  * This occurs in Java and C, but is only tested here in C.
10  */
11
12 #include "simgrid/s4u.hpp"
13
14 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
15
16 static void server()
17 {
18   simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name("mailbox");
19
20   simgrid::s4u::CommPtr sendComm = mailbox->put_async(new std::string("Some data"), 0);
21
22   xbt_assert(mailbox->listen()); // True (1)
23   XBT_INFO("Task listen works on regular mailboxes");
24   const std::string* res = static_cast<std::string*>(mailbox->get());
25
26   xbt_assert(*res == "Some data", "Data received: %s", res->c_str());
27   XBT_INFO("Data successfully received from regular mailbox");
28   delete res;
29   sendComm->wait();
30
31   simgrid::s4u::Mailbox* mailbox2 = simgrid::s4u::Mailbox::by_name("mailbox2");
32   mailbox2->set_receiver(simgrid::s4u::Actor::self());
33
34   mailbox2->put_init(new std::string("More data"), 0)->detach();
35
36   xbt_assert(mailbox2->listen()); // used to break.
37   XBT_INFO("Task listen works on asynchronous mailboxes");
38
39   res = static_cast<std::string*>(mailbox2->get());
40   xbt_assert(*res == "More data");
41   delete res;
42
43   XBT_INFO("Data successfully received from asynchronous mailbox");
44 }
45
46 int main(int argc, char* argv[])
47 {
48   simgrid::s4u::Engine e(&argc, argv);
49   e.load_platform(argv[1]);
50
51   simgrid::s4u::Actor::create("test", simgrid::s4u::Host::by_name("Tremblay"), server);
52
53   e.run();
54
55   return 0;
56 }