From 58a9c67822f4640964044ec485426d090bcb123f Mon Sep 17 00:00:00 2001 From: Millian Poquet Date: Wed, 10 Jun 2015 19:54:27 +0200 Subject: [PATCH] A candidate patch to Github issue #15. Three problems related to TRACE might be corrected by this patch. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Problem 1: the same Pajé container (corresponding to the same MSG_process) could be destroyed more than once by the current TRACE logic. Fix: A safer mechanism avoids multiple destroys of the same container. Potential problem: the current TRACE logic might be bugged and this fix may only hide the problem. Problem 2: the Pajé container (corresponding to a MSG_process) was created after the simcall_process_create although the simcall might not return the flow control. Fix: The Pajé container is now created before the simcall_process_create (the future SIMIX process ID is hacked thanks to SIMIX_process_get_maxpid()) Code redundancy: The function TRACE_msg_process_end destroyed the process container in the exact same way as it was done in TRACE_msg_process_destroy. Fix: the TRACE_msg_process_destroy function is now called instead. --- src/msg/instr_msg_process.c | 16 +++++++--------- src/msg/msg_process.c | 8 +++++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/msg/instr_msg_process.c b/src/msg/instr_msg_process.c index c2307ca7c7..cc1bd8e589 100644 --- a/src/msg/instr_msg_process.c +++ b/src/msg/instr_msg_process.c @@ -68,9 +68,12 @@ void TRACE_msg_process_destroy (const char *process_name, int process_pid, msg_h 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); + // Avoids multiple destroys of the same 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) @@ -134,12 +137,7 @@ 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(MSG_process_get_name (process), MSG_process_get_PID (process), MSG_process_get_host (process)); } } diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index d78beb576a..bad98f663e 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -166,12 +166,14 @@ msg_process_t MSG_process_create_with_environment(const char *name, simdata->data = data; simdata->last_errno = MSG_OK; + int future_simix_process_pid = SIMIX_process_get_maxpid(); + TRACE_msg_process_create(name, future_simix_process_pid, host); + /* Let's create the process: SIMIX may decide to start it right now, * even before returning the flow control to us */ - simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1, + simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1, argc, argv, properties,0); - - TRACE_msg_process_create(name, SIMIX_process_get_PID(process), host); + xbt_assert(future_simix_process_pid == SIMIX_process_get_PID(process)); if (!process) { /* Undo everything we have just changed */ -- 2.20.1