X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4ebc53f4ea63c0ec84680e5484ad9c9a81c85ff3..453bf51afcdaf0fbb9d3ae7344836f07643e462b:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 943889d085..dfb2f05ab3 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -5,6 +5,8 @@ #include "mc/mc.h" #include "smx_private.hpp" +#include "src/kernel/activity/CommImpl.hpp" +#include "src/kernel/activity/ExecImpl.hpp" #include "src/kernel/activity/IoImpl.hpp" #include "src/kernel/activity/SleepImpl.hpp" #include "src/kernel/activity/SynchroRaw.hpp" @@ -13,6 +15,7 @@ #include "src/simix/smx_host_private.hpp" #include "src/simix/smx_io_private.hpp" #include "src/simix/smx_synchro_private.hpp" +#include "src/surf/HostImpl.hpp" #include "src/surf/cpu_interface.hpp" #include "xbt/ex.hpp" @@ -101,7 +104,7 @@ void SIMIX_process_cleanup(smx_actor_t process) XBT_DEBUG("%p should not be run anymore",process); simix_global->process_list.erase(process->pid_); if (process->host_ && process->host_process_list_hook.is_linked()) - simgrid::xbt::intrusive_erase(process->host_->extension()->process_list, *process); + simgrid::xbt::intrusive_erase(process->host_->pimpl_->process_list_, *process); if (not process->smx_destroy_list_hook.is_linked()) { #if SIMGRID_HAVE_MC xbt_dynar_push_as(simix_global->dead_actors_vector, smx_actor_t, process); @@ -168,15 +171,7 @@ simgrid::s4u::Actor* ActorImpl::restart() XBT_DEBUG("Restarting process %s on %s", get_cname(), host_->get_cname()); // retrieve the arguments of the old process - // FIXME: Factorize this with SIMIX_host_add_auto_restart_process ? - simgrid::kernel::actor::ProcessArg arg; - arg.name = name_; - arg.code = code; - arg.host = host_; - arg.kill_time = SIMIX_timer_get_date(kill_timer); - arg.data = userdata_; - arg.properties = nullptr; - arg.auto_restart = auto_restart_; + simgrid::kernel::actor::ProcessArg arg = ProcessArg(host_, this); // kill the old process SIMIX_process_kill(this, (this == simix_global->maestro_process) ? this : SIMIX_process_self()); @@ -184,10 +179,8 @@ simgrid::s4u::Actor* ActorImpl::restart() // start the new process ActorImpl* actor = simix_global->create_process_function(arg.name.c_str(), std::move(arg.code), arg.data, arg.host, arg.properties.get(), nullptr); - if (arg.kill_time >= 0) - simcall_process_set_kill_time(actor, arg.kill_time); - if (arg.auto_restart) - actor->auto_restart_ = arg.auto_restart; + simcall_process_set_kill_time(actor, arg.kill_time); + actor->set_auto_restart(arg.auto_restart); return actor->ciface(); } @@ -287,14 +280,14 @@ void SIMIX_maestro_create(void (*code)(void*), void* data) * * \return the process created */ -smx_actor_t SIMIX_process_create(const char* name, simgrid::simix::ActorCode code, void* data, simgrid::s4u::Host* host, +smx_actor_t SIMIX_process_create(std::string name, simgrid::simix::ActorCode code, void* data, simgrid::s4u::Host* host, std::unordered_map* properties, smx_actor_t parent_process) { - XBT_DEBUG("Start process %s on host '%s'", name, host->get_cname()); + XBT_DEBUG("Start process %s on host '%s'", name.c_str(), host->get_cname()); if (host->is_off()) { - XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, host->get_cname()); + XBT_WARN("Cannot launch process '%s' on failed host '%s'", name.c_str(), host->get_cname()); return nullptr; } @@ -322,12 +315,8 @@ smx_actor_t SIMIX_process_create(const char* name, simgrid::simix::ActorCode cod for (auto const& kv : *properties) process->set_property(kv.first, kv.second); - /* Make sure that the process is initialized for simix, in case we are called from the Host::onCreation signal */ - if (host->extension() == nullptr) - host->extension_set(new simgrid::simix::Host()); - /* Add the process to its host's process list */ - host->extension()->process_list.push_back(*process); + host->pimpl_->process_list_.push_back(*process); XBT_DEBUG("Start context '%s'", process->get_cname()); @@ -384,7 +373,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn process->set_property(kv.first, kv.second); /* Add the process to it's host process list */ - host->extension()->process_list.push_back(*process); + host->pimpl_->process_list_.push_back(*process); /* Now insert it in the global process list and in the process to run list */ simix_global->process_list[process->pid_] = process; @@ -450,8 +439,9 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { return; } - XBT_DEBUG("Actor '%s'@%s is killing actor '%s'@%s", issuer->get_cname(), issuer->host_->get_cname(), - process->get_cname(), process->host_->get_cname()); + XBT_DEBUG("Actor '%s'@%s is killing actor '%s'@%s", issuer->get_cname(), + (issuer->host_ == nullptr ? "(null)" : issuer->host_->get_cname()), process->get_cname(), + process->host_->get_cname()); process->context_->iwannadie = 1; process->blocked_ = 0; @@ -486,8 +476,9 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { if (i != process->waiting_synchro->simcalls_.end()) process->waiting_synchro->simcalls_.remove(&process->simcall); } else if (sleep != nullptr) { - SIMIX_process_sleep_destroy(process->waiting_synchro); - + if (sleep->surf_sleep) + sleep->surf_sleep->cancel(); + sleep->post(); } else if (raw != nullptr) { SIMIX_synchro_stop_waiting(process, &process->simcall); @@ -577,9 +568,9 @@ void SIMIX_process_killall(smx_actor_t issuer) void SIMIX_process_change_host(smx_actor_t actor, sg_host_t dest) { xbt_assert((actor != nullptr), "Invalid parameters"); - simgrid::xbt::intrusive_erase(actor->host_->extension()->process_list, *actor); + simgrid::xbt::intrusive_erase(actor->host_->pimpl_->process_list_, *actor); actor->host_ = dest; - dest->extension()->process_list.push_back(*actor); + dest->pimpl_->process_list_.push_back(*actor); } void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t process) @@ -709,9 +700,7 @@ void SIMIX_process_yield(smx_actor_t self) 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->get_cname(), self->code, self->get_user_data(), - SIMIX_timer_get_date(self->kill_timer), self->get_properties(), - self->auto_restart_); + SIMIX_host_add_auto_restart_process(self->host_, self); } XBT_DEBUG("Process %s@%s is dead", self->get_cname(), self->host_->get_cname()); self->context_->stop(); @@ -771,14 +760,6 @@ void SIMIX_process_on_exit(smx_actor_t process, std::function process->on_exit.emplace_back(s_smx_process_exit_fun_t{fun, data}); } -/** - * \brief Sets the auto-restart status of the process. - * If set to 1, the process will be automatically restarted when its host comes back. - */ -void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart) { - process->auto_restart_ = auto_restart; -} - /** @brief Restart a process, starting it again from the beginning. */ /** * \ingroup simix_process_management @@ -796,11 +777,9 @@ void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart) { * \param argv second argument passed to \a code * \param properties the properties of the process */ -smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* data, sg_host_t host, int argc, +smx_actor_t simcall_process_create(std::string name, xbt_main_func_t code, void* data, sg_host_t host, int argc, char** argv, std::unordered_map* properties) { - if (name == nullptr) - name = ""; auto wrapped_code = simgrid::xbt::wrap_main(code, argc, argv); for (int i = 0; i != argc; ++i) xbt_free(argv[i]); @@ -809,11 +788,9 @@ smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* return res; } -smx_actor_t simcall_process_create(const char* name, simgrid::simix::ActorCode code, void* data, sg_host_t host, +smx_actor_t simcall_process_create(std::string name, simgrid::simix::ActorCode code, void* data, sg_host_t host, std::unordered_map* properties) { - if (name == nullptr) - name = ""; smx_actor_t self = SIMIX_process_self(); return simgrid::simix::simcall([name, code, data, host, properties, self] { return SIMIX_process_create(name, std::move(code), data, host, properties, self);