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 "src/kernel/activity/MessageQueueImpl.hpp"
8 #include <unordered_map>
10 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mq, kernel, "Message queue implementation");
12 namespace simgrid::kernel::activity {
14 unsigned MessageQueueImpl::next_id_ = 0;
16 void MessageQueueImpl::push(const MessImplPtr& mess)
18 mess->set_queue(this);
19 this->queue_.push_back(std::move(mess));
22 void MessageQueueImpl::remove(const MessImplPtr& mess)
24 xbt_assert(mess->get_queue() == this, "Message %p is in queue %s, not queue %s", mess.get(),
25 (mess->get_queue() ? mess->get_queue()->get_cname() : "(null)"), get_cname());
27 mess->set_queue(nullptr);
28 auto it = std::find(queue_.begin(), queue_.end(), mess);
29 if (it != queue_.end())
32 xbt_die("Message %p not found in queue %s", mess.get(), get_cname());
35 MessImplPtr MessageQueueImpl::find_matching_message(MessImplType type)
37 auto iter = std::find_if(queue_.begin(), queue_.end(), [&type](const MessImplPtr& mess)
39 return (mess->get_type() == type);
41 if (iter == queue_.end()) {
42 XBT_DEBUG("No matching message synchro found");
46 const MessImplPtr& mess = *iter;
47 XBT_DEBUG("Found a matching message synchro %p", mess.get());
48 mess->set_queue(nullptr);
49 MessImplPtr mess_cpy = mess;
54 } // namespace simgrid::kernel::activity