Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update .mailmap.
[simgrid.git] / src / kernel / xml / platf_sax_cb.cpp
index df5b5cc..d48b491 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <simgrid/Exception.hpp>
 #include <simgrid/kernel/routing/NetPoint.hpp>
+#include <simgrid/s4u/Disk.hpp>
 #include <simgrid/s4u/Engine.hpp>
 #include <simgrid/s4u/Host.hpp>
 #include <xbt/file.hpp>
@@ -31,6 +32,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(platf_parse, ker_platform, "Logging specific to
 std::string simgrid_parsed_filename;                            // Currently parsed file (for the error messages)
 static std::vector<simgrid::s4u::LinkInRoute> parsed_link_list; /* temporary store of current link list of a route */
 
+static bool fire_on_platform_created_callback;
+
 /* Helping functions */
 void simgrid_parse_assert(bool cond, const std::string& msg)
 {
@@ -257,9 +260,56 @@ void STag_simgrid_parse_platform()
                            "The most recent formalism that this version of SimGrid understands is v4.1.\n"
                            "Please update your code, or use another, more adapted, file.");
 }
+
+static void add_remote_disks()
+{
+  for (auto const& host : simgrid::s4u::Engine::get_instance()->get_all_hosts()) {
+    const char* remote_disk_str = host->get_property("remote_disk");
+    if (not remote_disk_str)
+      continue;
+    std::vector<std::string> tokens;
+    boost::split(tokens, remote_disk_str, boost::is_any_of(":"));
+    const simgrid::s4u::Host* remote_host = simgrid::s4u::Host::by_name_or_null(tokens[2]);
+    xbt_assert(remote_host, "You're trying to access a host that does not exist. Please check your platform file");
+
+    const simgrid::s4u::Disk* disk = nullptr;
+    for (auto const& d : remote_host->get_disks())
+      if (d->get_name() == tokens[1]) {
+        disk = d;
+        break;
+      }
+
+    xbt_assert(disk, "You're trying to mount a disk that does not exist. Please check your platform file");
+    host->add_disk(disk);
+
+    XBT_DEBUG("Host '%s' wants to access a remote disk: %s of %s", host->get_cname(), disk->get_cname(),
+              remote_host->get_cname());
+    XBT_DEBUG("Host '%s' now has %zu disks", host->get_cname(), host->get_disks().size());
+  }
+}
+
+static void remove_remote_disks()
+{
+  XBT_DEBUG("Simulation is over, time to unregister remote disks if any");
+  for (auto const& host : simgrid::s4u::Engine::get_instance()->get_all_hosts()) {
+    const char* remote_disk_str = host->get_property("remote_disk");
+    if (remote_disk_str) {
+      std::vector<std::string> tokens;
+      boost::split(tokens, remote_disk_str, boost::is_any_of(":"));
+      XBT_DEBUG("Host '%s' wants to unmount a remote disk: %s of %s", host->get_cname(),
+                tokens[1].c_str(), tokens[2].c_str());
+      host->remove_disk(tokens[1]);
+      XBT_DEBUG("Host '%s' now has %zu disks", host->get_cname(), host->get_disks().size());
+    }
+  }
+}
+
 void ETag_simgrid_parse_platform()
 {
-  simgrid::s4u::Engine::on_platform_created();
+  simgrid::s4u::Engine::on_platform_created_cb(&add_remote_disks);
+  simgrid::s4u::Engine::on_simulation_end_cb(&remove_remote_disks);
+  if (fire_on_platform_created_callback)
+    simgrid::s4u::Engine::on_platform_created();
 }
 
 void STag_simgrid_parse_prop()
@@ -532,7 +582,7 @@ void ETag_simgrid_parse_link()
 
 void STag_simgrid_parse_link___ctn()
 {
-  const auto engine = simgrid::s4u::Engine::get_instance();
+  const auto* engine = simgrid::s4u::Engine::get_instance();
   const simgrid::s4u::Link* link;
   simgrid::s4u::LinkInRoute::Direction direction = simgrid::s4u::LinkInRoute::Direction::NONE;
   switch (A_simgrid_parse_link___ctn_direction) {
@@ -947,20 +997,21 @@ void simgrid_parse_close()
 }
 
 /* Call the lexer to parse the currently opened file */
-void simgrid_parse()
+void simgrid_parse(bool fire_on_platform_created_callback_param)
 {
+  fire_on_platform_created_callback = fire_on_platform_created_callback_param;
   bool err = simgrid_parse_lex();
   simgrid_parse_assert(not err, "Flex returned an error code");
 
   /* Actually connect the traces now that every elements are created */
-  const auto engine = simgrid::s4u::Engine::get_instance();
+  const auto* engine = simgrid::s4u::Engine::get_instance();
 
   for (auto const& [trace, name] : trace_connect_list_host_avail) {
     simgrid_parse_assert(traces_set_list.find(trace) != traces_set_list.end(),
                          "<trace_connect kind=\"HOST_AVAIL\">: Trace " + trace + " undefined.");
-    auto profile = traces_set_list.at(trace);
+    auto* profile = traces_set_list.at(trace);
 
-    auto host = engine->host_by_name_or_null(name);
+    auto* host = engine->host_by_name_or_null(name);
     simgrid_parse_assert(host, "<trace_connect kind=\"HOST_AVAIL\">: Host " + name + " undefined.");
     host->set_state_profile(profile);
   }
@@ -969,9 +1020,9 @@ void simgrid_parse()
   for (auto const& [trace, name] : trace_connect_list_host_speed) {
     simgrid_parse_assert(traces_set_list.find(trace) != traces_set_list.end(),
                          "<trace_connect kind=\"SPEED\">: Trace " + trace + " undefined.");
-    auto profile = traces_set_list.at(trace);
+    auto* profile = traces_set_list.at(trace);
 
-    auto host = engine->host_by_name_or_null(name);
+    auto* host = engine->host_by_name_or_null(name);
     simgrid_parse_assert(host, "<trace_connect kind=\"SPEED\">: Host " + name + " undefined.");
     host->set_speed_profile(profile);
   }
@@ -980,9 +1031,9 @@ void simgrid_parse()
   for (auto const& [trace, name] : trace_connect_list_link_avail) {
     simgrid_parse_assert(traces_set_list.find(trace) != traces_set_list.end(),
                          "<trace_connect kind=\"LINK_AVAIL\">: Trace " + trace + " undefined.");
-    auto profile = traces_set_list.at(trace);
+    auto* profile = traces_set_list.at(trace);
 
-    auto link = engine->link_by_name_or_null(name);
+    auto* link = engine->link_by_name_or_null(name);
     simgrid_parse_assert(link, "<trace_connect kind=\"LINK_AVAIL\">: Link " + name + " undefined.");
     link->set_state_profile(profile);
   }
@@ -991,9 +1042,9 @@ void simgrid_parse()
   for (auto const& [trace, name] : trace_connect_list_link_bw) {
     simgrid_parse_assert(traces_set_list.find(trace) != traces_set_list.end(),
                          "<trace_connect kind=\"BANDWIDTH\">: Trace " + trace + " undefined.");
-    auto profile = traces_set_list.at(trace);
+    auto* profile = traces_set_list.at(trace);
 
-    auto link = engine->link_by_name_or_null(name);
+    auto* link = engine->link_by_name_or_null(name);
     simgrid_parse_assert(link, "<trace_connect kind=\"BANDWIDTH\">: Link " + name + " undefined.");
     link->set_bandwidth_profile(profile);
   }
@@ -1002,9 +1053,9 @@ void simgrid_parse()
   for (auto const& [trace, name] : trace_connect_list_link_lat) {
     simgrid_parse_assert(traces_set_list.find(trace) != traces_set_list.end(),
                          "<trace_connect kind=\"LATENCY\">: Trace " + trace + " undefined.");
-    auto profile = traces_set_list.at(trace);
+    auto* profile = traces_set_list.at(trace);
 
-    auto link = engine->link_by_name_or_null(name);
+    auto* link = engine->link_by_name_or_null(name);
     simgrid_parse_assert(link, "<trace_connect kind=\"LATENCY\">: Link " + name + " undefined.");
     link->set_latency_profile(profile);
   }