Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
host_list is now a std::map instead of xbt_dict
authorMartin Quinson <martin.quinson@loria.fr>
Tue, 25 Oct 2016 17:26:43 +0000 (19:26 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Tue, 25 Oct 2016 17:26:43 +0000 (19:26 +0200)
src/s4u/s4u_host.cpp
src/simgrid/host.cpp

index b2c1fb9..ed367e8 100644 (file)
@@ -20,7 +20,7 @@
 #include "simgrid/s4u/host.hpp"
 #include "simgrid/s4u/storage.hpp"
 
 #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;
 
 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);
   : 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()
 }
 
 Host::~Host()
@@ -66,25 +66,23 @@ void Host::destroy()
 {
   if (!currentlyDestroying_) {
     currentlyDestroying_ = true;
 {
   if (!currentlyDestroying_) {
     currentlyDestroying_ = true;
-    xbt_dict_remove(host_list, name().c_str());
     onDestruction(*this);
     onDestruction(*this);
+    host_list.erase(name_);
     delete this;
   }
 }
 
 Host* Host::by_name(std::string 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)
 {
 }
 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(){
 }
 
 Host *Host::current(){
index 963302e..bcd1e76 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sg_host, sd, "Logging specific to sg_hosts");
 
 
 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()
 {
 
 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()
 {
 }
 
 size_t sg_host_count()
 {
-  return xbt_dict_length(host_list);
+  return host_list.size();
 }
 /** @brief Returns the host list
  *
 }
 /** @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);
 }
 
   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_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);
     if (host && host->pimpl_netcard && host->pimpl_netcard->isHost())
        xbt_dynar_push(res, &host);
+  }
+  xbt_dynar_sort(res, hostcmp_voidp);
   return res;
 }
 
   return res;
 }