From: Martin Quinson Date: Tue, 25 Oct 2016 17:26:43 +0000 (+0200) Subject: host_list is now a std::map instead of xbt_dict X-Git-Tag: v3_14~287 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/827f345d26da926941909a521752839e21e9a44e host_list is now a std::map instead of xbt_dict --- diff --git a/src/s4u/s4u_host.cpp b/src/s4u/s4u_host.cpp index b2c1fb9638..ed367e8d8f 100644 --- a/src/s4u/s4u_host.cpp +++ b/src/s4u/s4u_host.cpp @@ -20,7 +20,7 @@ #include "simgrid/s4u/host.hpp" #include "simgrid/s4u/storage.hpp" -xbt_dict_t host_list = nullptr; // FIXME: move it to Engine +std::unordered_map host_list; // FIXME: move it to Engine int MSG_HOST_LEVEL = -1; int USER_HOST_LEVEL = -1; @@ -41,7 +41,7 @@ Host::Host(const char* name) : name_(name) { xbt_assert(sg_host_by_name(name) == nullptr, "Refusing to create a second host named '%s'.", name); - xbt_dict_set(host_list, name, this, nullptr); + host_list[name_] = this; } Host::~Host() @@ -66,25 +66,23 @@ void Host::destroy() { if (!currentlyDestroying_) { currentlyDestroying_ = true; - xbt_dict_remove(host_list, name().c_str()); onDestruction(*this); + host_list.erase(name_); delete this; } } Host* Host::by_name(std::string name) { - Host* host = Host::by_name_or_null(name.c_str()); - // TODO, raise an exception instead? - if (host == nullptr) - xbt_die("No such host: '%s'", name.c_str()); - return host; + return host_list.at(name); // Will raise a std::out_of_range if the host does not exist } Host* Host::by_name_or_null(const char* name) { - if (host_list == nullptr) - host_list = xbt_dict_new_homogeneous(nullptr); - return (Host*) xbt_dict_get_or_null(host_list, name); + try { + return host_list.at(name); + } catch (std::out_of_range& e) { + return nullptr; + } } Host *Host::current(){ diff --git a/src/simgrid/host.cpp b/src/simgrid/host.cpp index 963302e1e2..bcd1e7683e 100644 --- a/src/simgrid/host.cpp +++ b/src/simgrid/host.cpp @@ -14,20 +14,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sg_host, sd, "Logging specific to sg_hosts"); -extern xbt_dict_t host_list; // FIXME:killme don't dupplicate the content of s4u::Host this way +extern std::unordered_map + host_list; // FIXME: don't dupplicate the content of s4u::Host this way void sg_host_exit() { - xbt_dict_cursor_t cursor = nullptr; - const char* name = nullptr; - simgrid::s4u::Host* host = nullptr; - xbt_dict_foreach(host_list, cursor, name, host) host->destroy(); - xbt_dict_free(&host_list); + host_list.clear(); } size_t sg_host_count() { - return xbt_dict_length(host_list); + return host_list.size(); } /** @brief Returns the host list * @@ -64,16 +61,22 @@ sg_host_t sg_host_by_name(const char *name) return simgrid::s4u::Host::by_name_or_null(name); } +static int hostcmp_voidp(const void* pa, const void* pb) +{ + return strcmp((*static_cast(pa))->name().c_str(), + (*static_cast(pb))->name().c_str()); +} + xbt_dynar_t sg_hosts_as_dynar() { xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t),nullptr); - xbt_dict_cursor_t cursor = nullptr; - const char* name = nullptr; - simgrid::s4u::Host* host = nullptr; - xbt_dict_foreach(host_list, cursor, name, host) + for (auto kv : host_list) { + simgrid::s4u::Host* host = kv.second; if (host && host->pimpl_netcard && host->pimpl_netcard->isHost()) xbt_dynar_push(res, &host); + } + xbt_dynar_sort(res, hostcmp_voidp); return res; }