Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
actors on failing hosts should die silently and with no delay
[simgrid.git] / src / kernel / activity / CommImpl.cpp
index deb61c1..8079463 100644 (file)
@@ -273,7 +273,7 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activi
   }
 
   for (std::size_t i = 0; i != count; ++i) {
-    simgrid::kernel::activity::ActivityImplPtr comm = comms[i];
+    simgrid::kernel::activity::CommImpl* comm = comms[i];
     if (comm->state_ != SIMIX_WAITING && comm->state_ != SIMIX_RUNNING) {
       simcall_comm_testany__set__result(simcall, i);
       comm->simcalls_.push_back(simcall);
@@ -286,28 +286,29 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activi
 
 static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall)
 {
-  smx_activity_t* synchros = simcall_comm_waitany__get__comms(simcall);
-  size_t count             = simcall_comm_waitany__get__count(simcall);
+  simgrid::kernel::activity::CommImpl** comms = simcall_comm_waitany__get__comms(simcall);
+  size_t count                                = simcall_comm_waitany__get__count(simcall);
 
   for (size_t i = 0; i < count; i++) {
     // Remove the first occurence of simcall:
-    smx_activity_t& synchro = synchros[i];
-    auto j                  = boost::range::find(synchro->simcalls_, simcall);
-    if (j != synchro->simcalls_.end())
-      synchro->simcalls_.erase(j);
+    auto* comm = comms[i];
+    auto j     = boost::range::find(comm->simcalls_, simcall);
+    if (j != comm->simcalls_.end())
+      comm->simcalls_.erase(j);
   }
 }
-void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, smx_activity_t* synchros, size_t count, double timeout)
+void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count,
+                                  double timeout)
 {
   if (MC_is_active() || MC_record_replay_is_active()) {
     if (timeout > 0.0)
       xbt_die("Timeout not implemented for waitany in the model-checker");
     int idx                 = SIMCALL_GET_MC_VALUE(simcall);
-    smx_activity_t& synchro = synchros[idx];
-    synchro->simcalls_.push_back(simcall);
+    auto* comm              = comms[idx];
+    comm->simcalls_.push_back(simcall);
     simcall_comm_waitany__set__result(simcall, idx);
-    synchro->state_ = SIMIX_DONE;
-    synchro->finish();
+    comm->state_ = SIMIX_DONE;
+    comm->finish();
     return;
   }
 
@@ -323,12 +324,12 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, smx_activity_t* synchro
 
   for (size_t i = 0; i < count; i++) {
     /* associate this simcall to the the synchro */
-    smx_activity_t& synchro = synchros[i];
-    synchro->simcalls_.push_back(simcall);
+    auto* comm = comms[i];
+    comm->simcalls_.push_back(simcall);
 
     /* see if the synchro is already finished */
-    if (synchro->state_ != SIMIX_WAITING && synchro->state_ != SIMIX_RUNNING) {
-      synchro->finish();
+    if (comm->state_ != SIMIX_WAITING && comm->state_ != SIMIX_RUNNING) {
+      comm->finish();
       break;
     }
   }
@@ -376,7 +377,8 @@ CommImpl::CommImpl(CommImpl::Type type) : type(type)
 
 CommImpl::~CommImpl()
 {
-  XBT_DEBUG("Really free communication %p", this);
+  XBT_DEBUG("Really free communication %p in state %d (detached = %d)", this, static_cast<int>(state_),
+            static_cast<int>(detached));
 
   cleanupSurf();
 
@@ -386,10 +388,9 @@ CommImpl::~CommImpl()
     if (clean_fun)
       clean_fun(src_buff_);
     src_buff_ = nullptr;
-  }
-
-  if (mbox)
+  } else if (mbox) {
     mbox->remove(this);
+  }
 }
 
 /**  @brief Starts the simulation of a communication synchro. */
@@ -484,8 +485,10 @@ void CommImpl::cancel()
 {
   /* if the synchro is a waiting state means that it is still in a mbox so remove from it and delete it */
   if (state_ == SIMIX_WAITING) {
-    mbox->remove(this);
-    state_ = SIMIX_CANCELED;
+    if (not detached) {
+      mbox->remove(this);
+      state_ = SIMIX_CANCELED;
+    }
   } else if (not MC_is_active() /* when running the MC there are no surf actions */
              && not MC_record_replay_is_active() && (state_ == SIMIX_READY || state_ == SIMIX_RUNNING)) {
     surf_action_->cancel();
@@ -582,8 +585,6 @@ void CommImpl::finish()
 
     if (not simcall->issuer->get_host()->is_on()) {
       simcall->issuer->context_->iwannadie = true;
-      simcall->issuer->exception_ =
-          std::make_exception_ptr(simgrid::HostFailureException(XBT_THROW_POINT, "Host failed"));
     } else {
       switch (state_) {