Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mq' into 'master'
[simgrid.git] / src / s4u / s4u_MessageQueue.cpp
diff --git a/src/s4u/s4u_MessageQueue.cpp b/src/s4u/s4u_MessageQueue.cpp
new file mode 100644 (file)
index 0000000..8fe34ac
--- /dev/null
@@ -0,0 +1,98 @@
+/* Copyright (c) 2023. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <simgrid/s4u/Engine.hpp>
+#include <simgrid/s4u/Mess.hpp>
+#include <simgrid/s4u/MessageQueue.hpp>
+
+#include "src/kernel/activity/MessageQueueImpl.hpp"
+
+XBT_LOG_EXTERNAL_CATEGORY(s4u);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_mqueue, s4u, "S4U Message Queues");
+
+namespace simgrid::s4u {
+
+const std::string& MessageQueue::get_name() const
+{
+  return pimpl_->get_name();
+}
+
+const char* MessageQueue::get_cname() const
+{
+  return pimpl_->get_cname();
+}
+
+MessageQueue* MessageQueue::by_name(const std::string& name)
+{
+  return Engine::get_instance()->message_queue_by_name_or_create(name);
+}
+
+bool MessageQueue::empty() const
+{
+  return pimpl_->empty();
+}
+
+size_t MessageQueue::size() const
+{
+  return pimpl_->size();
+}
+
+kernel::activity::MessImplPtr MessageQueue::front() const
+{
+  return pimpl_->empty() ? nullptr : pimpl_->front();
+}
+
+MessPtr MessageQueue::put_init()
+{
+  MessPtr res(new Mess());
+  res->set_queue(this);
+  res->sender_ = kernel::actor::ActorImpl::self();
+  return res;
+}
+
+MessPtr MessageQueue::put_init(void* payload)
+{
+  return put_init()->set_payload(payload);
+}
+
+MessPtr MessageQueue::put_async(void* payload)
+{
+  xbt_assert(payload != nullptr, "You cannot send nullptr");
+  MessPtr res = put_init(payload);
+  res->start();
+  return res;
+}
+
+void MessageQueue::put(void* payload)
+{
+  xbt_assert(payload != nullptr, "You cannot send nullptr");
+
+  put_async(payload)->wait();
+}
+
+/** Blocking send with timeout */
+void MessageQueue::put(void* payload, double timeout)
+{
+  xbt_assert(payload != nullptr, "You cannot send nullptr");
+
+  put_init()->set_payload(payload)->start()->wait_for(timeout);
+}
+
+MessPtr MessageQueue::get_init()
+{
+  MessPtr res(new Mess());
+  res->set_queue(this);
+  res->receiver_ = kernel::actor::ActorImpl::self();
+  return res;
+}
+
+MessPtr MessageQueue::get_async()
+{
+  MessPtr res = get_init()->set_payload(nullptr);
+  res->start();
+  return res;
+}
+
+} // namespace simgrid::s4u