X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6538b90e2488245bcaa1520c834c3011c714976a..fa5d6c99110d257cfdd76950311361bec0b72e72:/src/kernel/actor/ActorImpl.cpp diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index cd885a1e4b..49c758acb5 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -169,6 +169,9 @@ void ActorImpl::cleanup() activity->cancel(); activities_.clear(); + while (not mailboxes.empty()) + mailboxes.back()->set_receiver(nullptr); + XBT_DEBUG("%s@%s(%ld) should not run anymore", get_cname(), get_host()->get_cname(), get_pid()); if (EngineImpl::get_instance()->is_maestro(this)) /* Do not cleanup maestro */ @@ -200,25 +203,21 @@ void ActorImpl::exit() exception_ = nullptr; /* destroy the blocking synchro if any */ - if (waiting_synchro_ != nullptr) { - waiting_synchro_->cancel(); - waiting_synchro_->set_state(activity::State::FAILED); - - if (auto exec = boost::dynamic_pointer_cast(waiting_synchro_)) { - exec->clean_action(); - } else if (auto comm = boost::dynamic_pointer_cast(waiting_synchro_)) { - comm->unregister_simcall(&simcall_); - } else { - activity::ActivityImplPtr(waiting_synchro_)->finish(); - } - + if (auto activity = waiting_synchro_) { activities_.remove(waiting_synchro_); waiting_synchro_ = nullptr; + + activity->cancel(); + activity->set_state(activity::State::FAILED); + activity->post(); } for (auto const& activity : activities_) activity->cancel(); activities_.clear(); + while (not mailboxes.empty()) + mailboxes.back()->set_receiver(nullptr); + // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that this->throw_exception(std::make_exception_ptr(ForcefulKillException(host_->is_on() ? "exited" : "host failed"))); }