X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f20fe8a11db9e893dbf55a03d4cf6132bdc4c65c..1cce0801abcad7c884f9e72ceda87e36d6635104:/include/simgrid/s4u/actor.hpp diff --git a/include/simgrid/s4u/actor.hpp b/include/simgrid/s4u/actor.hpp index 629ff2f8cb..4f3a1a9f5d 100644 --- a/include/simgrid/s4u/actor.hpp +++ b/include/simgrid/s4u/actor.hpp @@ -8,7 +8,6 @@ #include #include -#include #include #include #include @@ -22,9 +21,7 @@ namespace simgrid { namespace s4u { -/** @addtogroup s4u_actor - * - * @tableofcontents +/** @ingroup s4u_api * * An actor is an independent stream of execution in your distributed application. * @@ -40,8 +37,6 @@ namespace s4u { * of this standard may help to understand the philosophy of the S4U * Actors. * - * (back to the @ref s4u_api "S4U documentation") - * * @section s4u_actor_def Defining the skeleton of an Actor * * %As in the C++11 @@ -49,6 +44,8 @@ namespace s4u { * pure function or as an object. It is very simple with functions: * * @code{.cpp} + * #include "s4u/actor.hpp" + * * // Declare the code of your worker * void worker() { * printf("Hello s4u"); @@ -56,7 +53,8 @@ namespace s4u { * }; * * // From your main or from another actor, create your actor on the host Jupiter - * Actor("worker", simgrid::s4u::Host::by_name("Jupiter"), worker); + * // The following line actually creates a new actor, even if there is no "new". + * Actor("Alice", simgrid::s4u::Host::by_name("Jupiter"), worker); * @endcode * * But some people prefer to encapsulate their actors in classes and @@ -76,7 +74,7 @@ namespace s4u { * }; * * // From your main or from another actor, create your actor. Note the () after Worker - * Actor("worker", simgrid::s4u::Host::by_name("Jupiter"), Worker()); + * Actor("Bob", simgrid::s4u::Host::by_name("Jupiter"), Worker()); * @endcode * * @section s4u_actor_flesh Fleshing your actor @@ -133,7 +131,9 @@ private: Task(F&& code, Args&&... args) : code_(std::forward(code)), args_(std::forward(args)...) - {} + { + done_.clear(); + } void operator()() { if (done_.test_and_set()) @@ -141,7 +141,7 @@ private: simgrid::xbt::apply(std::move(code_), std::move(args_)); } private: - std::atomic_flag done_ = ATOMIC_FLAG_INIT; + std::atomic_flag done_; F code_; std::tuple args_; }; @@ -188,7 +188,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 * @@ -205,6 +205,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 @@ -230,6 +239,7 @@ public: void kill(); static void kill(int pid); + static Actor forPid(int pid); /** * Wait for the actor to finish. @@ -241,11 +251,14 @@ 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; }; -/** @brief Static methods working on the current actor (see @ref s4u_actor) */ +/** @ingroup s4u_api + * @brief Static methods working on the current actor (see @ref s4u::Actor) */ namespace this_actor { /** Block the actor sleeping for that amount of seconds (may throws hostFailure) */ @@ -265,6 +278,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(); };