Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[sonar] Declare functions "const" in src/s4u/.
[simgrid.git] / include / simgrid / s4u / Engine.hpp
index 234a82b..58e0e8f 100644 (file)
@@ -25,6 +25,8 @@ namespace s4u {
  * This is a singleton containing all the main functions of the simulation.
  */
 class XBT_PUBLIC Engine {
+  friend simgrid::kernel::EngineImpl;
+
 public:
   /** Constructor, taking the command line parameters of your main function */
   explicit Engine(int* argc, char** argv);
@@ -39,34 +41,43 @@ public:
   static void shutdown();
 
   /** Run the simulation after initialization */
-  void run();
+  void run() const;
 
   /** @brief Retrieve the simulation time (in seconds) */
   static double get_clock();
   /** @brief Retrieve the engine singleton */
   static s4u::Engine* get_instance();
 
-  void load_platform(const std::string& platf);
+  void load_platform(const std::string& platf) const;
+
+  XBT_ATTRIB_DEPRECATED_v330("Please change the return code of your actors to void") void register_function(
+      const std::string& name, int (*code)(int, char**));
 
-  void register_function(const std::string& name, int (*code)(int, char**));
-  void register_function(const std::string& name, void (*code)(std::vector<std::string>));
-  void register_default(int (*code)(int, char**));
+  void register_function(const std::string& name, const std::function<void(int, char**)>& code);
+  void register_function(const std::string& name, const std::function<void(std::vector<std::string>)>& code);
 
+  XBT_ATTRIB_DEPRECATED_v330("Please change the return code of your actors to void") void register_default(
+      int (*code)(int, char**));
+  void register_default(const std::function<void(int, char**)>& code);
+  void register_default(const kernel::actor::ActorCodeFactory& factory);
+
+  void register_function(const std::string& name, const kernel::actor::ActorCodeFactory& factory);
   template <class F> void register_actor(const std::string& name)
   {
-    simix::register_function(name, [](std::vector<std::string> args) {
-      return simix::ActorCode([args] {
+    kernel::actor::ActorCodeFactory code_factory = [](std::vector<std::string> args) {
+      return kernel::actor::ActorCode([args] {
         F code(std::move(args));
         code();
       });
-    });
+    };
+    register_function(name, std::move(code_factory));
   }
-
   template <class F> void register_actor(const std::string& name, F code)
   {
-    simix::register_function(name, [code](std::vector<std::string> args) {
-      return simix::ActorCode([code, args] { code(std::move(args)); });
-    });
+    kernel::actor::ActorCodeFactory code_factory = [code](std::vector<std::string> args) {
+      return kernel::actor::ActorCode([code, args] { code(std::move(args)); });
+    };
+    register_function(name, std::move(code_factory));
   }
 
   void load_deployment(const std::string& deploy);
@@ -91,40 +102,45 @@ protected:
 #endif /*DOXYGEN*/
 
 public:
-  size_t get_host_count();
-  /** @brief Returns the list of all hosts found in the platform */
-  std::vector<Host*> get_all_hosts();
-  std::vector<Host*> get_filtered_hosts(const std::function<bool(Host*)>& filter);
-  Host* host_by_name(const std::string& name);
-  Host* host_by_name_or_null(const std::string& name);
-
-  size_t get_link_count();
-  std::vector<Link*> get_all_links();
-  std::vector<Link*> get_filtered_links(const std::function<bool(Link*)>& filter);
-  Link* link_by_name(const std::string& name);
-  Link* link_by_name_or_null(const std::string& name);
-
-  size_t get_actor_count();
-  std::vector<ActorPtr> get_all_actors();
-  std::vector<ActorPtr> get_filtered_actors(const std::function<bool(ActorPtr)>& filter);
+  /** Returns the amount of hosts existing in the platform. */
+  size_t get_host_count() const;
+  /** Returns a vector of all hosts found in the platform.
+   *
+   * The order is generally different from the creation/declaration order in the XML platform because we use a hash
+   * table internally.
+   */
+  std::vector<Host*> get_all_hosts() const;
+  std::vector<Host*> get_filtered_hosts(const std::function<bool(Host*)>& filter) const;
+  Host* host_by_name(const std::string& name) const;
+  Host* host_by_name_or_null(const std::string& name) const;
+
+  size_t get_link_count() const;
+  std::vector<Link*> get_all_links() const;
+  std::vector<Link*> get_filtered_links(const std::function<bool(Link*)>& filter) const;
+  Link* link_by_name(const std::string& name) const;
+  Link* link_by_name_or_null(const std::string& name) const;
+
+  size_t get_actor_count() const;
+  std::vector<ActorPtr> get_all_actors() const;
+  std::vector<ActorPtr> get_filtered_actors(const std::function<bool(ActorPtr)>& filter) const;
 
 #ifndef DOXYGEN
-  size_t get_storage_count();
-  std::vector<Storage*> get_all_storages();
-  Storage* storage_by_name(const std::string& name);
-  Storage* storage_by_name_or_null(const std::string& name);
+  size_t get_storage_count() const;
+  std::vector<Storage*> get_all_storages() const;
+  Storage* storage_by_name(const std::string& name) const;
+  Storage* storage_by_name_or_null(const std::string& name) const;
 #endif
 
-  std::vector<kernel::routing::NetPoint*> get_all_netpoints();
-  kernel::routing::NetPoint* netpoint_by_name_or_null(const std::string& name);
+  std::vector<kernel::routing::NetPoint*> get_all_netpoints() const;
+  kernel::routing::NetPoint* netpoint_by_name_or_null(const std::string& name) const;
 
-  NetZone* get_netzone_root();
+  NetZone* get_netzone_root() const;
   void set_netzone_root(const NetZone* netzone);
 
-  NetZone* netzone_by_name_or_null(const std::string& name);
+  NetZone* netzone_by_name_or_null(const std::string& name) const;
 
   /** @brief Retrieves all netzones of the type indicated by the template argument */
-  template <class T> std::vector<T*> get_filtered_netzones()
+  template <class T> std::vector<T*> get_filtered_netzones() const
   {
     static_assert(std::is_base_of<kernel::routing::NetZoneImpl, T>::value,
                   "Filtering netzones is only possible for subclasses of kernel::routing::NetZoneImpl");
@@ -146,6 +162,10 @@ public:
    * e->set_config("host/model:ptask_L07");
    */
   void set_config(const std::string& str);
+  void set_config(const std::string& name, int value);
+  void set_config(const std::string& name, bool value);
+  void set_config(const std::string& name, double value);
+  void set_config(const std::string& name, const std::string& value);
 
   /** Callback fired when the platform is created (ie, the xml file parsed),
    * right before the actual simulation starts. */
@@ -161,7 +181,8 @@ public:
   /** Callback fired when the time jumps into the future */
   static xbt::signal<void(double)> on_time_advance;
 
-  /** Callback fired when the time cannot advance because of inter-actors deadlock */
+  /** Callback fired when the time cannot advance because of inter-actors deadlock. Note that the on_exit of each actor
+   * is also executed on deadlock. */
   static xbt::signal<void(void)> on_deadlock;
 
 private: