Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add Message queue abstraction
[simgrid.git] / src / s4u / s4u_MessageQueue.cpp
1 /* Copyright (c) 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/Engine.hpp>
7 #include <simgrid/s4u/Mess.hpp>
8 #include <simgrid/s4u/MessageQueue.hpp>
9
10 #include "src/kernel/activity/MessageQueueImpl.hpp"
11
12 XBT_LOG_EXTERNAL_CATEGORY(s4u);
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_mqueue, s4u, "S4U Message Queues");
14
15 namespace simgrid::s4u {
16
17 const std::string& MessageQueue::get_name() const
18 {
19   return pimpl_->get_name();
20 }
21
22 const char* MessageQueue::get_cname() const
23 {
24   return pimpl_->get_cname();
25 }
26
27 MessageQueue* MessageQueue::by_name(const std::string& name)
28 {
29   return Engine::get_instance()->message_queue_by_name_or_create(name);
30 }
31
32 bool MessageQueue::empty() const
33 {
34   return pimpl_->empty();
35 }
36
37 size_t MessageQueue::size() const
38 {
39   return pimpl_->size();
40 }
41
42 kernel::activity::MessImplPtr MessageQueue::front() const
43 {
44   return pimpl_->empty() ? nullptr : pimpl_->front();
45 }
46
47 MessPtr MessageQueue::put_init()
48 {
49   MessPtr res(new Mess());
50   res->set_queue(this);
51   res->sender_ = kernel::actor::ActorImpl::self();
52   return res;
53 }
54
55 MessPtr MessageQueue::put_init(void* payload)
56 {
57   return put_init()->set_payload(payload);
58 }
59
60 MessPtr MessageQueue::put_async(void* payload)
61 {
62   xbt_assert(payload != nullptr, "You cannot send nullptr");
63   MessPtr res = put_init(payload);
64   res->start();
65   return res;
66 }
67
68 void MessageQueue::put(void* payload)
69 {
70   xbt_assert(payload != nullptr, "You cannot send nullptr");
71
72   put_async(payload)->wait();
73 }
74
75 /** Blocking send with timeout */
76 void MessageQueue::put(void* payload, double timeout)
77 {
78   xbt_assert(payload != nullptr, "You cannot send nullptr");
79
80   put_init()->set_payload(payload)->start()->wait_for(timeout);
81 }
82
83 MessPtr MessageQueue::get_init()
84 {
85   MessPtr res(new Mess());
86   res->set_queue(this);
87   res->receiver_ = kernel::actor::ActorImpl::self();
88   return res;
89 }
90
91 MessPtr MessageQueue::get_async()
92 {
93   MessPtr res = get_init()->set_payload(nullptr);
94   res->start();
95   return res;
96 }
97
98 } // namespace simgrid::s4u