Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix the host-on-off refcount test
[simgrid.git] / src / simix / smx_process.c
index ce66e94..02e70b4 100644 (file)
@@ -9,6 +9,8 @@
 #include "xbt/log.h"
 #include "xbt/dict.h"
 #include "mc/mc.h"
+#include "mc/mc_replay.h"
+#include "mc/mc_client.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix,
                                 "Logging specific to SIMIX (process)");
@@ -48,6 +50,12 @@ void SIMIX_process_cleanup(smx_process_t process)
 
   SIMIX_process_on_exit_runall(process);
 
+  /* Unregister from the kill timer if any */
+  if (process->kill_timer != NULL)
+         SIMIX_timer_remove(process->kill_timer);
+
+  xbt_os_mutex_acquire(simix_global->mutex);
+
   /* cancel non-blocking communications */
   smx_synchro_t synchro;
   while ((synchro = xbt_fifo_pop(process->comms))) {
@@ -91,6 +99,8 @@ void SIMIX_process_cleanup(smx_process_t process)
   xbt_swag_remove(process, SIMIX_host_priv(process->smx_host)->process_list);
   xbt_swag_insert(process, simix_global->process_to_destroy);
   process->context->iwannadie = 0;
+
+  xbt_os_mutex_release(simix_global->mutex);
 }
 
 /**
@@ -156,7 +166,7 @@ void SIMIX_process_stop(smx_process_t arg) {
   if (arg->auto_restart && !SIMIX_host_get_state(arg->smx_host)) {
     SIMIX_host_add_auto_restart_process(arg->smx_host,arg->name,arg->code, arg->data,
                                         sg_host_name(arg->smx_host),
-                                        arg->kill_time,
+                                        SIMIX_timer_get_date(arg->kill_timer),
                                         arg->argc,arg->argv,arg->properties,
                                         arg->auto_restart);
   }
@@ -259,7 +269,6 @@ void SIMIX_process_create(smx_process_t *process,
     (*process)->code = code;
     (*process)->argc = argc;
     (*process)->argv = argv;
-    (*process)->kill_time = kill_time;
 
 
     XBT_VERB("Create context %s", (*process)->name);
@@ -289,7 +298,7 @@ void SIMIX_process_create(smx_process_t *process,
     if (kill_time > SIMIX_get_clock() && simix_global->kill_process_function) {
       XBT_DEBUG("Process %s(%s) will be kill at time %f", (*process)->name,
           sg_host_name((*process)->smx_host), kill_time);
-      SIMIX_timer_set(kill_time, simix_global->kill_process_function, *process);
+      (*process)->kill_timer = SIMIX_timer_set(kill_time, simix_global->kill_process_function, *process);
     }
   }
 }
@@ -347,6 +356,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
     case SIMIX_SYNC_COMMUNICATE:
       xbt_fifo_remove(process->comms, process->waiting_synchro);
       SIMIX_comm_cancel(process->waiting_synchro);
+      xbt_fifo_remove(process->waiting_synchro->simcalls, &process->simcall);
       SIMIX_comm_destroy(process->waiting_synchro);
       break;
 
@@ -368,6 +378,8 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
       break;
 
     }
+
+    process->waiting_synchro = NULL;
   }
   if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) {
     XBT_DEBUG("Inserting %s in the to_run list", process->name);
@@ -404,11 +416,12 @@ void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, con
       break;
 
     case SIMIX_SYNC_SLEEP:
-      SIMIX_process_sleep_destroy(process->waiting_synchro);
-      break;
-
     case SIMIX_SYNC_JOIN:
       SIMIX_process_sleep_destroy(process->waiting_synchro);
+      if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self()) {
+        XBT_DEBUG("Inserting %s in the to_run list", process->name);
+        xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
+      }
       break;
 
     case SIMIX_SYNC_SYNCHRO:
@@ -423,8 +436,6 @@ void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, con
   }
   process->waiting_synchro = NULL;
 
-  if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self())
-    xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
 }
 
 void simcall_HANDLER_process_killall(smx_simcall_t simcall, int reset_pid) {
@@ -952,18 +963,15 @@ void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) {
 smx_process_t simcall_HANDLER_process_restart(smx_simcall_t simcall, smx_process_t process) {
   return SIMIX_process_restart(process, simcall->issuer);
 }
-/**
- * \brief Restart a process.
- * Restart a process, starting it again from the beginning.
- */
+/** @brief Restart a process, starting it again from the beginning. */
 smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer) {
   XBT_DEBUG("Restarting process %s on %s", process->name, sg_host_name(process->smx_host));
   //retrieve the arguments of the old process
-  //FIXME: Factorise this with SIMIX_host_add_auto_restart_process ?
+  //FIXME: Factorize this with SIMIX_host_add_auto_restart_process ?
   s_smx_process_arg_t arg;
   arg.code = process->code;
   arg.hostname = sg_host_name(process->smx_host);
-  arg.kill_time = process->kill_time;
+  arg.kill_time = SIMIX_timer_get_date(process->kill_timer);
   arg.argc = process->argc;
   arg.data = process->data;
   int i;