X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a79a8e1cab86ccc687cfbc97b01b735acb996f16..5f9b6053027484ea411db0d1ee44ac258c9816f1:/src/s4u/s4u_netzone.cpp diff --git a/src/s4u/s4u_netzone.cpp b/src/s4u/s4u_netzone.cpp index 67e20a2f5b..b17967db20 100644 --- a/src/s4u/s4u_netzone.cpp +++ b/src/s4u/s4u_netzone.cpp @@ -1,80 +1,159 @@ -/* Copyright (c) 2006-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-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 "xbt/log.h" - +#include "simgrid/kernel/routing/NetPoint.hpp" +#include "simgrid/s4u/Engine.hpp" +#include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/NetZone.hpp" -#include "simgrid/s4u/host.hpp" -#include "src/kernel/routing/NetCard.hpp" +#include "simgrid/simix.hpp" #include "src/surf/network_interface.hpp" // Link FIXME: move to proper header -#include "src/surf/surf_routing.hpp" +#include "xbt/log.h" +#include -XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_as, "S4U autonomous systems"); +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_netzone, "S4U Networking Zones"); namespace simgrid { namespace s4u { -simgrid::xbt::signal* link_list)> +simgrid::xbt::signal& link_list)> NetZone::onRouteCreation; +simgrid::xbt::signal NetZone::onCreation; +simgrid::xbt::signal NetZone::onSeal; -NetZone::NetZone(NetZone* father, const char* name) : father_(father), name_(xbt_strdup(name)) +NetZone::NetZone(NetZone* father, std::string name) : father_(father), name_(name) { + children_ = new std::vector(); } + void NetZone::seal() { sealed_ = true; } + NetZone::~NetZone() { - xbt_dict_cursor_t cursor = nullptr; - char* key; - NetZone_t elem; - xbt_dict_foreach (children_, cursor, key, elem) { - delete (NetZone*)elem; - } + for (auto const& nz : *children_) + delete nz; + delete children_; +} - xbt_dict_free(&children_); - xbt_free(name_); +std::unordered_map* NetZone::getProperties() +{ + return simgrid::simix::kernelImmediate([this] { + return &properties_; + }); } -xbt_dict_t NetZone::children() +/** Retrieve the property value (or nullptr if not set) */ +const char* NetZone::getProperty(const char* key) +{ + return properties_.at(key).c_str(); +} +void NetZone::setProperty(const char* key, const char* value) +{ + simgrid::simix::kernelImmediate([this,key,value] { + properties_[key] = value; + }); +} + +/** @brief Returns the list of direct children (no grand-children) + * + * This function returns the internal copy of the children, not a copy. Don't mess with it! + */ +std::vector* NetZone::getChildren() { return children_; } -char* NetZone::name() + +const char* NetZone::getCname() const { - return name_; + return name_.c_str(); } -NetZone* NetZone::father() +NetZone* NetZone::getFather() { return father_; } -xbt_dynar_t NetZone::hosts() +void NetZone::getHosts(std::vector* whereto) { - xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), nullptr); + for (auto const& card : vertices_) { + s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->getName()); + if (host != nullptr) + whereto->push_back(host); + } +} - for (auto card : vertices_) { - s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->name()); +int NetZone::getHostCount() +{ + int count = 0; + for (auto const& card : vertices_) { + s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->getName()); if (host != nullptr) - xbt_dynar_push(res, &host); + count++; } - return res; + return count; } -int NetZone::addComponent(kernel::routing::NetCard* elm) +int NetZone::addComponent(kernel::routing::NetPoint* elm) { vertices_.push_back(elm); return vertices_.size() - 1; // The rank of the newly created object } -void NetZone::addRoute(sg_platf_route_cbarg_t /*route*/) +void NetZone::addRoute(sg_netpoint_t /*src*/, sg_netpoint_t /*dst*/, sg_netpoint_t /*gw_src*/, sg_netpoint_t /*gw_dst*/, + std::vector& /*link_list*/, bool /*symmetrical*/) { - xbt_die("NetZone '%s' does not accept new routes (wrong class).", name_); + xbt_die("NetZone '%s' does not accept new routes (wrong class).", name_.c_str()); } + +} // namespace s4u +} // namespace simgrid + +/* **************************** Public C interface *************************** */ +SG_BEGIN_DECL() +sg_netzone_t sg_zone_get_root() +{ + return simgrid::s4u::Engine::getInstance()->getNetRoot(); } -}; // namespace simgrid::s4u + +const char* sg_zone_get_name(sg_netzone_t netzone) +{ + return netzone->getCname(); +} + +sg_netzone_t sg_zone_get_by_name(const char* name) +{ + return simgrid::s4u::Engine::getInstance()->getNetzoneByNameOrNull(name); +} + +void sg_zone_get_sons(sg_netzone_t netzone, xbt_dict_t whereto) +{ + for (auto const& elem : *netzone->getChildren()) { + xbt_dict_set(whereto, elem->getCname(), static_cast(elem), nullptr); + } +} + +const char* sg_zone_get_property_value(sg_netzone_t netzone, const char* name) +{ + return netzone->getProperty(name); +} + +void sg_zone_set_property_value(sg_netzone_t netzone, const char* name, char* value) +{ + netzone->setProperty(name, value); +} + +void sg_zone_get_hosts(sg_netzone_t netzone, xbt_dynar_t whereto) +{ + /* converts vector to dynar */ + std::vector hosts; + netzone->getHosts(&hosts); + for (auto const& host : hosts) + xbt_dynar_push(whereto, &host); +} + +SG_END_DECL()