#include "simgrid/s4u/host.hpp"
#include "simgrid/s4u/storage.hpp"
-xbt_dict_t host_list = nullptr; // FIXME: move it to Engine
+std::unordered_map<simgrid::xbt::string, simgrid::s4u::Host*> host_list; // FIXME: move it to Engine
int MSG_HOST_LEVEL = -1;
int USER_HOST_LEVEL = -1;
: 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()
{
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(){
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<simgrid::xbt::string, simgrid::s4u::Host*>
+ 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
*
return simgrid::s4u::Host::by_name_or_null(name);
}
+static int hostcmp_voidp(const void* pa, const void* pb)
+{
+ return strcmp((*static_cast<simgrid::s4u::Host* const*>(pa))->name().c_str(),
+ (*static_cast<simgrid::s4u::Host* const*>(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;
}