From 3fad6617c013e4fca6b2333a85751079421baaf4 Mon Sep 17 00:00:00 2001 From: Fred Suter Date: Mon, 20 Nov 2023 19:23:34 -0500 Subject: [PATCH] strenghten the behavior of Message queues after some Wrench breaking --- src/kernel/activity/MessImpl.cpp | 11 ++++++++++- src/kernel/activity/MessImpl.hpp | 3 +++ src/kernel/activity/MessageQueueImpl.cpp | 23 +++++++++++++++++++++++ src/kernel/activity/MessageQueueImpl.hpp | 3 +++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/kernel/activity/MessImpl.cpp b/src/kernel/activity/MessImpl.cpp index 28679c2a4b..3a3e307b77 100644 --- a/src/kernel/activity/MessImpl.cpp +++ b/src/kernel/activity/MessImpl.cpp @@ -130,9 +130,18 @@ void MessImpl::wait_for(actor::ActorImpl* issuer, double timeout) ActivityImpl::wait_for(issuer, timeout); } +void MessImpl::cancel() +{ + /* if the synchro is a waiting state means that it is still in a mbox so remove from it and delete it */ + if (get_state() == State::WAITING) { + queue_->remove(this); + set_state(State::CANCELED); + } +} + void MessImpl::finish() { - XBT_DEBUG("MessImpl::finish() comm %p, state %s, src_proc %p, dst_proc %p", this, get_state_str(), + XBT_DEBUG("MessImpl::finish() mess %p, state %s, src_proc %p, dst_proc %p", this, get_state_str(), src_actor_.get(), dst_actor_.get()); if (get_iface()) { diff --git a/src/kernel/activity/MessImpl.hpp b/src/kernel/activity/MessImpl.hpp index fad011c7b1..2b2932f311 100644 --- a/src/kernel/activity/MessImpl.hpp +++ b/src/kernel/activity/MessImpl.hpp @@ -39,6 +39,9 @@ public: void wait_for(actor::ActorImpl* issuer, double timeout) override; MessImpl* start(); + void suspend() override { /* no action to suspend for Mess */ } + void resume() override { /* no action to resume for Mess */ } + void cancel() override; void set_exception(actor::ActorImpl* issuer) override {}; void finish() override; diff --git a/src/kernel/activity/MessageQueueImpl.cpp b/src/kernel/activity/MessageQueueImpl.cpp index 714f86bdd6..d649e6ee0b 100644 --- a/src/kernel/activity/MessageQueueImpl.cpp +++ b/src/kernel/activity/MessageQueueImpl.cpp @@ -13,6 +13,29 @@ namespace simgrid::kernel::activity { unsigned MessageQueueImpl::next_id_ = 0; +MessageQueueImpl::~MessageQueueImpl() +{ + try { + clear(); + } catch (const std::bad_alloc& ba) { + XBT_ERROR("MessageQueueImpl::clear() failure: %s", ba.what()); + } +} + +/** @brief Removes all message activities from a message queue */ +void MessageQueueImpl::clear() +{ + while (not queue_.empty()) { + auto mess = queue_.back(); + if (mess->get_state() == State::WAITING) { + mess->cancel(); + mess->set_state(State::FAILED); + } else + queue_.pop_back(); + } + xbt_assert(queue_.empty()); +} + void MessageQueueImpl::push(const MessImplPtr& mess) { mess->set_queue(this); diff --git a/src/kernel/activity/MessageQueueImpl.hpp b/src/kernel/activity/MessageQueueImpl.hpp index 4bc010f956..3016e049d5 100644 --- a/src/kernel/activity/MessageQueueImpl.hpp +++ b/src/kernel/activity/MessageQueueImpl.hpp @@ -31,6 +31,8 @@ class MessageQueueImpl { MessageQueueImpl& operator=(const MailboxImpl&) = delete; public: + ~MessageQueueImpl(); + /** @brief Public interface */ unsigned get_id() const { return id_; } @@ -41,6 +43,7 @@ public: const char* get_cname() const { return name_.c_str(); } void push(const MessImplPtr& mess); void remove(const MessImplPtr& mess); + void clear(); bool empty() const { return queue_.empty(); } size_t size() const { return queue_.size(); } const MessImplPtr& front() const { return queue_.front(); } -- 2.20.1