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;
}
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. */
/* 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();
to_c_str(state_));
}
}
+
void ExecImpl::finish()
{
XBT_DEBUG("ExecImpl::finish() in state %s", to_c_str(state_));
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 */
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;
}
void Timer::remove()
{
kernel_timers().erase(handle_);
- delete this;
}
/** Handle any pending timer. Returns if something was actually run. */
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;
}
*/
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.