X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/04c6c7d463281bc4abe2788699ed1bcc6368e83e..4bff2cd38194b0f95d7a0d19867f7e4e19e8a328:/src/instr/instr_paje_containers.cpp diff --git a/src/instr/instr_paje_containers.cpp b/src/instr/instr_paje_containers.cpp index 9208684f97..32966ff879 100644 --- a/src/instr/instr_paje_containers.cpp +++ b/src/instr/instr_paje_containers.cpp @@ -10,10 +10,13 @@ #include "src/instr/instr_private.h" +#include + XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_paje_containers, instr, "Paje tracing event system (containers)"); static container_t rootContainer = nullptr; /* the root container */ -static xbt_dict_t allContainers = nullptr; /* all created containers indexed by name */ +static std::unordered_map + allContainers; /* all created containers indexed by name */ std::set trivaNodeTypes; /* all host types defined */ std::set trivaEdgeTypes; /* all link types defined */ @@ -23,43 +26,31 @@ long long int instr_new_paje_id () return type_id++; } -void PJ_container_alloc () -{ - allContainers = xbt_dict_new_homogeneous(nullptr); -} - -void PJ_container_release () -{ - xbt_dict_free (&allContainers); -} - void PJ_container_set_root (container_t root) { rootContainer = root; } -simgrid::instr::Container::Container(const char* name, simgrid::instr::e_container_types kind, Container* father) - : name_(xbt_strdup(name)), father_(father) +simgrid::instr::Container::Container(std::string name, simgrid::instr::e_container_types kind, Container* father) + : name_(name), kind_(kind), father_(father) { - xbt_assert(name != nullptr, "Container name cannot be nullptr"); - static long long int container_id = 0; - id_ = bprintf("%lld", container_id); // id (or alias) of the container + id_ = std::to_string(container_id); // id (or alias) of the container container_id++; //Search for network_element_t switch (kind){ case simgrid::instr::INSTR_HOST: - this->netpoint_ = sg_host_by_name(name)->pimpl_netpoint; - xbt_assert(this->netpoint_, "Element '%s' not found", name); + this->netpoint_ = sg_host_by_name(name.c_str())->pimpl_netpoint; + xbt_assert(this->netpoint_, "Element '%s' not found", name.c_str()); break; case simgrid::instr::INSTR_ROUTER: this->netpoint_ = simgrid::s4u::Engine::getInstance()->getNetpointByNameOrNull(name); - xbt_assert(this->netpoint_, "Element '%s' not found", name); + xbt_assert(this->netpoint_, "Element '%s' not found", name.c_str()); break; case simgrid::instr::INSTR_AS: this->netpoint_ = simgrid::s4u::Engine::getInstance()->getNetpointByNameOrNull(name); - xbt_assert(this->netpoint_, "Element '%s' not found", name); + xbt_assert(this->netpoint_, "Element '%s' not found", name.c_str()); break; default: this->netpoint_ = nullptr; @@ -68,24 +59,23 @@ simgrid::instr::Container::Container(const char* name, simgrid::instr::e_contain if (father_) { this->level_ = father_->level_ + 1; - XBT_DEBUG("new container %s, child of %s", name, father->name_); + XBT_DEBUG("new container %s, child of %s", name.c_str(), father->name_.c_str()); } // type definition (method depends on kind of this new container) - this->kind_ = kind; if (this->kind_ == simgrid::instr::INSTR_AS) { //if this container is of an AS, its type name depends on its level char as_typename[INSTR_DEFAULT_STR_SIZE]; snprintf(as_typename, INSTR_DEFAULT_STR_SIZE, "L%d", this->level_); if (this->father_) { - this->type_ = simgrid::instr::Type::getOrNull(as_typename, this->father_->type_); + this->type_ = this->father_->type_->getChildOrNull(as_typename); if (this->type_ == nullptr) { this->type_ = simgrid::instr::Type::containerNew(as_typename, this->father_->type_); } }else{ this->type_ = simgrid::instr::Type::containerNew("0", nullptr); } - }else{ + } else { //otherwise, the name is its kind char typeNameBuff[INSTR_DEFAULT_STR_SIZE]; switch (this->kind_) { @@ -114,26 +104,24 @@ simgrid::instr::Container::Container(const char* name, simgrid::instr::e_contain THROWF (tracing_error, 0, "new container kind is unknown."); break; } - simgrid::instr::Type* type = simgrid::instr::Type::getOrNull(typeNameBuff, this->father_->type_); + simgrid::instr::Type* type = this->father_->type_->getChildOrNull(typeNameBuff); if (type == nullptr){ this->type_ = simgrid::instr::Type::containerNew(typeNameBuff, this->father_->type_); }else{ this->type_ = type; } } - this->children_ = xbt_dict_new_homogeneous(nullptr); if (this->father_) { - xbt_dict_set(this->father_->children_, this->name_, this, nullptr); + this->father_->children_.insert({this->name_, this}); LogContainerCreation(this); } //register all kinds by name - if (xbt_dict_get_or_null(allContainers, this->name_) != nullptr) { - THROWF(tracing_error, 1, "container %s already present in allContainers data structure", this->name_); + if (not allContainers.emplace(this->name_, this).second) { + THROWF(tracing_error, 1, "container %s already present in allContainers data structure", this->name_.c_str()); } - xbt_dict_set(allContainers, this->name_, this, nullptr); - XBT_DEBUG("Add container name '%s'", this->name_); + XBT_DEBUG("Add container name '%s'", this->name_.c_str()); //register NODE types for triva configuration if (this->kind_ == simgrid::instr::INSTR_HOST || this->kind_ == simgrid::instr::INSTR_LINK || @@ -143,7 +131,7 @@ simgrid::instr::Container::Container(const char* name, simgrid::instr::e_contain } simgrid::instr::Container::~Container() { - XBT_DEBUG("destroy container %s", name_); + XBT_DEBUG("destroy container %s", name_.c_str()); // obligation to dump previous events because they might // reference the container that is about to be destroyed @@ -152,21 +140,17 @@ simgrid::instr::Container::~Container() // trace my destruction if (not TRACE_disable_destroy() && this != PJ_container_get_root()) { - // do not trace the container destruction if user requests - // or if the container is root + // do not trace the container destruction if user requests or if the container is root LogContainerDestruction(this); } // remove it from allContainers data structure - xbt_dict_remove(allContainers, name_); + allContainers.erase(name_); // free - xbt_free(name_); - xbt_free(id_); - xbt_dict_free(&children_); } -container_t PJ_container_get (const char *name) +simgrid::instr::Container* PJ_container_get(const char* name) { container_t ret = PJ_container_get_or_null (name); if (ret == nullptr){ @@ -175,12 +159,13 @@ container_t PJ_container_get (const char *name) return ret; } -container_t PJ_container_get_or_null (const char *name) +simgrid::instr::Container* PJ_container_get_or_null(const char* name) { - return static_cast(name != nullptr ? xbt_dict_get_or_null(allContainers, name) : nullptr); + auto cont = allContainers.find(name); + return cont == allContainers.end() ? nullptr : cont->second; } -container_t PJ_container_get_root () +simgrid::instr::Container* PJ_container_get_root() { return rootContainer; } @@ -193,8 +178,8 @@ void PJ_container_remove_from_parent (container_t child) container_t parent = child->father_; if (parent){ - XBT_DEBUG("removeChildContainer (%s) FromContainer (%s) ", child->name_, parent->name_); - xbt_dict_remove(parent->children_, child->name_); + XBT_DEBUG("removeChildContainer (%s) FromContainer (%s) ", child->name_.c_str(), parent->name_.c_str()); + parent->children_.erase(child->name_); } } @@ -203,12 +188,9 @@ static void recursiveDestroyContainer (container_t container) if (container == nullptr){ THROWF (tracing_error, 0, "trying to recursively destroy a nullptr container"); } - XBT_DEBUG("recursiveDestroyContainer %s", container->name_); - xbt_dict_cursor_t cursor = nullptr; - container_t child; - char *child_name; - xbt_dict_foreach (container->children_, cursor, child_name, child) { - recursiveDestroyContainer (child); + XBT_DEBUG("recursiveDestroyContainer %s", container->name_.c_str()); + for (auto child : container->children_) { + recursiveDestroyContainer(child.second); } delete container; } @@ -223,7 +205,7 @@ void PJ_container_free_all () rootContainer = nullptr; //checks - if (not xbt_dict_is_empty(allContainers)) { + if (not allContainers.empty()) { THROWF(tracing_error, 0, "some containers still present even after destroying all of them"); } }