X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c6bbeb1829c36ff45b43ab25f9d8d3f53f554d98..76b872bca9ddd10876af32d48c6093a87ec138fc:/src/instr/jedule/jedule_platform.cpp?ds=sidebyside diff --git a/src/instr/jedule/jedule_platform.cpp b/src/instr/jedule/jedule_platform.cpp index 3c6a59117c..76631fe6e4 100644 --- a/src/instr/jedule/jedule_platform.cpp +++ b/src/instr/jedule/jedule_platform.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2020. 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. */ @@ -31,15 +31,14 @@ Container::Container(const std::string& name) : name(name) void Container::add_child(jed_container_t child) { xbt_assert(child != nullptr); - this->children.emplace_back(child); - child->parent = this; + children_.emplace_back(child); + child->set_parent(this); } void Container::add_resources(std::vector hosts) { - this->is_lowest_ = 1; - this->children.clear(); - this->last_id_ = 0; + children_.clear(); + last_id_ = 0; for (auto const& host : hosts) { const char *host_name = sg_host_get_name(host); @@ -50,7 +49,7 @@ void Container::add_resources(std::vector hosts) } } -void Container::create_hierarchy(sg_netzone_t from_as) +void Container::create_hierarchy(const_sg_netzone_t from_as) { if (from_as->get_children().empty()) { // I am no AS @@ -59,40 +58,35 @@ void Container::create_hierarchy(sg_netzone_t from_as) this->add_resources(table); } else { for (auto const& nz : from_as->get_children()) { - jed_container_t child_container = new simgrid::jedule::Container(nz->get_name()); + auto* child_container = new simgrid::jedule::Container(nz->get_name()); this->add_child(child_container); child_container->create_hierarchy(nz); } } } -std::vector Container::get_hierarchy() +int Container::get_child_position(const Container* child) const { - if(this->parent != nullptr ) { - if (not this->parent->children.empty()) { - // we are in the last level - return this->parent->get_hierarchy(); - } else { - unsigned int i =0; - int child_nb = -1; - - for (auto const& child : this->parent->children) { - if (child.get() == this) { - child_nb = i; - break; - } - i++; - } + auto it = std::find_if(begin(children_), end(children_), + [&child](const std::unique_ptr& c) { return c.get() == child; }); + return it == end(children_) ? -1 : static_cast(std::distance(begin(children_), it)); +} - xbt_assert( child_nb > - 1); - std::vector heir_list = this->parent->get_hierarchy(); - heir_list.insert(heir_list.begin(), child_nb); - return heir_list; - } - } else { +std::vector Container::get_hierarchy() +{ + if (parent_ == nullptr) { int top_level = 0; - std::vector heir_list = {top_level}; - return heir_list; + std::vector hier_list = {top_level}; + return hier_list; + } else if (parent_->has_children()) { + int child_nb = parent_->get_child_position(this); + xbt_assert(child_nb > -1); + std::vector hier_list = parent_->get_hierarchy(); + hier_list.insert(hier_list.begin(), child_nb); + return hier_list; + } else { + // we are in the last level + return parent_->get_hierarchy(); } } @@ -100,15 +94,15 @@ std::string Container::get_hierarchy_as_string() { std::string output(""); - std::vector heir_list = this->get_hierarchy(); + std::vector hier_list = this->get_hierarchy(); - unsigned int length = heir_list.size(); - unsigned int i = 0; - for (auto const& id : heir_list) { + bool sep = false; + for (auto const& id : hier_list) { + if (sep) + output += '.'; + else + sep = true; output += std::to_string(id); - if( i != length-1 ) { - output += "."; - } } return output; @@ -116,20 +110,19 @@ std::string Container::get_hierarchy_as_string() void Container::print_resources(FILE* jed_file) { - unsigned int i=0; xbt_assert(not this->resource_list.empty()); - unsigned int res_nb = this->resource_list.size(); - std::string resid = this->get_hierarchy_as_string(); + std::string resid = this->get_hierarchy_as_string(); - fprintf(jed_file, " resource_list.size()); + bool sep = false; for (auto const& res : this->resource_list) { + if (sep) + putc('|', jed_file); + else + sep = true; const char * res_name = sg_host_get_name(res); fprintf(jed_file, "%s", res_name); - if( i != res_nb-1 ) { - fprintf(jed_file, "|"); - } - i++; } fprintf(jed_file, "\" />\n"); } @@ -137,8 +130,8 @@ void Container::print_resources(FILE* jed_file) void Container::print(FILE* jed_file) { fprintf(jed_file, " \n", this->name.c_str()); - if (not this->children.empty()) { - for (auto const& child : this->children) { + if (not children_.empty()) { + for (auto const& child : children_) { child->print(jed_file); } } else { @@ -164,31 +157,29 @@ static void add_subsets_to(std::vector& subset_list, st for (auto const& host_name : hostgroup) { xbt_assert( host_name != nullptr ); - jed_container_t parent_cont = host2_simgrid_parent_container.at(host_name); - unsigned int id = parent_cont->name2id.at(host_name); + const simgrid::jedule::Container* parent_cont = host2_simgrid_parent_container.at(host_name); + unsigned int id = parent_cont->get_id_by_name(host_name); id_list.push_back(id); } - unsigned int nb_ids = id_list.size(); std::sort(id_list.begin(), id_list.end()); - if( nb_ids > 0 ) { - int start = 0; - int pos = start; - for(unsigned int i=0; i 1 ) { - subset_list.emplace_back(id_list[start], id_list[pos], parent); - start = i; - - if( i == nb_ids-1 ) { - subset_list.emplace_back(id_list[i], id_list[i], parent); - } - } else { - if( i == nb_ids-1 ) { - subset_list.emplace_back(id_list[start], id_list[i], parent); - } + size_t nb_ids = id_list.size(); + size_t start = 0; + size_t pos = start; + for (size_t i = 0; i < nb_ids; i++) { + if (id_list[i] - id_list[pos] > 1) { + subset_list.emplace_back(id_list[start], id_list[pos], parent); + start = i; + + if (i == nb_ids - 1) { + subset_list.emplace_back(id_list[i], id_list[i], parent); + } + } else { + if (i == nb_ids - 1) { + subset_list.emplace_back(id_list[start], id_list[i], parent); } - pos = i; } + pos = i; } } @@ -201,12 +192,12 @@ void get_resource_selection_by_hosts(std::vector& subse std::unordered_map> parent2hostgroup; for (auto const& host : host_list) { const char *host_name = sg_host_get_name(host); - jed_container_t parent = host2_simgrid_parent_container.at(host_name); + const simgrid::jedule::Container* parent = host2_simgrid_parent_container.at(host_name); xbt_assert( parent != nullptr ); - auto host_group = parent2hostgroup.find(parent->name.c_str()); + auto host_group = parent2hostgroup.find(parent->get_cname()); if (host_group == parent2hostgroup.end()) - parent2hostgroup.insert({parent->name.c_str(), std::vector(1,host_name)}); + parent2hostgroup.insert({parent->get_cname(), std::vector(1, host_name)}); else host_group->second.push_back(host_name); }