X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3ebb95127bac9bc6d8ba66319f1db561e9a5c6c1..a784ea0b57101613a92e9fe1403d224e7ea4d501:/src/instr/jedule/jedule_platform.cpp diff --git a/src/instr/jedule/jedule_platform.cpp b/src/instr/jedule/jedule_platform.cpp index c644294cb2..5109fd7dc5 100644 --- a/src/instr/jedule/jedule_platform.cpp +++ b/src/instr/jedule/jedule_platform.cpp @@ -1,48 +1,46 @@ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. 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 "simgrid/jedule/jedule.hpp" -#include "simgrid/jedule/jedule_platform.hpp" -#include "simgrid/s4u/As.hpp" -#include "simgrid/host.h" - +#include "simgrid/s4u/NetZone.hpp" #include "xbt/asserts.h" -#include "xbt/dynar.h" -#include "xbt/str.h" -#include - -#include -#include +#include -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid { namespace jedule { +Subset::Subset(int start_idx, int end_idx, Container* parent) +: start_idx(start_idx), parent(parent) +{ + nres=end_idx-start_idx+1; +} + -Container::Container(std::string name) -: name(name) { +Container::Container(std::string name): name(name) +{ container_name2container.insert({this->name, this}); } -Container::~Container(){ - if(!this->children.empty()) { - for (auto child: this->children){ +Container::~Container() +{ + if (not this->children.empty()) + for (auto child: this->children) delete child; - } - } } -void Container::addChild(jed_container_t child){ +void Container::addChild(jed_container_t child) +{ xbt_assert(this != nullptr); xbt_assert(child != nullptr); this->children.push_back(child); child->parent = this; } -void Container::addResources(std::vector hosts){ +void Container::addResources(std::vector hosts) +{ this->is_lowest = 1; this->children.clear(); this->last_id = 0; @@ -58,41 +56,31 @@ void Container::addResources(std::vector hosts){ } } -void Container::createHierarchy(AS_t from_as){ - xbt_dict_cursor_t cursor = nullptr; - char *key; - AS_t elem; - xbt_dict_t routing_sons = from_as->children(); +void Container::createHierarchy(sg_netzone_t from_as) +{ - if (xbt_dict_is_empty(routing_sons)) { + if (from_as->getChildren()->empty()) { // I am no AS // add hosts to jedule platform - xbt_dynar_t table = from_as->hosts(); - unsigned int dynar_cursor; - sg_host_t host; - - std::vector hosts; - - xbt_dynar_foreach(table, dynar_cursor, host) { - hosts.push_back(host); - } - this->addResources(hosts); - xbt_dynar_free(&table); + std::vector table; + from_as->getHosts(&table); + this->addResources(table); } else { - xbt_dict_foreach(routing_sons, cursor, key, elem) { - jed_container_t child_container = new simgrid::jedule::Container(std::string(elem->name())); + for (auto nz : *from_as->getChildren()) { + jed_container_t child_container = new simgrid::jedule::Container(std::string(nz->getCname())); this->addChild(child_container); - child_container->createHierarchy(elem); + child_container->createHierarchy(nz); } } } -std::vector Container::getHierarchy() { +std::vector Container::getHierarchy() +{ xbt_assert( this!= nullptr ); if(this->parent != nullptr ) { - if(!this->parent->children.empty()) { + if (not this->parent->children.empty()) { // we are in the last level return this->parent->getHierarchy(); } else { @@ -119,7 +107,8 @@ std::vector Container::getHierarchy() { } } -std::string Container::getHierarchyAsString(){ +std::string Container::getHierarchyAsString() +{ std::string output(""); std::vector heir_list = this->getHierarchy(); @@ -136,9 +125,10 @@ std::string Container::getHierarchyAsString(){ return output; } -void Container::printResources(FILE * jed_file){ +void Container::printResources(FILE * jed_file) +{ unsigned int i=0; - xbt_assert(!this->resource_list.empty()); + xbt_assert(not this->resource_list.empty()); unsigned int res_nb = this->resource_list.size(); std::string resid = this->getHierarchyAsString(); @@ -155,10 +145,11 @@ void Container::printResources(FILE * jed_file){ fprintf(jed_file, "\" />\n"); } -void Container::print(FILE* jed_file) { +void Container::print(FILE* jed_file) +{ xbt_assert( this != nullptr ); fprintf(jed_file, " \n", this->name.c_str()); - if( !this->children.empty()){ + if (not this->children.empty()) { for (auto child: this->children) { child->print(jed_file); } @@ -171,106 +162,71 @@ void Container::print(FILE* jed_file) { } } -static int compare_ids(const void *num1, const void *num2) { - return *((int*) num1) - *((int*) num2); -} - -static void add_subset_to(xbt_dynar_t subset_list, int start, int end, jed_container_t parent) { - jed_res_subset_t subset; - - xbt_assert( subset_list != nullptr ); - xbt_assert( parent != nullptr ); - - subset = xbt_new0(s_jed_res_subset_t,1); - subset->start_idx = start; - subset->nres = end-start+1; - subset->parent = parent; - - xbt_dynar_push(subset_list, &subset); -} - -static void add_subsets_to(xbt_dynar_t subset_list, xbt_dynar_t hostgroup, jed_container_t parent) { - unsigned int iter; - char *host_name; - int id; - +static void add_subsets_to(std::vector *subset_list, std::vector hostgroup, jed_container_t parent) +{ // get ids for each host // sort ids // compact ids // create subset for each id group - xbt_assert( subset_list != nullptr ); - xbt_assert( hostgroup != nullptr ); xbt_assert( parent != nullptr ); - xbt_dynar_t id_list = xbt_dynar_new(sizeof(int), nullptr); + std::vector id_list; - xbt_dynar_foreach(hostgroup, iter, host_name) { - jed_container_t parent; + for (auto host_name : hostgroup) { xbt_assert( host_name != nullptr ); - parent = (jed_container_t)host2_simgrid_parent_container.at(host_name); - id = parent->name2id.at(host_name); - xbt_dynar_push(id_list, &id); + jed_container_t parent = host2_simgrid_parent_container.at(host_name); + unsigned int id = parent->name2id.at(host_name); + id_list.push_back(id); } - int nb_ids = xbt_dynar_length(id_list); - xbt_dynar_sort(id_list, &compare_ids); - - int *id_ar = static_cast(xbt_dynar_to_array(id_list)); + 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(int i=0; i 1 ) { - add_subset_to( subset_list, id_ar[start], id_ar[pos], parent ); + for(unsigned int i=0; i 1 ) { + subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[pos], parent)); start = i; if( i == nb_ids-1 ) { - add_subset_to( subset_list, id_ar[i], id_ar[i], parent ); + subset_list->push_back(new simgrid::jedule::Subset(id_list[i], id_list[i], parent)); } } else { if( i == nb_ids-1 ) { - add_subset_to( subset_list, id_ar[start], id_ar[i], parent ); + subset_list->push_back(new simgrid::jedule::Subset(id_list[start], id_list[i], parent)); } } pos = i; } } - xbt_free(id_ar); } -void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, std::vector *host_list) { - std::unordered_map parent2hostgroup; // group hosts by parent - +void get_resource_selection_by_hosts(std::vector *subset_list, 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 host: *host_list) { const char *host_name = sg_host_get_name(host); - jed_container_t parent = (jed_container_t)host2_simgrid_parent_container.at(host_name); + jed_container_t parent = host2_simgrid_parent_container.at(host_name); xbt_assert( parent != nullptr ); auto host_group = parent2hostgroup.find(parent->name.c_str()); - if (host_group == parent2hostgroup.end()){ - xbt_dynar_t group = xbt_dynar_new(sizeof(char*), nullptr); - xbt_dynar_push(group, &host_name); - parent2hostgroup.insert({parent->name.c_str(), group}); - } else { - xbt_dynar_push(host_group->second, &host_name); - } + if (host_group == parent2hostgroup.end()) + parent2hostgroup.insert({parent->name.c_str(), std::vector(1,host_name)}); + else + host_group->second.push_back(host_name); } for (auto elm: parent2hostgroup) { - jed_container_t parent = (jed_container_t)container_name2container.at(elm.first); + jed_container_t parent = container_name2container.at(elm.first); add_subsets_to(subset_list, elm.second, parent); - xbt_dynar_free_container(&elm.second); } } - #endif