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 MessageQueueImpl::~MessageQueueImpl()
20 } catch (const std::bad_alloc& ba) {
21 XBT_ERROR("MessageQueueImpl::clear() failure: %s", ba.what());
25 /** @brief Removes all message activities from a message queue */
26 void MessageQueueImpl::clear()
28 while (not queue_.empty()) {
29 auto mess = queue_.back();
30 if (mess->get_state() == State::WAITING) {
32 mess->set_state(State::FAILED);
36 xbt_assert(queue_.empty());
39 void MessageQueueImpl::push(const MessImplPtr& mess)
41 mess->set_queue(this);
42 this->queue_.push_back(std::move(mess));
45 void MessageQueueImpl::remove(const MessImplPtr& mess)
47 xbt_assert(mess->get_queue() == this, "Message %p is in queue %s, not queue %s", mess.get(),
48 (mess->get_queue() ? mess->get_queue()->get_cname() : "(null)"), get_cname());
50 mess->set_queue(nullptr);
51 auto it = std::find(queue_.begin(), queue_.end(), mess);
52 if (it != queue_.end())
55 xbt_die("Message %p not found in queue %s", mess.get(), get_cname());
58 MessImplPtr MessageQueueImpl::find_matching_message(MessImplType type)
60 auto iter = std::find_if(queue_.begin(), queue_.end(), [&type](const MessImplPtr& mess)
62 return (mess->get_type() == type);
64 if (iter == queue_.end()) {
65 XBT_DEBUG("No matching message synchro found");
69 const MessImplPtr& mess = *iter;
70 XBT_DEBUG("Found a matching message synchro %p", mess.get());
71 mess->set_queue(nullptr);
72 MessImplPtr mess_cpy = mess;
77 } // namespace simgrid::kernel::activity