X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d656f9465e7b1c36319f86eeafdcec58fe9551a4..cc4ca208c5e056ac569cd07e08f09a416f3606fe:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 40e0f17a51..2db4aeb504 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -15,6 +15,7 @@ #include "xbt/functional.hpp" #include "xbt/log.h" #include "xbt/sysdep.h" +#include "xbt/utility.hpp" #include "simgrid/s4u/Host.hpp" @@ -24,7 +25,7 @@ #include "src/kernel/activity/SleepImpl.hpp" #include "src/kernel/activity/SynchroIo.hpp" #include "src/kernel/activity/SynchroRaw.hpp" -#include "src/mc/mc_replay.h" +#include "src/mc/mc_replay.hpp" #include "src/mc/remote/Client.hpp" #include "src/msg/msg_private.hpp" #include "src/surf/cpu_interface.hpp" @@ -112,9 +113,14 @@ 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) - xbt_swag_remove(process, process->host->extension()->process_list); - xbt_swag_insert(process, simix_global->process_to_destroy); + if (process->host && process->host_process_list_hook.is_linked()) + simgrid::xbt::intrusive_erase(process->host->extension()->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); +#endif + simix_global->process_to_destroy.push_back(*process); + } process->context->iwannadie = 0; xbt_os_mutex_release(simix_global->mutex); @@ -127,13 +133,15 @@ void SIMIX_process_cleanup(smx_actor_t process) */ void SIMIX_process_empty_trash() { - smx_actor_t process = static_cast(xbt_swag_extract(simix_global->process_to_destroy)); - - while (process) { + while (not simix_global->process_to_destroy.empty()) { + smx_actor_t process = &simix_global->process_to_destroy.front(); + simix_global->process_to_destroy.pop_front(); XBT_DEBUG("Getting rid of %p",process); intrusive_ptr_release(process); - process = static_cast(xbt_swag_extract(simix_global->process_to_destroy)); } +#if SIMGRID_HAVE_MC + xbt_dynar_reset(simix_global->dead_actors_vector); +#endif } namespace simgrid { @@ -213,7 +221,7 @@ smx_activity_t ActorImpl::suspend(ActorImpl* issuer) return nullptr; } else { - return SIMIX_execution_start(this, "suspend", 0.0, 1.0, 0.0); + return SIMIX_execution_start("suspend", 0.0, 1.0, 0.0, this->host); } } @@ -340,7 +348,7 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v host->extension_set(new simgrid::simix::Host()); /* Add the process to its host process list */ - xbt_swag_insert(process, host->extension()->process_list); + host->extension()->process_list.push_back(*process); XBT_DEBUG("Start context '%s'", process->name.c_str()); @@ -351,7 +359,7 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v intrusive_ptr_add_ref(process); /* Tracing the process creation */ - TRACE_msg_process_create(process->getCname(), process->pid, process->host); + TRACE_msg_process_create(process->getName(), process->pid, process->host); return process; } @@ -406,7 +414,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn process->setProperty(kv.first, kv.second); /* Add the process to it's host process list */ - xbt_swag_insert(process, host->extension()->process_list); + host->extension()->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; @@ -414,7 +422,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn simix_global->process_to_run.push_back(process); /* Tracing the process creation */ - TRACE_msg_process_create(process->getCname(), process->pid, process->host); + TRACE_msg_process_create(process->getName(), process->pid, process->host); auto context = dynamic_cast(process->context); if (not context) @@ -464,6 +472,12 @@ void SIMIX_process_runall() */ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { + if (process->finished) { + XBT_DEBUG("Ignoring request to kill process %s@%s that is already dead", process->getCname(), + process->host->getCname()); + return; + } + XBT_DEBUG("Killing process %s@%s", process->getCname(), process->host->getCname()); process->context->iwannadie = 1; @@ -486,7 +500,11 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { boost::dynamic_pointer_cast(process->waiting_synchro); if (exec != nullptr) { - /* Nothing to do */ + if (exec->surfAction_) { + exec->surfAction_->cancel(); + exec->surfAction_->unref(); + exec->surfAction_ = nullptr; + } } else if (comm != nullptr) { process->comms.remove(process->waiting_synchro); comm->cancel(); @@ -534,8 +552,8 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const simgrid::kernel::activity::ExecImplPtr exec = boost::dynamic_pointer_cast(process->waiting_synchro); - if (exec != nullptr && exec->surf_exec) - exec->surf_exec->cancel(); + if (exec != nullptr && exec->surfAction_) + exec->surfAction_->cancel(); simgrid::kernel::activity::CommImplPtr comm = boost::dynamic_pointer_cast(process->waiting_synchro); @@ -592,9 +610,9 @@ void SIMIX_process_killall(smx_actor_t issuer, int reset_pid) void SIMIX_process_change_host(smx_actor_t process, sg_host_t dest) { xbt_assert((process != nullptr), "Invalid parameters"); - xbt_swag_remove(process, process->host->extension()->process_list); + simgrid::xbt::intrusive_erase(process->host->extension()->process_list, *process); process->host = dest; - xbt_swag_insert(process, dest->extension()->process_list); + dest->extension()->process_list.push_back(*process); } void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_actor_t process)