X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/71c448f5a0c77599c12da1fe9f6ddbb5435e5a3b..2d37e348a09783cda723c7019640ee69de168324:/src/kernel/context/Context.cpp diff --git a/src/kernel/context/Context.cpp b/src/kernel/context/Context.cpp index 445ddea640..2b846cfe66 100644 --- a/src/kernel/context/Context.cpp +++ b/src/kernel/context/Context.cpp @@ -93,7 +93,14 @@ void Context::stop() } actor_->finished_ = true; - SIMIX_process_on_exit_runall(actor_); + + // Execute the termination callbacks + smx_process_exit_status_t exit_status = (actor_->context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS; + while (not actor_->on_exit.empty()) { + s_smx_process_exit_fun_t exit_fun = actor_->on_exit.back(); + actor_->on_exit.pop_back(); + (exit_fun.fun)(exit_status, exit_fun.arg); + } /* cancel non-blocking activities */ for (auto activity : actor_->comms) @@ -107,7 +114,17 @@ void Context::stop() this->cleanup_func_(this->actor_); this->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), because that's me - simgrid::simix::simcall([this] { SIMIX_process_cleanup(this->actor_); }); + simgrid::simix::simcall([this] { + simgrid::s4u::Actor::on_destruction(actor_->iface()); + + /* Unregister from the kill timer if any */ + if (actor_->kill_timer != nullptr) { + SIMIX_timer_remove(actor_->kill_timer); + actor_->kill_timer = nullptr; + } + + SIMIX_process_cleanup(actor_); + }); this->iwannadie = true; }