From 3c40b1bfc4f4925fa401d3b5d0c74a4b4824b3d5 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 3 Feb 2018 22:26:25 +0100 Subject: [PATCH 1/1] actually fix the memleak around smpi's process_data - Call Actor::onDestruction from the right location - Have SMPI only destroy the process data of its own processes (not of MSG ones) - Make sure that the process created with MSG_process_attach() have the right refcount since we now use a smart pointer on it: we don't want it to get freed too early. --- src/simix/ActorImpl.cpp | 4 ++-- src/smpi/internals/smpi_global.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 5d347f1199..a1982608a4 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -404,6 +404,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn simix_global->process_list[process->pid] = process; XBT_DEBUG("Inserting %s(%s) in the to_run list", process->getCname(), host->getCname()); simix_global->process_to_run.push_back(process); + intrusive_ptr_add_ref(process); /* Tracing the process creation */ TRACE_msg_process_create(process->getName(), process->pid, process->host); @@ -425,7 +426,6 @@ void SIMIX_process_detach() auto process = context->process(); simix_global->cleanup_process_function(process); context->attach_stop(); - delete process; } /** @@ -462,7 +462,6 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { return; } - simgrid::s4u::Actor::onDestruction(process->iface()); XBT_DEBUG("Killing process %s@%s", process->getCname(), process->host->getCname()); process->context->iwannadie = 1; @@ -784,6 +783,7 @@ smx_actor_t SIMIX_process_from_PID(aid_t PID) } void SIMIX_process_on_exit_runall(smx_actor_t process) { + simgrid::s4u::Actor::onDestruction(process->iface()); smx_process_exit_status_t exit_status = (process->context->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS; while (not process->on_exit.empty()) { s_smx_process_exit_fun_t exit_fun = process->on_exit.back(); diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 5aade555a7..afabcb8aaf 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -629,8 +629,10 @@ void SMPI_init(){ smpi_add_process(actor); }); simgrid::s4u::Actor::onDestruction.connect([](simgrid::s4u::ActorPtr actor) { - delete process_data.at(actor); - process_data.erase(actor); + if (process_data.find(actor) != process_data.end()) { + delete process_data.at(actor); + process_data.erase(actor); + } }); smpi_init_options(); -- 2.20.1