Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Pass std::string parameters by reference too.
[simgrid.git] / src / simix / ActorImpl.hpp
index f8d8102..994afa1 100644 (file)
 #include <functional>
 #include <list>
 #include <map>
+#include <memory>
 
 struct s_smx_process_exit_fun_t {
-  std::function<void(int, void*)> fun;
+  std::function<void(bool, void*)> fun;
   void *arg;
 };
 
@@ -33,7 +34,9 @@ class XBT_PUBLIC ActorImpl : public surf::PropertyHolder {
 
 public:
   xbt::string name_;
-  ActorImpl(xbt::string name, s4u::Host* host);
+  ActorImpl(const xbt::string& name, s4u::Host* host);
+  ActorImpl(const ActorImpl&) = delete;
+  ActorImpl& operator=(const ActorImpl&) = delete;
   ~ActorImpl();
 
   double get_kill_time();
@@ -57,7 +60,7 @@ public:
   bool has_to_auto_restart() { return auto_restart_; }
   void set_auto_restart(bool autorestart) { auto_restart_ = autorestart; }
 
-  context::Context* context_ = nullptr; /* the context (uctx/raw/thread) that executes the user function */
+  std::unique_ptr<context::Context> context_; /* the context (uctx/raw/thread) that executes the user function */
 
   std::exception_ptr exception_;
   bool finished_  = false;
@@ -103,9 +106,12 @@ public:
   s4u::ActorPtr iface() { return s4u::ActorPtr(&piface_); }
   s4u::Actor* ciface() { return &piface_; }
 
-  static ActorImplPtr create(std::string name, simix::ActorCode code, void* data, s4u::Host* host,
+  ActorImplPtr init(const std::string& name, s4u::Host* host);
+  ActorImpl* start(const simix::ActorCode& code);
+
+  static ActorImplPtr create(const std::string& name, const simix::ActorCode& code, void* data, s4u::Host* host,
                              std::unordered_map<std::string, std::string>* properties, ActorImpl* parent_actor);
-  static ActorImplPtr attach(std::string name, void* data, s4u::Host* host,
+  static ActorImplPtr attach(const std::string& name, void* data, s4u::Host* host,
                              std::unordered_map<std::string, std::string>* properties);
   static void detach();
   void cleanup();
@@ -137,10 +143,11 @@ public:
   bool daemon_                                                             = false;
   ProcessArg()                                                             = default;
 
-  explicit ProcessArg(std::string name, std::function<void()> code, void* data, s4u::Host* host, double kill_time,
-                      std::shared_ptr<std::unordered_map<std::string, std::string>> properties, bool auto_restart)
+  explicit ProcessArg(const std::string& name, const std::function<void()>& code, void* data, s4u::Host* host,
+                      double kill_time, std::shared_ptr<std::unordered_map<std::string, std::string>> properties,
+                      bool auto_restart)
       : name(name)
-      , code(std::move(code))
+      , code(code)
       , data(data)
       , host(host)
       , kill_time(kill_time)
@@ -151,7 +158,7 @@ public:
 
   explicit ProcessArg(s4u::Host* host, ActorImpl* actor)
       : name(actor->get_name())
-      , code(std::move(actor->code))
+      , code(actor->code)
       , data(actor->get_user_data())
       , host(host)
       , kill_time(actor->get_kill_time())
@@ -167,7 +174,7 @@ typedef boost::intrusive::list<ActorImpl, boost::intrusive::member_hook<ActorImp
                                                                         &ActorImpl::smx_synchro_hook>>
     SynchroList;
 
-XBT_PUBLIC void create_maestro(std::function<void()> code);
+XBT_PUBLIC void create_maestro(const std::function<void()>& code);
 } // namespace actor
 } // namespace kernel
 } // namespace simgrid