Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
rename xbt::WithContextException into xbt::ContextedException
[simgrid.git] / src / simix / ActorImpl.cpp
index 5d33798..f7dad67 100644 (file)
@@ -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"
@@ -69,7 +69,7 @@ void SIMIX_process_cleanup(smx_actor_t process)
     process->kill_timer = nullptr;
   }
 
-  xbt_os_mutex_acquire(simix_global->mutex);
+  simix_global->mutex.lock();
 
   /* cancel non-blocking communications */
   while (not process->comms.empty()) {
@@ -111,9 +111,9 @@ 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;
 
-  xbt_os_mutex_release(simix_global->mutex);
+  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<simgrid::kernel::activity::ExecImpl>(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<simgrid::kernel::activity::IoImpl>(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);
   }