X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fbecf54f013a2c4171160f4aad8a4d8377bee1f9..51d099097598a993323850816311d3f78956e6a0:/include/simgrid/simix.hpp diff --git a/include/simgrid/simix.hpp b/include/simgrid/simix.hpp index 72a9f50d07..4e7aeff162 100644 --- a/include/simgrid/simix.hpp +++ b/include/simgrid/simix.hpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -40,7 +41,6 @@ void simcall_run_blocking(F& f) } namespace simgrid { - namespace simix { /** Execute some code in the kernel/maestro @@ -75,24 +75,45 @@ typedef std::function ActorCode; typedef std::function args)> ActorCodeFactory; XBT_PUBLIC void register_function(const std::string& name, ActorCodeFactory factory); -} -} + +typedef std::pair TimerQelt; +static boost::heap::fibonacci_heap>> simix_timers; + +/** @brief Timer datatype */ +class Timer { + double date = 0.0; + +public: + decltype(simix_timers)::handle_type handle_; + + Timer(double date, simgrid::xbt::Task callback) : date(date), callback(std::move(callback)) {} + + simgrid::xbt::Task callback; + double get_date() { return date; } + void remove(); + + template static inline Timer* set(double date, F callback) + { + return set(date, simgrid::xbt::Task(std::move(callback))); + } + + template static inline Timer* set(double date, R (*callback)(T*), T* arg) + { + return set(date, [callback, arg]() { callback(arg); }); + } + + static Timer* set(double date, void (*callback)(void*), void* arg); + static Timer* set(double date, simgrid::xbt::Task callback); + static double next() { return simix_timers.empty() ? -1.0 : simix_timers.top().first; } +}; + +} // namespace simix +} // namespace simgrid XBT_PUBLIC smx_actor_t simcall_process_create(std::string name, simgrid::simix::ActorCode code, void* data, sg_host_t host, std::unordered_map* properties); XBT_PUBLIC smx_timer_t SIMIX_timer_set(double date, simgrid::xbt::Task callback); -template inline -smx_timer_t SIMIX_timer_set(double date, F callback) -{ - return SIMIX_timer_set(date, simgrid::xbt::Task(std::move(callback))); -} - -template inline -smx_timer_t SIMIX_timer_set(double date, R(*callback)(T*), T* arg) -{ - return SIMIX_timer_set(date, [callback, arg]() { callback(arg); }); -} #endif