From 793184f903550583a9d23a67374df45e9b67612d Mon Sep 17 00:00:00 2001 From: Fred Suter Date: Thu, 5 Oct 2023 08:30:25 -0400 Subject: [PATCH] Reducing the number of refcount changes for ActivityImpl --- src/kernel/activity/MailboxImpl.cpp | 15 +++++++-------- src/kernel/activity/MailboxImpl.hpp | 16 ++++++---------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/kernel/activity/MailboxImpl.cpp b/src/kernel/activity/MailboxImpl.cpp index cb49f3b2b8..aaeeb83dc4 100644 --- a/src/kernel/activity/MailboxImpl.cpp +++ b/src/kernel/activity/MailboxImpl.cpp @@ -46,7 +46,7 @@ void MailboxImpl::set_receiver(s4u::ActorPtr actor) /** @brief Pushes a communication activity into a mailbox * @param comm What to add */ -void MailboxImpl::push(CommImplPtr comm) +void MailboxImpl::push(const CommImplPtr& comm) { comm->set_mailbox(this); this->comm_queue_.push_back(std::move(comm)); @@ -61,12 +61,11 @@ void MailboxImpl::remove(const CommImplPtr& comm) (comm->get_mailbox() ? comm->get_mailbox()->get_cname() : "(null)"), this->get_cname()); comm->set_mailbox(nullptr); - for (auto it = this->comm_queue_.begin(); it != this->comm_queue_.end(); it++) - if (*it == comm) { - this->comm_queue_.erase(it); - return; - } - xbt_die("Comm %p not found in mailbox %s", comm.get(), this->get_cname()); + auto it = std::find(this->comm_queue_.begin(), this->comm_queue_.end(), comm); + if (it != this->comm_queue_.end()) + this->comm_queue_.erase(it); + else + xbt_die("Comm %p not found in mailbox %s", comm.get(), this->get_cname()); } /** @brief Removes all communication activities from a mailbox @@ -74,7 +73,7 @@ void MailboxImpl::remove(const CommImplPtr& comm) void MailboxImpl::clear(bool do_finish) { // CommImpl::cancel() will remove the comm from the mailbox.. - for (auto comm : done_comm_queue_) { + for (const auto& comm : done_comm_queue_) { comm->cancel(); comm->set_state(State::FAILED); if (do_finish) diff --git a/src/kernel/activity/MailboxImpl.hpp b/src/kernel/activity/MailboxImpl.hpp index 199fcd12cc..715e7626b4 100644 --- a/src/kernel/activity/MailboxImpl.hpp +++ b/src/kernel/activity/MailboxImpl.hpp @@ -11,21 +11,17 @@ #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" -#include - namespace simgrid::kernel::activity { /** @brief Implementation of the s4u::Mailbox */ class MailboxImpl { - static constexpr size_t MAX_MAILBOX_SIZE = 10000000; - s4u::Mailbox piface_; std::string name_; actor::ActorImplPtr permanent_receiver_; // actor to which the mailbox is attached - boost::circular_buffer_space_optimized comm_queue_{MAX_MAILBOX_SIZE}; + std::list comm_queue_; // messages already received in the permanent receive mode - boost::circular_buffer_space_optimized done_comm_queue_{MAX_MAILBOX_SIZE}; + std::list done_comm_queue_; friend s4u::Engine; friend s4u::Mailbox; @@ -50,8 +46,8 @@ public: const std::string& get_name() const { return name_; } const char* get_cname() const { return name_.c_str(); } void set_receiver(s4u::ActorPtr actor); - void push(CommImplPtr comm); - void push_done(CommImplPtr done_comm) { done_comm_queue_.push_back(done_comm); } + void push(const CommImplPtr& comm); + void push_done(const CommImplPtr& done_comm) { done_comm_queue_.push_back(done_comm); } void remove(const CommImplPtr& comm); void clear(bool do_finish); CommImplPtr iprobe(int type, const std::function& match_fun, void* data); @@ -61,9 +57,9 @@ public: actor::ActorImplPtr get_permanent_receiver() const { return permanent_receiver_; } bool empty() const { return comm_queue_.empty(); } size_t size() const { return comm_queue_.size(); } - CommImplPtr front() const { return comm_queue_.front(); } + const CommImplPtr& front() const { return comm_queue_.front(); } bool has_some_done_comm() const { return not done_comm_queue_.empty(); } - CommImplPtr done_front() const { return done_comm_queue_.front(); } + const CommImplPtr& done_front() const { return done_comm_queue_.front(); } }; } // namespace simgrid::kernel::activity -- 2.20.1