X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/895710d49f77179d9893bc76b3e31b69fae638af..e9994d33a883aa73468e38d54cf377f52b3fd950:/src/instr/jedule/jedule_platform.cpp diff --git a/src/instr/jedule/jedule_platform.cpp b/src/instr/jedule/jedule_platform.cpp index 2b80a60011..53e657a3bc 100644 --- a/src/instr/jedule/jedule_platform.cpp +++ b/src/instr/jedule/jedule_platform.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2018. 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. */ @@ -19,38 +19,26 @@ std::unordered_map container_name2container; namespace simgrid { namespace jedule { Subset::Subset(int start_idx, int end_idx, Container* parent) -: start_idx(start_idx), parent(parent) + : start_idx(start_idx), nres(end_idx - start_idx + 1), parent(parent) { - nres=end_idx-start_idx+1; } - -Container::Container(std::string name): name(name) +Container::Container(const std::string& name) : name(name) { container_name2container.insert({this->name, this}); } -Container::~Container() -{ - if (not this->children.empty()) - for (auto const& child : this->children) - delete child; -} - void Container::add_child(jed_container_t child) { xbt_assert(child != nullptr); - this->children.push_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; - - //FIXME do we need to sort?: xbt_dynar_sort_strings(host_names); + children_.clear(); + last_id_ = 0; for (auto const& host : hosts) { const char *host_name = sg_host_get_name(host); @@ -61,44 +49,48 @@ 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()) { + if (from_as->get_children().empty()) { // I am no AS // add hosts to jedule platform std::vector table = from_as->get_all_hosts(); this->add_resources(table); } else { - for (auto const& nz : *from_as->get_children()) { - jed_container_t child_container = new simgrid::jedule::Container(std::string(nz->get_cname())); + for (auto const& nz : from_as->get_children()) { + jed_container_t 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(Container* child) { - if(this->parent != nullptr ) { + unsigned int i = 0; + int child_nb = -1; - if (not this->parent->children.empty()) { + for (auto const& c : children_) { + if (c.get() == child) { + child_nb = i; + break; + } + i++; + } + return child_nb; +} + +std::vector Container::get_hierarchy() +{ + if (parent_ != nullptr) { + if (not parent_->has_children()) { // we are in the last level - return this->parent->get_hierarchy(); + return parent_->get_hierarchy(); } else { - unsigned int i =0; - int child_nb = -1; - - for (auto const& child : this->parent->children) { - if( child == this) { - child_nb = i; - break; - } - i++; - } + int child_nb = parent_->get_child_position(this); xbt_assert( child_nb > - 1); - std::vector heir_list = this->parent->get_hierarchy(); + std::vector heir_list = parent_->get_hierarchy(); heir_list.insert(heir_list.begin(), child_nb); return heir_list; } @@ -150,8 +142,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 { @@ -160,10 +152,11 @@ void Container::print(FILE* jed_file) fprintf(jed_file, " \n"); } -} -} +} // namespace jedule +} // namespace simgrid -static void add_subsets_to(std::vector *subset_list, std::vector hostgroup, jed_container_t parent) +static void add_subsets_to(std::vector& subset_list, std::vector hostgroup, + jed_container_t parent) { // get ids for each host // sort ids @@ -176,8 +169,8 @@ static void add_subsets_to(std::vector *subset_list, std::vectorname2id.at(host_name); + jed_container_t 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(); @@ -188,38 +181,37 @@ static void add_subsets_to(std::vector *subset_list, std::vector 1 ) { - subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[pos], parent)); + subset_list.emplace_back(id_list[start], id_list[pos], parent); start = i; if( i == nb_ids-1 ) { - subset_list->push_back(new simgrid::jedule::Subset(id_list[i], id_list[i], parent)); + subset_list.emplace_back(id_list[i], id_list[i], parent); } } else { if( i == nb_ids-1 ) { - subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[i], parent)); + subset_list.emplace_back(id_list[start], id_list[i], parent); } } pos = i; } } - } -void get_resource_selection_by_hosts(std::vector *subset_list, std::vector *host_list) +void get_resource_selection_by_hosts(std::vector& subset_list, + const std::vector& host_list) { - xbt_assert( host_list != nullptr ); // for each host name // find parent container // group by parent container std::unordered_map> parent2hostgroup; - for (auto const& host : *host_list) { + 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); }