Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix MR74, workaround for s4u-network-ns3-wifi
[simgrid.git] / src / kernel / EngineImpl.hpp
index 380872408e9ac2e59cbec7675f40ef2331541a41..2fcab66f61d4cd1b5d7eebb7863eeb86e96c91ac 100644 (file)
@@ -31,6 +31,9 @@
 
 namespace simgrid {
 namespace kernel {
+// In MC mode, the application sends these pointers to the MC
+xbt_dynar_t get_actors_addr();
+xbt_dynar_t get_dead_actors_addr();
 
 class EngineImpl {
   std::map<std::string, s4u::Host*, std::less<>> hosts_;
@@ -72,12 +75,13 @@ class EngineImpl {
   std::mutex mutex_;
   static EngineImpl* instance_;
   actor::ActorImpl* maestro_ = nullptr;
+  context::ContextFactory* context_factory_ = nullptr;
 
   std::unique_ptr<void, std::function<int(void*)>> platf_handle_; //!< handle for platform library
   friend s4u::Engine;
 
 public:
-  explicit EngineImpl(int* argc, char** argv);
+  EngineImpl() = default;
 
   /* Currently, only one instance is allowed to exist. This is why you can't copy or move it */
 #ifndef DOXYGEN
@@ -90,17 +94,24 @@ public:
   void initialize(int* argc, char** argv);
   void load_platform(const std::string& platf);
   void load_deployment(const std::string& file) const;
+  void seal_platform() const;
   void register_function(const std::string& name, const actor::ActorCodeFactory& code);
   void register_default(const actor::ActorCodeFactory& code);
 
   bool is_maestro(const actor::ActorImpl* actor) const { return actor == maestro_; }
   void set_maestro(actor::ActorImpl* actor) { maestro_ = actor; }
   actor::ActorImpl* get_maestro() const { return maestro_; }
-  void destroy_maestro()
+
+  context::ContextFactory* get_context_factory() const { return context_factory_; }
+  void set_context_factory(context::ContextFactory* factory) { context_factory_ = factory; }
+  bool has_context_factory() const { return context_factory_ != nullptr; }
+  void destroy_context_factory()
   {
-    delete maestro_;
-    maestro_ = nullptr;
+    delete context_factory_;
+    context_factory_ = nullptr;
   }
+
+  void context_mod_init() const;
   /**
    * @brief Add a model to engine list
    *
@@ -113,6 +124,7 @@ public:
   /** @brief Get list of all models managed by this engine */
   const std::vector<resource::Model*>& get_all_models() const { return models_; }
 
+  static bool has_instance() { return s4u::Engine::has_instance(); }
   static EngineImpl* get_instance() { return s4u::Engine::get_instance()->pimpl; }
   static EngineImpl* get_instance(int* argc, char** argv) { return s4u::Engine::get_instance(argc, argv)->pimpl; }
 
@@ -124,6 +136,9 @@ public:
     else
       return res->second;
   }
+
+  routing::NetZoneImpl* get_netzone_root() const { return netzone_root_; }
+
   void add_daemon(actor::ActorImpl* d) { daemons_.insert(d); }
   void remove_daemon(actor::ActorImpl* d);
   void add_actor_to_run_list(actor::ActorImpl* actor);
@@ -168,8 +183,26 @@ public:
   void display_all_actor_status() const;
   void run_all_actors();
 
-  /** @brief Run the main simulation loop. */
-  void run();
+  /*  @brief Finish simulation initialization
+   *  This function must be called before the first call to solve()
+   */
+  void presolve() const;
+  /** @brief Performs a part of the simulation
+   *  @param max_date Maximum date to update the simulation to, or -1
+   *  @return the elapsed time, or -1.0 if no event could be executed
+   *
+   *  This function execute all possible events, update the action states  and returns the time elapsed.
+   *  When you call execute or communicate on a model, the corresponding actions are not executed immediately but only
+   *  when you call solve().
+   *  Note that the returned elapsed time can be zero.
+   */
+  double solve(double max_date) const;
+
+  /** @brief Run the main simulation loop until the specified date (or infinitly if max_date is negative). */
+  void run(double max_date);
+
+  /** @brief Return the current time in milliseconds. */
+  static double get_clock();
 };
 
 } // namespace kernel