X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/96cedde3cdbc0b8ffc3f096a1b65d021b0226f99..978ba263685f9f76f4721930decccebbbf776816:/include/simgrid/simix.hpp diff --git a/include/simgrid/simix.hpp b/include/simgrid/simix.hpp index 7137598d14..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 @@ -61,11 +61,12 @@ template typename std::result_of::type simcall(F&& code) // conveniently handles the success/failure value for us. typedef typename std::result_of::type R; simgrid::xbt::Result result; - simcall_run_kernel([&] { simgrid::xbt::fulfill_promise(result, std::forward(code)); }); + simcall_run_kernel([&result, &code] { simgrid::xbt::fulfill_promise(result, std::forward(code)); }); return result.get(); } -XBT_PUBLIC const std::vector& process_get_runnable(); +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: typedef std::function ActorCode; @@ -73,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); }); -} + 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