From: Martin Quinson Date: Thu, 7 Jan 2016 21:52:53 +0000 (+0100) Subject: Merge pull request #45 from mpoquet/master X-Git-Tag: v3_13~1315^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/79f2c630c9587d494cb154e6d074294c1e23208e?hp=ceedfe1f3f14e6cae48ee7684f98c7e4ab1fd2be Merge pull request #45 from mpoquet/master Patch candidate for issue 15 --- diff --git a/src/msg/instr_msg_process.cpp b/src/msg/instr_msg_process.cpp index 1af7c9621f..db8621630a 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); } } @@ -130,16 +134,3 @@ void TRACE_msg_process_sleep_out(msg_process_t process) new_pajePopState (MSG_get_clock(), process_container, type); } } - -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); - } -} diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index c6df5a7551..85da70124c 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -196,13 +196,12 @@ 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); XBT_PRIVATE void TRACE_msg_process_sleep_in(msg_process_t process); //called from msg/gos.c XBT_PRIVATE void TRACE_msg_process_sleep_out(msg_process_t process); -XBT_PRIVATE void TRACE_msg_process_end(msg_process_t process); /* declaration of instrumentation functions from instr_msg_vm.c */ XBT_PRIVATE char *instr_vm_id(msg_vm_t vm, char *str, int len); diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index e0681b1abd..5d588bdf95 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -8,6 +8,7 @@ #include "xbt/sysdep.h" #include "xbt/log.h" #include "src/simix/smx_process_private.h" +#include "src/simix/smx_private.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg, "Logging specific to MSG (process)"); @@ -41,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); @@ -164,19 +165,25 @@ msg_process_t MSG_process_create_with_environment(const char *name, simdata->data = data; simdata->last_errno = MSG_OK; + /* The TRACE process is created before the SIMIX one + * to avoid issues when SIMIX decides to start the new + * process right now (before returning the flow control). */ + unsigned int next_pid = SIMIX_process_get_maxpid(); + TRACE_msg_process_create(name, next_pid, host); + /* Let's create the process: SIMIX may decide to start it right now, * even before returning the flow control to us */ - process = simcall_process_create(name, code, simdata, sg_host_get_name(host), -1, + process = simcall_process_create(name, code, simdata, sg_host_get_name(host), -1, argc, argv, properties,0); - TRACE_msg_process_create(name, SIMIX_process_get_PID(process), host); - if (!process) { /* Undo everything we have just changed */ xbt_free(simdata); return NULL; + // FIXME: is the TRACE process destroyed in this case? } else { + xbt_assert(next_pid == process->pid, "Bad trace pid hack"); simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process); } return process;