Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use a std::vector for actors_at_boot_.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 11 Sep 2018 20:27:20 +0000 (22:27 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 11 Sep 2018 20:27:20 +0000 (22:27 +0200)
Several actors may use the same name (e.g. app-masterworker-multicore).
Also fixes a memory leak.

src/s4u/s4u_Actor.cpp
src/surf/HostImpl.cpp
src/surf/HostImpl.hpp
src/surf/sg_platf.cpp

index 18c9bba..2d162da 100644 (file)
@@ -78,12 +78,9 @@ void Actor::set_auto_restart(bool autorestart)
   simgrid::simix::simcall([this, autorestart]() {
     pimpl_->set_auto_restart(autorestart);
 
-    std::map<std::string, kernel::actor::ProcessArg*>* actors_map = &pimpl_->host_->pimpl_->actors_at_boot_;
-    if (actors_map->find(pimpl_->name_) == actors_map->end()) {
-      simgrid::kernel::actor::ProcessArg* arg = new simgrid::kernel::actor::ProcessArg(pimpl_->host_, pimpl_);
-      XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
-      actors_map->insert({arg->name, arg});
-    }
+    simgrid::kernel::actor::ProcessArg* arg = new simgrid::kernel::actor::ProcessArg(pimpl_->host_, pimpl_);
+    XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
+    pimpl_->host_->pimpl_->actors_at_boot_.emplace_back(arg);
   });
 }
 
index 401ee6d..f718d80 100644 (file)
@@ -115,7 +115,7 @@ HostImpl::~HostImpl()
     THROWF(arg_error, 0, "%s", msg.c_str());
   }
   for (auto const& arg : actors_at_boot_)
-    delete arg.second;
+    delete arg;
   actors_at_boot_.clear();
 }
 
@@ -125,8 +125,7 @@ HostImpl::~HostImpl()
  */
 void HostImpl::turn_on()
 {
-  for (auto const& elm : actors_at_boot_) {
-    kernel::actor::ProcessArg* arg = elm.second;
+  for (auto const& arg : actors_at_boot_) {
     XBT_DEBUG("Booting Actor %s(%s) right now", arg->name.c_str(), arg->host->get_cname());
     smx_actor_t actor = simix_global->create_process_function(arg->name.c_str(), arg->code, nullptr, arg->host,
                                                               arg->properties.get(), nullptr);
@@ -151,14 +150,13 @@ void HostImpl::turn_off()
   }
   // When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
   // Then get rid of the others.
-  auto elm = actors_at_boot_.begin();
-  while (elm != actors_at_boot_.end()) {
-    if (not elm->second->auto_restart) {
-      delete elm->second;
-      actors_at_boot_.erase(elm);
-    } else
-      ++elm;
-  }
+  auto elm = remove_if(begin(actors_at_boot_), end(actors_at_boot_), [](kernel::actor::ProcessArg* arg) {
+    if (arg->auto_restart)
+      return false;
+    delete arg;
+    return true;
+  });
+  actors_at_boot_.erase(elm, end(actors_at_boot_));
 }
 
 std::vector<s4u::ActorPtr> HostImpl::get_all_actors()
index cca54d6..95b583a 100644 (file)
@@ -66,7 +66,7 @@ public:
 
   // FIXME: make these private
   ActorList process_list_;
-  std::map<std::string, kernel::actor::ProcessArg*> actors_at_boot_;
+  std::vector<kernel::actor::ProcessArg*> actors_at_boot_;
 };
 }
 }
index 55de705..e3e5253 100644 (file)
@@ -444,7 +444,7 @@ void sg_platf_new_actor(simgrid::kernel::routing::ActorCreationArgs* actor)
   simgrid::kernel::actor::ProcessArg* arg =
       new simgrid::kernel::actor::ProcessArg(actor_name, code, nullptr, host, kill_time, properties, auto_restart);
 
-  host->pimpl_->actors_at_boot_.insert({actor_name, arg});
+  host->pimpl_->actors_at_boot_.emplace_back(arg);
 
   if (start_time > SIMIX_get_clock()) {