Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Clear simcall.timeout_cb_ after use (contribute to simgrid/simgrid#48).
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 21 Feb 2020 14:08:28 +0000 (15:08 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 21 Feb 2020 14:11:28 +0000 (15:11 +0100)
src/kernel/activity/CommImpl.cpp
src/kernel/activity/ExecImpl.cpp
src/kernel/actor/ActorImpl.cpp

index 3d72d9f..0ed0972 100644 (file)
@@ -314,6 +314,7 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activi
     simcall->timeout_cb_ = NULL;
   } else {
     simcall->timeout_cb_ = simgrid::simix::Timer::set(SIMIX_get_clock() + timeout, [simcall]() {
+      simcall->timeout_cb_ = nullptr;
       SIMIX_waitany_remove_simcall_from_actions(simcall);
       simcall_comm_waitany__set__result(simcall, -1);
       simcall->issuer_->simcall_answer();
index 47ab5d4..80127ed 100644 (file)
@@ -24,6 +24,7 @@ void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, simgrid::kerne
     simcall->timeout_cb_ = nullptr;
   } else {
     simcall->timeout_cb_ = simgrid::simix::Timer::set(SIMIX_get_clock() + timeout, [simcall, execs, count]() {
+      simcall->timeout_cb_ = nullptr;
       for (size_t i = 0; i < count; i++) {
         // Remove the first occurrence of simcall:
         auto* exec = execs[i];
index b8c4318..b890a8e 100644 (file)
@@ -176,11 +176,16 @@ void ActorImpl::cleanup()
 
   XBT_DEBUG("Cleanup actor %s (%p), waiting synchro %p", get_cname(), this, waiting_synchro.get());
 
-  /* Unregister from the kill timer if any */
+  /* Unregister associated timers if any */
   if (kill_timer != nullptr) {
     kill_timer->remove();
     kill_timer = nullptr;
   }
+  if (simcall.timeout_cb_) {
+    simcall.timeout_cb_->remove();
+    simcall.timeout_cb_ = nullptr;
+  }
+
   cleanup_from_simix();
 
   context_->set_wannadie(false); // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops