X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2918cda53052dc99d7c2477218a60000c11281be..9b293653796940679ea8e2bd162e547248546e29:/include/simgrid/s4u/actor.hpp diff --git a/include/simgrid/s4u/actor.hpp b/include/simgrid/s4u/actor.hpp index 53bb726839..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)(); }; @@ -189,7 +168,7 @@ public: Actor(const char* name, s4u::Host *host, double killTime, std::function code); Actor(const char* name, s4u::Host *host, std::function code) - : Actor(name, host, -1.0d, std::move(code)) {}; + : Actor(name, host, -1.0, std::move(code)) {}; /** Create an actor using code * @@ -206,6 +185,15 @@ public: Actor(name, host, wrap_task(std::move(code), std::move(args)...)) {} + // Create actor from function name: + + 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, + 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 @@ -231,6 +219,7 @@ public: void kill(); static void kill(int pid); + static Actor forPid(int pid); /** * Wait for the actor to finish. @@ -242,6 +231,8 @@ public: /** Ask kindly to all actors to die. Only the issuer will survive. */ static void killAll(); + bool valid() const { return pimpl_ != nullptr; } + private: smx_process_t pimpl_ = nullptr; }; @@ -267,6 +258,11 @@ namespace this_actor { * See \ref Comm for the full communication API (including non blocking communications). */ XBT_PUBLIC(void) send(Mailbox &chan, void*payload, size_t simulatedSize); + + /** + * Return the PID of the current actor. + */ + XBT_PUBLIC(int) getPid(); };