X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/268f33a4d5bc5c8eca704ce3028e4e3c283fdb02..8d0b1f2f1840a16bb9551f1cfd74f2488599f95b:/src/kernel/activity/MailboxImpl.cpp diff --git a/src/kernel/activity/MailboxImpl.cpp b/src/kernel/activity/MailboxImpl.cpp index cafb0362c3..aaeeb83dc4 100644 --- a/src/kernel/activity/MailboxImpl.cpp +++ b/src/kernel/activity/MailboxImpl.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -14,15 +14,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mailbox, kernel, "Mailbox implementation"); /* Rendez-Vous Points */ /******************************************************************************/ -namespace simgrid { -namespace kernel { -namespace activity { +namespace simgrid::kernel::activity { unsigned MailboxImpl::next_id_ = 0; MailboxImpl::~MailboxImpl() { - clear(); + try { + clear(false); + } catch (const std::bad_alloc& ba) { + XBT_ERROR("MailboxImpl::clear() failure: %s", ba.what()); + } set_receiver(nullptr); } @@ -32,7 +34,7 @@ MailboxImpl::~MailboxImpl() void MailboxImpl::set_receiver(s4u::ActorPtr actor) { if (this->permanent_receiver_) { - std::vector& mboxes = this->permanent_receiver_->mailboxes; + std::vector& mboxes = this->permanent_receiver_->mailboxes_; mboxes.erase(std::remove(mboxes.begin(), mboxes.end(), this), mboxes.end()); } @@ -44,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)); @@ -59,33 +61,37 @@ 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 */ -void MailboxImpl::clear() +void MailboxImpl::clear(bool do_finish) { - for (auto comm : done_comm_queue_) { + // CommImpl::cancel() will remove the comm from the mailbox.. + for (const auto& comm : done_comm_queue_) { comm->cancel(); - comm->set_state(State::DST_HOST_FAILURE); + comm->set_state(State::FAILED); + if (do_finish) + comm->finish(); } done_comm_queue_.clear(); - // CommImpl::cancel() will remove the comm from the mailbox.. while (not comm_queue_.empty()) { auto comm = comm_queue_.back(); if (comm->get_state() == State::WAITING && not comm->is_detached()) { comm->cancel(); - comm->set_state(State::DST_HOST_FAILURE); + comm->set_state(State::FAILED); + if (do_finish) + comm->finish(); } else comm_queue_.pop_back(); } + xbt_assert(comm_queue_.empty() && done_comm_queue_.empty()); } CommImplPtr MailboxImpl::iprobe(int type, const std::function& match_fun, void* data) @@ -149,6 +155,4 @@ CommImplPtr MailboxImpl::find_matching_comm(CommImplType type, comm_queue.erase(iter); return comm_cpy; } -} // namespace activity -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::activity