Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
move another function out of simix + private field
[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/simix.h>
9
10 namespace simgrid {
11 namespace kernel {
12 namespace timer {
13
14 Timer* Timer::set(double date, xbt::Task<void()>&& callback)
15 {
16   auto* timer    = new 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   delete this;
26 }
27
28 /** Handle any pending timer. Returns if something was actually run. */
29 bool Timer::execute_all()
30 {
31   bool result = false;
32   while (not kernel_timers().empty() && SIMIX_get_clock() >= kernel_timers().top().first) {
33     result = true;
34     // FIXME: make the timers being real callbacks (i.e. provide dispatchers that read and expand the args)
35     Timer* timer = kernel_timers().top().second;
36     kernel_timers().pop();
37     timer->callback();
38     delete timer;
39   }
40   return result;
41 }
42
43 } // namespace timer
44 } // namespace kernel
45 } // namespace simgrid