Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
A candidate patch to Github issue #15. Three problems related to TRACE might be corre...
authorMillian Poquet <millian.poquet@inria.fr>
Wed, 10 Jun 2015 17:54:27 +0000 (19:54 +0200)
committerMillian Poquet <millian.poquet@inria.fr>
Wed, 10 Jun 2015 17:54:27 +0000 (19:54 +0200)
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
src/msg/msg_process.c

index c2307ca..cc1bd8e 100644 (file)
@@ -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];
 
   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)
 }
 
 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()) {
 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
     //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));
   }
 }
   }
 }
index d78beb5..bad98f6 100644 (file)
@@ -166,12 +166,14 @@ 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;
 
+  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 */
   /* 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);
                            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 */
 
   if (!process) {
     /* Undo everything we have just changed */