Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Revert "use smart pointers for kernel timers"
authorSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 10 Nov 2021 13:53:23 +0000 (14:53 +0100)
committerSUTER Frederic <frederic.suter@cc.in2p3.fr>
Wed, 10 Nov 2021 13:53:23 +0000 (14:53 +0100)
This reverts commit 322e28c4503ed99d6c36ad9f450a3c0e515b4a8d.

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 d9af164..6add5c2 100644 (file)
@@ -19,7 +19,7 @@ namespace timer {
 
 inline auto& kernel_timers() // avoid static initialization order fiasco
 {
-  using TimerQelt = std::pair<double, std::shared_ptr<Timer>>;
+  using TimerQelt = std::pair<double, 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 std::shared_ptr<Timer> set(double date, F callback)
+  template <class F> static inline Timer* set(double date, F callback)
   {
     return set(date, xbt::Task<void()>(std::move(callback)));
   }
 
-  static std::shared_ptr<Timer> set(double date, xbt::Task<void()>&& callback);
+  static 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 bddc871..e2f5158 100644 (file)
@@ -334,7 +334,10 @@ void EngineImpl::shutdown()
   /* Finish context module and SURF */
   instance_->destroy_context_factory();
 
-  timer::kernel_timers().clear();
+  while (not timer::kernel_timers().empty()) {
+    delete timer::kernel_timers().top().second;
+    timer::kernel_timers().pop();
+  }
 
   tmgr_finalize();
   sg_platf_exit();
index 0e79088..4e3f3f2 100644 (file)
@@ -181,7 +181,6 @@ 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 5ce712f..b5ae3c0 100644 (file)
@@ -75,7 +75,7 @@ public:
       std::make_shared<std::vector<std::function<void(bool)>>>();
 
   std::function<void()> code_;
-  std::shared_ptr<timer::Timer> kill_timer_ = nullptr;
+  timer::Timer* kill_timer_ = nullptr;
 
 private:
   /* Refcounting */
index af0b2af..f9d85e7 100644 (file)
@@ -11,9 +11,9 @@ namespace simgrid {
 namespace kernel {
 namespace timer {
 
-std::shared_ptr<Timer> Timer::set(double date, xbt::Task<void()>&& callback)
+Timer* Timer::set(double date, xbt::Task<void()>&& callback)
 {
-  auto timer     = std::make_shared<Timer>(date, std::move(callback));
+  auto* timer    = new Timer(date, std::move(callback));
   timer->handle_ = kernel_timers().emplace(std::make_pair(date, timer));
   return timer;
 }
@@ -22,6 +22,7 @@ std::shared_ptr<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. */
@@ -31,9 +32,10 @@ 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)
-    std::shared_ptr<Timer> timer = kernel_timers().top().second;
+    Timer* timer = kernel_timers().top().second;
     kernel_timers().pop();
     timer->callback();
+    delete timer;
   }
   return result;
 }
index 15bfb57..13ab4f1 100644 (file)
@@ -45,8 +45,8 @@ union u_smx_scalar {
  */
 struct s_smx_simcall {
   simgrid::simix::Simcall call_                      = simgrid::simix::Simcall::NONE;
-  simgrid::kernel::actor::ActorImpl* issuer_                 = nullptr;
-  std::shared_ptr<simgrid::kernel::timer::Timer> timeout_cb_ = nullptr; // Callback to timeouts
+  smx_actor_t issuer_                                = nullptr;
+  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.