1 /* Copyright (c) 2023. The SimGrid Team. All rights reserved. */
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. */
6 #include <simgrid/s4u/Engine.hpp>
7 #include <simgrid/s4u/Mess.hpp>
8 #include <simgrid/s4u/MessageQueue.hpp>
10 #include "src/kernel/activity/MessageQueueImpl.hpp"
12 XBT_LOG_EXTERNAL_CATEGORY(s4u);
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_mqueue, s4u, "S4U Message Queues");
15 namespace simgrid::s4u {
17 const std::string& MessageQueue::get_name() const
19 return pimpl_->get_name();
22 const char* MessageQueue::get_cname() const
24 return pimpl_->get_cname();
27 MessageQueue* MessageQueue::by_name(const std::string& name)
29 return Engine::get_instance()->message_queue_by_name_or_create(name);
32 bool MessageQueue::empty() const
34 return pimpl_->empty();
37 size_t MessageQueue::size() const
39 return pimpl_->size();
42 kernel::activity::MessImplPtr MessageQueue::front() const
44 return pimpl_->empty() ? nullptr : pimpl_->front();
47 MessPtr MessageQueue::put_init()
49 MessPtr res(new Mess());
51 res->sender_ = kernel::actor::ActorImpl::self();
55 MessPtr MessageQueue::put_init(void* payload)
57 return put_init()->set_payload(payload);
60 MessPtr MessageQueue::put_async(void* payload)
62 xbt_assert(payload != nullptr, "You cannot send nullptr");
63 MessPtr res = put_init(payload);
68 void MessageQueue::put(void* payload)
70 xbt_assert(payload != nullptr, "You cannot send nullptr");
72 put_async(payload)->wait();
75 /** Blocking send with timeout */
76 void MessageQueue::put(void* payload, double timeout)
78 xbt_assert(payload != nullptr, "You cannot send nullptr");
80 put_init()->set_payload(payload)->start()->wait_for(timeout);
83 MessPtr MessageQueue::get_init()
85 MessPtr res(new Mess());
87 res->receiver_ = kernel::actor::ActorImpl::self();
91 MessPtr MessageQueue::get_async()
93 MessPtr res = get_init()->set_payload(nullptr);
98 } // namespace simgrid::s4u