Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
use smart pointers for kernel timers
authorSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 10 Nov 2021 10:34:15 +0000 (11:34 +0100)
committerSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 10 Nov 2021 10:42:15 +0000 (11:42 +0100)
include/simgrid/kernel/Timer.hpp
src/kernel/EngineImpl.cpp
src/kernel/activity/ExecImpl.cpp
src/kernel/actor/ActorImpl.hpp
src/kernel/timer/Timer.cpp
src/simix/popping_private.hpp

index 6add5c2..d9af164 100644 (file)
@@ -19,7 +19,7 @@ namespace timer {
 
 inline auto& kernel_timers() // avoid static initialization order fiasco
 {
-  using TimerQelt = std::pair<double, Timer*>;
+  using TimerQelt = std::pair<double, std::shared_ptr<Timer>>;
   static boost::heap::fibonacci_heap<TimerQelt, boost::heap::compare<xbt::HeapComparator<TimerQelt>>> value;
   return value;
 }
@@ -38,12 +38,12 @@ public:
 
   void remove();
 
-  template <class F> static inline Timer* set(double date, F callback)
+  template <class F> static inline std::shared_ptr<Timer> set(double date, F callback)
   {
     return set(date, xbt::Task<void()>(std::move(callback)));
   }
 
-  static Timer* set(double date, xbt::Task<void()>&& callback);
+  static std::shared_ptr<Timer> set(double date, xbt::Task<void()>&& callback);
   static double next() { return kernel_timers().empty() ? -1.0 : kernel_timers().top().first; }
 
   /** Handle any pending timer. Returns if something was actually run. */
index e2f5158..bddc871 100644 (file)
@@ -334,10 +334,7 @@ void EngineImpl::shutdown()
   /* Finish context module and SURF */
   instance_->destroy_context_factory();
 
-  while (not timer::kernel_timers().empty()) {
-    delete timer::kernel_timers().top().second;
-    timer::kernel_timers().pop();
-  }
+  timer::kernel_timers().clear();
 
   tmgr_finalize();
   sg_platf_exit();
index 4e3f3f2..0e79088 100644 (file)
@@ -181,6 +181,7 @@ void ExecImpl::set_exception(actor::ActorImpl* issuer)
                  to_c_str(state_));
   }
 }
+
 void ExecImpl::finish()
 {
   XBT_DEBUG("ExecImpl::finish() in state %s", to_c_str(state_));
index b5ae3c0..5ce712f 100644 (file)
@@ -75,7 +75,7 @@ public:
       std::make_shared<std::vector<std::function<void(bool)>>>();
 
   std::function<void()> code_;
-  timer::Timer* kill_timer_ = nullptr;
+  std::shared_ptr<timer::Timer> kill_timer_ = nullptr;
 
 private:
   /* Refcounting */
index f9d85e7..af0b2af 100644 (file)
@@ -11,9 +11,9 @@ namespace simgrid {
 namespace kernel {
 namespace timer {
 
-Timer* Timer::set(double date, xbt::Task<void()>&& callback)
+std::shared_ptr<Timer> Timer::set(double date, xbt::Task<void()>&& callback)
 {
-  auto* timer    = new Timer(date, std::move(callback));
+  auto timer     = std::make_shared<Timer>(date, std::move(callback));
   timer->handle_ = kernel_timers().emplace(std::make_pair(date, timer));
   return timer;
 }
@@ -22,7 +22,6 @@ Timer* Timer::set(double date, xbt::Task<void()>&& callback)
 void Timer::remove()
 {
   kernel_timers().erase(handle_);
-  delete this;
 }
 
 /** Handle any pending timer. Returns if something was actually run. */
@@ -32,10 +31,9 @@ bool Timer::execute_all()
   while (not kernel_timers().empty() && s4u::Engine::get_clock() >= kernel_timers().top().first) {
     result = true;
     // FIXME: make the timers being real callbacks (i.e. provide dispatchers that read and expand the args)
-    Timer* timer = kernel_timers().top().second;
+    std::shared_ptr<Timer> timer = kernel_timers().top().second;
     kernel_timers().pop();
     timer->callback();
-    delete timer;
   }
   return result;
 }
index 13ab4f1..15bfb57 100644 (file)
@@ -45,8 +45,8 @@ union u_smx_scalar {
  */
 struct s_smx_simcall {
   simgrid::simix::Simcall call_                      = simgrid::simix::Simcall::NONE;
-  smx_actor_t issuer_                                = nullptr;
-  simgrid::kernel::timer::Timer* timeout_cb_         = nullptr; // Callback to timeouts
+  simgrid::kernel::actor::ActorImpl* issuer_                 = nullptr;
+  std::shared_ptr<simgrid::kernel::timer::Timer> timeout_cb_ = nullptr; // Callback to timeouts
   simgrid::kernel::actor::SimcallObserver* observer_ = nullptr; // makes that simcall observable by the MC
   unsigned int mc_max_consider_ =
       0; // How many times this simcall should be used. If >1, this will be a fork in the state space.