X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/196327afa332e6c85827da70da72a1aaa178739a..32892d0df7206a7c14ace5a13f985df1e0a9249a:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index f6665e769d..2f2b67c3d7 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -4,6 +4,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "mc/mc.h" +#include "simgrid/Exception.hpp" #include "smx_private.hpp" #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/activity/ExecImpl.hpp" @@ -17,7 +18,6 @@ #include "src/simix/smx_synchro_private.hpp" #include "src/surf/HostImpl.hpp" #include "src/surf/cpu_interface.hpp" -#include "xbt/ex.hpp" #ifdef HAVE_SMPI #include "src/smpi/include/private.hpp" @@ -111,7 +111,7 @@ void SIMIX_process_cleanup(smx_actor_t process) #endif simix_global->process_to_destroy.push_back(*process); } - process->context_->iwannadie = 0; + process->context_->iwannadie = false; simix_global->mutex.unlock(); } @@ -192,7 +192,7 @@ smx_activity_t ActorImpl::suspend(ActorImpl* issuer) return nullptr; } - suspended_ = 1; + suspended_ = true; /* If we are suspending another actor that is waiting on a sync, suspend its synchronization. */ if (this != issuer) { @@ -202,7 +202,7 @@ smx_activity_t ActorImpl::suspend(ActorImpl* issuer) return nullptr; } else { - return SIMIX_execution_start("suspend", 0.0, 1.0, 0.0, this->host_); + return SIMIX_execution_start("suspend", "", 0.0, 1.0, 0.0, this->host_); } } @@ -217,7 +217,7 @@ void ActorImpl::resume() if (not suspended_) return; - suspended_ = 0; + suspended_ = false; /* resume the synchronization that was blocking the resumed actor. */ if (waiting_synchro) @@ -443,14 +443,16 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { (issuer->host_ == nullptr ? "(null)" : issuer->host_->get_cname()), process->get_cname(), process->host_->get_cname()); - process->context_->iwannadie = 1; - process->blocked_ = 0; - process->suspended_ = 0; + process->context_->iwannadie = true; + process->blocked_ = false; + process->suspended_ = false; process->exception = nullptr; /* destroy the blocking synchro if any */ if (process->waiting_synchro != nullptr) { - + if (process->host_->is_off()) { + SMX_EXCEPTION(process, host_error, 0, "Host failed"); + } simgrid::kernel::activity::ExecImplPtr exec = boost::dynamic_pointer_cast(process->waiting_synchro); simgrid::kernel::activity::CommImplPtr comm = @@ -483,7 +485,7 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { SIMIX_synchro_stop_waiting(process, &process->simcall); } else if (io != nullptr) { - SIMIX_io_destroy(process->waiting_synchro); + delete io.get(); } else { xbt_die("Unknown type of activity"); } @@ -547,7 +549,7 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const simgrid::kernel::activity::IoImplPtr io = boost::dynamic_pointer_cast(process->waiting_synchro); if (io != nullptr) { - SIMIX_io_destroy(process->waiting_synchro); + delete io.get(); } } process->waiting_synchro = nullptr; @@ -698,10 +700,14 @@ void SIMIX_process_yield(smx_actor_t self) self->finished_ = true; /* execute the on_exit functions */ SIMIX_process_on_exit_runall(self); - /* Add the process to the list of process to restart, only if the host is down */ - if (self->auto_restart_ && self->host_->is_off()) { - SIMIX_host_add_auto_restart_process(self->host_, self); + + if (self->auto_restart_ && self->host_->is_off() && + watched_hosts.find(self->host_->get_cname()) == watched_hosts.end()) { + XBT_DEBUG("Push host %s to watched_hosts because it's off and %s needs to restart", self->host_->get_cname(), + self->get_cname()); + watched_hosts.insert(self->host_->get_cname()); } + XBT_DEBUG("Process %s@%s is dead", self->get_cname(), self->host_->get_cname()); self->context_->stop(); } @@ -709,7 +715,7 @@ void SIMIX_process_yield(smx_actor_t self) if (self->suspended_) { XBT_DEBUG("Hey! I'm suspended."); xbt_assert(self->exception != nullptr, "Gasp! This exception may be lost by subsequent calls."); - self->suspended_ = 0; + self->suspended_ = false; self->suspend(self); }