X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/53ce86d0b99163e9f523ef8f994854474d297328..2a07cc1dc95048c86a3fc76aca2e9c088f7b5025:/include/simgrid/simix.hpp diff --git a/include/simgrid/simix.hpp b/include/simgrid/simix.hpp index 7cabe4f7e6..9b48080f25 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 @@ -65,7 +65,7 @@ template typename std::result_of::type simcall(F&& code) return result.get(); } -XBT_ATTRIB_DEPRECATED_v325("Please manifest if you actually need this function.") +XBT_ATTRIB_DEPRECATED_v325("Please manifest if you actually need this function") XBT_PUBLIC const std::vector& process_get_runnable(); // What's executed as SIMIX actor code: @@ -74,25 +74,53 @@ typedef std::function ActorCode; // Create an ActorCode based on a std::string typedef std::function args)> ActorCodeFactory; -XBT_PUBLIC void register_function(std::string name, ActorCodeFactory factory); -} -} +XBT_PUBLIC void register_function(const std::string& name, const ActorCodeFactory& factory); -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); +typedef std::pair TimerQelt; +static boost::heap::fibonacci_heap>> simix_timers; -XBT_PUBLIC smx_timer_t SIMIX_timer_set(double date, simgrid::xbt::Task callback); +/** @brief Timer datatype */ +class Timer { + double date = 0.0; -template inline -smx_timer_t SIMIX_timer_set(double date, F callback) -{ - return SIMIX_timer_set(date, simgrid::xbt::Task(std::move(callback))); -} +public: + decltype(simix_timers)::handle_type handle_; -template inline -smx_timer_t SIMIX_timer_set(double date, R(*callback)(T*), T* arg) -{ - return SIMIX_timer_set(date, [callback, arg]() { callback(arg); }); -} + 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 + XBT_ATTRIB_DEPRECATED_v325("Please use a lambda or std::bind") static inline Timer* set(double date, + R (*callback)(T*), T* arg) + { + return set(date, std::bind(callback, arg)); + } + + XBT_ATTRIB_DEPRECATED_v325("Please use a lambda or std::bind") static Timer* set(double date, void (*callback)(void*), + void* arg) + { + return set(date, std::bind(callback, 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(const std::string& name, const simgrid::simix::ActorCode& code, + void* data, sg_host_t host, + std::unordered_map* properties); + +XBT_ATTRIB_DEPRECATED_v325("Please use simgrid::xbt::Timer::set") XBT_PUBLIC smx_timer_t + SIMIX_timer_set(double date, simgrid::xbt::Task&& callback); #endif