X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1e063a94dba49a1314cfbcdceb33fa6ed0dc3130..9b293653796940679ea8e2bd162e547248546e29:/include/simgrid/s4u/actor.hpp diff --git a/include/simgrid/s4u/actor.hpp b/include/simgrid/s4u/actor.hpp index 9b38309464..52c7286841 100644 --- a/include/simgrid/s4u/actor.hpp +++ b/include/simgrid/s4u/actor.hpp @@ -8,7 +8,6 @@ #include #include -#include #include #include #include @@ -125,33 +124,13 @@ namespace s4u { /** @brief Simulation Agent (see \ref s4u_actor)*/ XBT_PUBLIC_CLASS Actor { private: - /** Wrap a (possibly non-copyable) single-use task into a `std::function` */ - template - class Task { - public: - Task(F&& code, Args&&... args) : - code_(std::forward(code)), - args_(std::forward(args)...) - { - done_.clear(); - } - void operator()() - { - if (done_.test_and_set()) - throw std::logic_error("Actor task already executed"); - simgrid::xbt::apply(std::move(code_), std::move(args_)); - } - private: - std::atomic_flag done_; - F code_; - std::tuple args_; - }; /** Wrap a (possibly non-copyable) single-use task into a `std::function` */ template static std::function wrap_task(F f, Args... args) { - std::shared_ptr> task( - new Task(std::move(f), std::move(args)...)); + typedef decltype(f(std::move(args)...)) R; + auto task = std::make_shared>( + simgrid::xbt::makeTask(std::move(f), std::move(args)...)); return [=] { (*task)(); }; @@ -208,10 +187,12 @@ public: // Create actor from function name: - Actor(const char* name, s4u::Host *host, double killTime, const char* function, simgrid::xbt::args args); + Actor(const char* name, s4u::Host *host, double killTime, + const char* function, std::vector args); - Actor(const char* name, s4u::Host *host, const char* function, simgrid::xbt::args args) : - Actor(name, host, -1.0, function, std::move(args)) {} + Actor(const char* name, s4u::Host *host, const char* function, + std::vector args) + : Actor(name, host, -1.0, function, std::move(args)) {} /** Retrieves the actor that have the given PID (or NULL if not existing) */ //static Actor *byPid(int pid); not implemented