X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2d62f02c44fd56836ab5c3a6183d6a89aa01be26..4b5d82355daac2ba088d17e0ca91fb29709866eb:/src/msg/msg_process.cpp 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;