X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/72d32c4e88a57f4786f62fec48a1bfa454adbff9..8d0b1f2f1840a16bb9551f1cfd74f2488599f95b:/src/kernel/activity/MailboxImpl.cpp diff --git a/src/kernel/activity/MailboxImpl.cpp b/src/kernel/activity/MailboxImpl.cpp index c9d8c45004..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. */ @@ -20,7 +20,11 @@ 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); } @@ -42,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)); @@ -57,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)