#include <atomic>
#include <functional>
-#include <future>
#include <memory>
#include <stdexcept>
#include <type_traits>
/** @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 F, class... Args>
- class Task {
- public:
- Task(F&& code, Args&&... args) :
- code_(std::forward<F>(code)),
- args_(std::forward<Args>(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...> args_;
- };
/** Wrap a (possibly non-copyable) single-use task into a `std::function` */
template<class F, class... Args>
static std::function<void()> wrap_task(F f, Args... args)
{
- std::shared_ptr<Task<F, Args...>> task(
- new Task<F, Args...>(std::move(f), std::move(args)...));
+ typedef decltype(f(std::move(args)...)) R;
+ auto task = std::make_shared<simgrid::xbt::Task<R()>>(
+ simgrid::xbt::makeTask(std::move(f), std::move(args)...));
return [=] {
(*task)();
};
Actor(const char* name, s4u::Host *host, double killTime, std::function<void()> code);
Actor(const char* name, s4u::Host *host, std::function<void()> code)
- : Actor(name, host, -1.0d, std::move(code)) {};
+ : Actor(name, host, -1.0, std::move(code)) {};
/** Create an actor using code
*
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<std::string> args);
+
+ Actor(const char* name, s4u::Host *host, const char* function,
+ std::vector<std::string> 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
void kill();
static void kill(int pid);
+ static Actor forPid(int pid);
/**
* Wait for the actor to finish.
/** 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;
};
* 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();
};