#include "src/kernel/activity/ExecImpl.hpp"
#include "src/simix/smx_host_private.hpp"
#include "src/simix/smx_private.hpp"
+#include "src/surf/HostImpl.hpp"
#include <sstream>
{
simgrid::simix::simcall([this, autorestart]() {
pimpl_->set_auto_restart(autorestart);
- SIMIX_host_add_auto_restart_process(pimpl_->host_, pimpl_);
+
+ 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});
+ }
});
}
self->finished_ = true;
/* execute the on_exit functions */
SIMIX_process_on_exit_runall(self);
- /* Add the process to the list of process to restart, only if the host is down */
- if (self->auto_restart_ && self->host_->is_off()) {
- SIMIX_host_add_auto_restart_process(self->host_, self);
+
+ if (self->auto_restart_ && self->host_->is_off() &&
+ watched_hosts.find(self->host_->get_cname()) == watched_hosts.end()) {
+ XBT_DEBUG("Push host %s to watched_hosts because it's off and %s needs to restart", self->host_->get_cname(),
+ self->get_cname());
+ watched_hosts.insert(self->host_->get_cname());
}
+
XBT_DEBUG("Process %s@%s is dead", self->get_cname(), self->host_->get_cname());
self->context_->stop();
}
return host->get_cname();
}
-/**
- * @brief Add a process to the list of the processes that the host will restart when it comes back
- * This function add a process to the list of the processes that will be restarted when the host comes
- * back. It is expected that this function is called when the host is down.
- * The processes will only be restarted once, meaning that you will have to register the process
- * again to restart the process again.
- */
-void SIMIX_host_add_auto_restart_process(sg_host_t host, simgrid::kernel::actor::ActorImpl* actor)
-{
- simgrid::kernel::actor::ProcessArg* arg = new simgrid::kernel::actor::ProcessArg(host, actor);
-
- if (host->is_off() && watched_hosts.find(host->get_cname()) == watched_hosts.end()) {
- watched_hosts.insert(host->get_cname());
- XBT_DEBUG("Push host %s to watched_hosts because state == SURF_RESOURCE_OFF", host->get_cname());
- }
- if (host->pimpl_->actors_at_boot_.find(actor->get_name()) == host->pimpl_->actors_at_boot_.end()) {
- XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
- host->pimpl_->actors_at_boot_.insert({arg->name, arg});
- }
-}
-
simgrid::kernel::activity::ExecImplPtr SIMIX_execution_start(std::string name, std::string category,
double flops_amount, double priority, double bound,
sg_host_t host)
#include <boost/intrusive/list.hpp>
-XBT_PRIVATE void SIMIX_host_add_auto_restart_process(sg_host_t host, simgrid::kernel::actor::ActorImpl* actor);
-
XBT_PRIVATE void SIMIX_execution_finish(smx_activity_t synchro);
XBT_PRIVATE void SIMIX_set_category(smx_activity_t synchro, std::string category);