X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7909cf41f4c5112fbc9066bcd8ecb8498e3a570a..5dd78326c18ad61561204c0d11470890cd12d091:/src/kernel/xml/platf_sax_cb.cpp diff --git a/src/kernel/xml/platf_sax_cb.cpp b/src/kernel/xml/platf_sax_cb.cpp index df5b5ccaa8..d48b491ea2 100644 --- a/src/kernel/xml/platf_sax_cb.cpp +++ b/src/kernel/xml/platf_sax_cb.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -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 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 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 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 " + 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, ": 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 " + 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, ": 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 " + 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, ": 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 " + 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, ": 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 " + 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, ": Link " + name + " undefined."); link->set_latency_profile(profile); }