Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' into mc
[simgrid.git] / src / simix / smx_process.c
index c70f33a..21a4ef8 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)");
@@ -38,9 +40,6 @@ int SIMIX_process_has_pending_comms(smx_process_t process) {
   return xbt_fifo_size(process->comms) > 0;
 }
 
-void simcall_HANDLER_process_cleanup(smx_simcall_t simcall, smx_process_t process) {
-  SIMIX_process_cleanup(process);
-}
 /**
  * \brief Moves a process to the list of processes to destroy.
  */
@@ -51,6 +50,10 @@ 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);
+
   /* cancel non-blocking communications */
   smx_synchro_t synchro;
   while ((synchro = xbt_fifo_pop(process->comms))) {
@@ -89,6 +92,7 @@ void SIMIX_process_cleanup(smx_process_t process)
     }
   }
 
+  XBT_DEBUG("%p should not be run anymore",process);
   xbt_swag_remove(process, simix_global->process_list);
   xbt_swag_remove(process, SIMIX_host_priv(process->smx_host)->process_list);
   xbt_swag_insert(process, simix_global->process_to_destroy);
@@ -106,6 +110,8 @@ void SIMIX_process_empty_trash(void)
   smx_process_t process = NULL;
 
   while ((process = xbt_swag_extract(simix_global->process_to_destroy))) {
+    XBT_DEBUG("Getting rid of %p",process);
+
     SIMIX_context_free(process->context);
 
     /* Free the exception allocated at creation time */
@@ -156,7 +162,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 +265,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 +294,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);
     }
   }
 }
@@ -370,6 +375,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
     }
   }
   if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) {
+    XBT_DEBUG("Inserting %s in the to_run list", process->name);
     xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
   }
 
@@ -403,11 +409,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:
@@ -422,8 +429,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) {
@@ -588,18 +593,11 @@ int SIMIX_process_get_maxpid(void) {
   return simix_process_maxpid;
 }
 
-int simcall_HANDLER_process_count(smx_simcall_t simcall){
-  return SIMIX_process_count();
-}
 int SIMIX_process_count(void)
 {
   return xbt_swag_size(simix_global->process_list);
 }
 
-int simcall_HANDLER_process_get_PID(smx_simcall_t simcall, smx_process_t self){
-   return SIMIX_process_get_PID(self);
-}
-
 int SIMIX_process_get_PID(smx_process_t self){
   if (self == NULL)
     return 0;
@@ -607,10 +605,6 @@ int SIMIX_process_get_PID(smx_process_t self){
     return self->pid;
 }
 
-int simcall_HANDLER_process_get_PPID(smx_simcall_t simcall, smx_process_t self){
-  return SIMIX_process_get_PPID(self);
-}
-
 int SIMIX_process_get_PPID(smx_process_t self){
   if (self == NULL)
     return 0;
@@ -628,10 +622,6 @@ void* SIMIX_process_self_get_data(smx_process_t self)
   return SIMIX_process_get_data(self);
 }
 
-void simcall_HANDLER_process_set_data(smx_simcall_t simcall, smx_process_t process,
-                                void *data){
-  SIMIX_process_set_data(process, data);
-}
 void SIMIX_process_self_set_data(smx_process_t self, void *data)
 {
   xbt_assert(self == SIMIX_process_self(), "This is not the current process");
@@ -639,9 +629,6 @@ void SIMIX_process_self_set_data(smx_process_t self, void *data)
   SIMIX_process_set_data(self, data);
 }
 
-void* simcall_HANDLER_process_get_data(smx_simcall_t simcall, smx_process_t process){
-  return SIMIX_process_get_data(process);
-}
 void* SIMIX_process_get_data(smx_process_t process)
 {
   return process->data;
@@ -652,9 +639,6 @@ void SIMIX_process_set_data(smx_process_t process, void *data)
   process->data = data;
 }
 
-smx_host_t simcall_HANDLER_process_get_host(smx_simcall_t simcall, smx_process_t process){
-  return SIMIX_process_get_host(process);
-}
 smx_host_t SIMIX_process_get_host(smx_process_t process)
 {
   return process->smx_host;
@@ -671,9 +655,6 @@ const char* SIMIX_process_self_get_name(void) {
   return SIMIX_process_get_name(process);
 }
 
-const char* simcall_HANDLER_process_get_name(smx_simcall_t simcall, smx_process_t process) {
-  return SIMIX_process_get_name(process);
-}
 const char* SIMIX_process_get_name(smx_process_t process)
 {
   return process->name;
@@ -691,17 +672,11 @@ smx_process_t SIMIX_process_get_by_name(const char* name)
   return NULL;
 }
 
-int simcall_HANDLER_process_is_suspended(smx_simcall_t simcall, smx_process_t process){
-  return SIMIX_process_is_suspended(process);
-}
 int SIMIX_process_is_suspended(smx_process_t process)
 {
   return process->suspended;
 }
 
-xbt_dict_t simcall_HANDLER_process_get_properties(smx_simcall_t simcall, smx_process_t process){
-  return SIMIX_process_get_properties(process);
-}
 xbt_dict_t SIMIX_process_get_properties(smx_process_t process)
 {
   return process->properties;
@@ -747,7 +722,7 @@ smx_synchro_t SIMIX_process_join(smx_process_t issuer, smx_process_t process, do
 
 void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration)
 {
-  if (MC_is_active()) {
+  if (MC_is_active() || MC_record_replay_is_active()) {
     MC_process_clock_add(simcall->issuer, duration);
     simcall_process_sleep__set__result(simcall, SIMIX_DONE);
     SIMIX_simcall_answer(simcall);
@@ -772,9 +747,7 @@ smx_synchro_t SIMIX_process_sleep(smx_process_t process, double duration)
   synchro = xbt_mallocator_get(simix_global->synchro_mallocator);
   synchro->type = SIMIX_SYNC_SLEEP;
   synchro->name = NULL;
-#ifdef HAVE_TRACING
   synchro->category = NULL;
-#endif
 
   synchro->sleep.host = host;
   synchro->sleep.surf_sleep =
@@ -959,11 +932,6 @@ void SIMIX_process_on_exit_runall(smx_process_t process) {
   }
 }
 
-void simcall_HANDLER_process_on_exit(smx_simcall_t simcall, smx_process_t process,
-                              int_f_pvoid_pvoid_t fun, void *data) {
-  SIMIX_process_on_exit(process, fun, data);
-}
-
 void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_pvoid_t fun, void *data) {
   xbt_assert(process, "current process not found: are you in maestro context ?");
 
@@ -976,10 +944,6 @@ void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_pvoid_t fun, void
   xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun);
 }
 
-void simcall_HANDLER_process_auto_restart_set(smx_simcall_t simcall, smx_process_t process,
-                                       int auto_restart) {
-  SIMIX_process_auto_restart_set(process, auto_restart);
-}
 /**
  * \brief Sets the auto-restart status of the process.
  * If set to 1, the process will be automatically restarted when its host
@@ -992,18 +956,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;