Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Cleanup in log categories
[simgrid.git] / src / kernel / EngineImpl.cpp
index c674144..16b2c48 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2016-2022. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
 #include "src/kernel/EngineImpl.hpp"
+#include "src/kernel/resource/StandardLinkImpl.hpp"
 #include "src/kernel/resource/profile/Profile.hpp"
 #include "src/mc/mc_record.hpp"
 #include "src/mc/mc_replay.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
-#include "src/surf/network_interface.hpp"
 #include "src/surf/xml/platf.hpp"
-#include "xbt/xbt_modinter.h"     /* whether initialization was already done */
+#include "xbt/xbt_modinter.h" /* whether initialization was already done */
 
 #include <boost/algorithm/string/predicate.hpp>
 #ifndef _WIN32
@@ -238,7 +238,7 @@ void EngineImpl::initialize(int* argc, char** argv)
 
   /* register a function to be called by SURF after the environment creation */
   sg_platf_init();
-  s4u::Engine::on_platform_created.connect([this]() { this->presolve(); });
+  s4u::Engine::on_platform_created_cb([this]() { this->presolve(); });
 
   if (config::get_value<bool>("debug/clean-atexit"))
     atexit(shutdown);
@@ -329,7 +329,8 @@ void EngineImpl::shutdown()
   instance_->empty_trash();
 
   /* Let's free maestro now */
-  instance_->destroy_maestro();
+  delete instance_->maestro_;
+  instance_->maestro_ = nullptr;
 
   /* Finish context module and SURF */
   instance_->destroy_context_factory();
@@ -346,6 +347,15 @@ void EngineImpl::shutdown()
   instance_ = nullptr;
 }
 
+void EngineImpl::seal_platform() const
+{
+  /* sealing resources before run: links */
+  for (auto const& kv : links_)
+    kv.second->get_iface()->seal();
+  /* seal netzone root, recursively seal children netzones, hosts and disks */
+  netzone_root_->seal();
+}
+
 void EngineImpl::load_platform(const std::string& platf)
 {
   double start = xbt_os_time();
@@ -418,9 +428,8 @@ void EngineImpl::wake_all_waiting_actors() const
       if (action->get_activity() != nullptr) {
         // If nobody told the interface that the activity has failed, that's because no actor waits on it (maestro
         // started it). SimDAG I see you!
-        auto* exec = dynamic_cast<activity::ExecImpl*>(action->get_activity());
-        if (exec != nullptr && exec->get_actor() == maestro_)
-          exec->get_iface()->complete(s4u::Activity::State::FAILED);
+        if (action->get_activity()->get_actor() == maestro_)
+          action->get_activity()->get_iface()->complete(s4u::Activity::State::FAILED);
 
         activity::ActivityImplPtr(action->get_activity())->post();
       }
@@ -433,12 +442,11 @@ void EngineImpl::wake_all_waiting_actors() const
       else {
         // If nobody told the interface that the activity is finished, that's because no actor waits on it (maestro
         // started it). SimDAG I see you!
-        // TODO: do the same for other activity kinds once comms are cleaned up
-        auto* exec = dynamic_cast<activity::ExecImpl*>(action->get_activity());
-        if (exec != nullptr && exec->get_actor() == maestro_) {
-          exec->set_finish_time(action->get_finish_time());
-          exec->get_iface()->complete(s4u::Activity::State::FINISHED);
-        }
+        action->get_activity()->set_finish_time(action->get_finish_time());
+
+        if (action->get_activity()->get_actor() == maestro_)
+          action->get_activity()->get_iface()->complete(s4u::Activity::State::FINISHED);
+
         activity::ActivityImplPtr(action->get_activity())->post();
       }
     }
@@ -554,10 +562,10 @@ void EngineImpl::display_all_actor_status() const
       if (boost::dynamic_pointer_cast<kernel::activity::IoImpl>(actor->waiting_synchro_) != nullptr)
         synchro_description = "I/O";
 
-      XBT_INFO("Actor %ld (%s@%s): waiting for %s activity %#zx (%s) in state %d to finish", actor->get_pid(),
+      XBT_INFO("Actor %ld (%s@%s): waiting for %s activity %#zx (%s) in state %s to finish", actor->get_pid(),
                actor->get_cname(), actor->get_host()->get_cname(), synchro_description,
                (xbt_log_no_loc ? (size_t)0xDEADBEEF : (size_t)actor->waiting_synchro_.get()),
-               actor->waiting_synchro_->get_cname(), (int)actor->waiting_synchro_->state_);
+               actor->waiting_synchro_->get_cname(), actor->waiting_synchro_->get_state_str());
     } else {
       XBT_INFO("Actor %ld (%s@%s) simcall %s", actor->get_pid(), actor->get_cname(), actor->get_host()->get_cname(),
                SIMIX_simcall_name(actor->simcall_));
@@ -690,6 +698,8 @@ double EngineImpl::solve(double max_date) const
 
 void EngineImpl::run(double max_date)
 {
+  seal_platform();
+
   if (MC_record_replay_is_active()) {
     mc::replay(MC_record_path());
     empty_trash();
@@ -697,7 +707,7 @@ void EngineImpl::run(double max_date)
   }
 
   double elapsed_time = -1;
-  std::set<s4u::Activity*>* vetoed_activities = s4u::Activity::get_vetoed_activities();
+  const std::set<s4u::Activity*>* vetoed_activities = s4u::Activity::get_vetoed_activities();
 
   do {
     XBT_DEBUG("New Schedule Round; size(queue)=%zu", actors_to_run_.size());
@@ -847,7 +857,6 @@ void EngineImpl::run(double max_date)
         maestro_->kill(kv.second);
       }
     }
-
   } while ((vetoed_activities == nullptr || vetoed_activities->empty()) &&
            ((elapsed_time > -1.0 && not double_equals(max_date, NOW, 0.00001)) || has_actors_to_run()));