Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
In MSG_process_create_with_environment, inversion of the SIMIX process creation and...
authorMillian Poquet <millian.poquet@inria.fr>
Thu, 7 Jan 2016 18:14:08 +0000 (19:14 +0100)
committerMillian Poquet <millian.poquet@inria.fr>
Thu, 7 Jan 2016 18:14:08 +0000 (19:14 +0100)
src/msg/msg_process.cpp

index 2791dcb..b2abbfb 100644 (file)
@@ -8,6 +8,7 @@
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "src/simix/smx_process_private.h"
 #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)");
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg,
                                 "Logging specific to MSG (process)");
@@ -164,19 +165,25 @@ msg_process_t MSG_process_create_with_environment(const char *name,
   simdata->data = data;
   simdata->last_errno = MSG_OK;
 
   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). */
+  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,
                            argc, argv, properties,0);
 
   /* 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,
                            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;
   if (!process) {
     /* Undo everything we have just changed */
     xbt_free(simdata);
     return NULL;
+    // FIXME: is the TRACE process destroyed in this case?
   }
   else {
   }
   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;
     simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process);
   }
   return process;