Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add Message queue abstraction
[simgrid.git] / src / kernel / activity / MessageQueueImpl.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 "src/kernel/activity/MessageQueueImpl.hpp"
7
8 #include <unordered_map>
9
10 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mq, kernel, "Message queue implementation");
11
12 namespace simgrid::kernel::activity {
13
14 unsigned MessageQueueImpl::next_id_ = 0;
15
16 void MessageQueueImpl::push(const MessImplPtr& mess)
17 {
18   mess->set_queue(this);
19   this->queue_.push_back(std::move(mess));
20 }
21
22 void MessageQueueImpl::remove(const MessImplPtr& mess)
23 {
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());
26
27   mess->set_queue(nullptr);
28   auto it = std::find(queue_.begin(), queue_.end(), mess);
29   if (it != queue_.end())
30     queue_.erase(it);
31   else
32     xbt_die("Message %p not found in queue %s", mess.get(), get_cname());
33 }
34
35 MessImplPtr MessageQueueImpl::find_matching_message(MessImplType type)
36 {
37   auto iter = std::find_if(queue_.begin(), queue_.end(), [&type](const MessImplPtr& mess)
38   {
39     return (mess->get_type() == type);
40   });
41   if (iter == queue_.end()) {
42     XBT_DEBUG("No matching message synchro found");
43     return nullptr;
44   }
45
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;
50   queue_.erase(iter);
51   return mess_cpy;
52 }
53
54 } // namespace simgrid::kernel::activity