Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
use smart pointers for kernel timers
[simgrid.git] / src / kernel / timer / Timer.cpp
1 /* Copyright (c) 2021. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include <simgrid/kernel/Timer.hpp>
8 #include <simgrid/s4u/Engine.hpp>
9
10 namespace simgrid {
11 namespace kernel {
12 namespace timer {
13
14 std::shared_ptr<Timer> Timer::set(double date, xbt::Task<void()>&& callback)
15 {
16   auto timer     = std::make_shared<Timer>(date, std::move(callback));
17   timer->handle_ = kernel_timers().emplace(std::make_pair(date, timer));
18   return timer;
19 }
20
21 /** @brief cancels a timer that was added earlier */
22 void Timer::remove()
23 {
24   kernel_timers().erase(handle_);
25 }
26
27 /** Handle any pending timer. Returns if something was actually run. */
28 bool Timer::execute_all()
29 {
30   bool result = false;
31   while (not kernel_timers().empty() && s4u::Engine::get_clock() >= kernel_timers().top().first) {
32     result = true;
33     // FIXME: make the timers being real callbacks (i.e. provide dispatchers that read and expand the args)
34     std::shared_ptr<Timer> timer = kernel_timers().top().second;
35     kernel_timers().pop();
36     timer->callback();
37   }
38   return result;
39 }
40
41 } // namespace timer
42 } // namespace kernel
43 } // namespace simgrid