From: Millian Poquet Date: Thu, 7 Jan 2016 18:46:16 +0000 (+0100) Subject: Fix TRACE_msg_process_destroy: PJ_container_get_or_null is used instead of PJ_contain... X-Git-Tag: v3_13~1315^2^2~2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/28551df49f16fc1f6be375bf3e7ea14e9669f09d?hp=-c Fix TRACE_msg_process_destroy: PJ_container_get_or_null is used instead of PJ_container_get to avoid crash on double destruction of a TRACE process (or just if the corresponding process was not created). Header updated since the host was not used in this function. The function TRACE_msg_process_end now calls TRACE_msg_process_destroy. --- 28551df49f16fc1f6be375bf3e7ea14e9669f09d diff --git a/src/msg/instr_msg_process.cpp b/src/msg/instr_msg_process.cpp index 1af7c9621f..a02687e134 100644 --- a/src/msg/instr_msg_process.cpp +++ b/src/msg/instr_msg_process.cpp @@ -40,7 +40,7 @@ void TRACE_msg_process_change_host(msg_process_t process, msg_host_t old_host, m new_pajeStartLink (MSG_get_clock(), PJ_container_get_root(), type, msg, "M", key); //destroy existing container of this process - TRACE_msg_process_destroy (MSG_process_get_name (process), MSG_process_get_PID (process), old_host); + TRACE_msg_process_destroy (MSG_process_get_name (process), MSG_process_get_PID (process)); //create new container on the new_host location TRACE_msg_process_create (MSG_process_get_name (process), MSG_process_get_PID (process), new_host); @@ -63,21 +63,25 @@ void TRACE_msg_process_create (const char *process_name, int process_pid, msg_ho } } -void TRACE_msg_process_destroy (const char *process_name, int process_pid, msg_host_t host) +void TRACE_msg_process_destroy (const char *process_name, int process_pid) { - int len = INSTR_DEFAULT_STR_SIZE; - char str[INSTR_DEFAULT_STR_SIZE]; + if (TRACE_msg_process_is_enabled()) { + int len = INSTR_DEFAULT_STR_SIZE; + char str[INSTR_DEFAULT_STR_SIZE]; - container_t process = PJ_container_get (instr_process_id_2 (process_name, process_pid, str, len)); - PJ_container_remove_from_parent (process); - PJ_container_free (process); + container_t process = PJ_container_get_or_null(instr_process_id_2(process_name, process_pid, str, len)); + if (process) { + PJ_container_remove_from_parent (process); + PJ_container_free (process); + } + } } void TRACE_msg_process_kill(smx_process_exit_status_t status, msg_process_t process) { if (TRACE_msg_process_is_enabled() && status==SMX_EXIT_FAILURE){ //kill means that this process no longer exists, let's destroy it - TRACE_msg_process_destroy(MSG_process_get_name (process), MSG_process_get_PID (process), MSG_process_get_host (process)); + TRACE_msg_process_destroy(process->name, process->pid); } } @@ -134,12 +138,6 @@ void TRACE_msg_process_sleep_out(msg_process_t process) void TRACE_msg_process_end(msg_process_t process) { if (TRACE_msg_process_is_enabled()) { - int len = INSTR_DEFAULT_STR_SIZE; - char str[INSTR_DEFAULT_STR_SIZE]; - - //that's the end, let's destroy it - container_t container = PJ_container_get (instr_process_id(process, str, len)); - PJ_container_remove_from_parent (container); - PJ_container_free (container); + TRACE_msg_process_destroy(process->name, process->pid); } } diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index c6df5a7551..59cd9917d5 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -196,7 +196,7 @@ XBT_PRIVATE char *instr_process_id_2 (const char *process_name, int process_pid, XBT_PRIVATE void TRACE_msg_process_change_host(msg_process_t process, msg_host_t old_host, msg_host_t new_host); XBT_PRIVATE void TRACE_msg_process_create (const char *process_name, int process_pid, msg_host_t host); -XBT_PRIVATE void TRACE_msg_process_destroy (const char *process_name, int process_pid, msg_host_t host); +XBT_PRIVATE void TRACE_msg_process_destroy (const char *process_name, int process_pid); XBT_PRIVATE void TRACE_msg_process_kill(smx_process_exit_status_t status, msg_process_t process); XBT_PRIVATE void TRACE_msg_process_suspend(msg_process_t process); XBT_PRIVATE void TRACE_msg_process_resume(msg_process_t process); diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index b2abbfb9db..5b0d531421 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -42,7 +42,7 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc) simcall_process_set_data(smx_proc, NULL); } - TRACE_msg_process_end(smx_proc); + TRACE_msg_process_destroy(smx_proc->name, smx_proc->pid); // free the data if a function was provided if (msg_proc && msg_proc->data && msg_global->process_data_cleanup) { msg_global->process_data_cleanup(msg_proc->data);