Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
make simix more resilient to PEBKAC
[simgrid.git] / src / simix / smx_global.c
index d0ba274..3491894 100644 (file)
@@ -18,7 +18,6 @@
 
 #ifdef HAVE_MC
 #include "mc/mc_private.h"
-#include "mc/mc_model_checker.h"
 #include "mc/mc_protocol.h"
 #include "mc/mc_client.h"
 #endif
@@ -179,6 +178,7 @@ void SIMIX_global_init(int *argc, char **argv)
         SIMIX_synchro_mallocator_new_f, SIMIX_synchro_mallocator_free_f,
         SIMIX_synchro_mallocator_reset_f);
     simix_global->autorestart = SIMIX_host_restart_processes;
+    simix_global->mutex = xbt_os_mutex_init();
 
     surf_init(argc, argv);      /* Initialize SURF structures */
     SIMIX_context_mod_init();
@@ -206,15 +206,14 @@ void SIMIX_global_init(int *argc, char **argv)
     simix_timers = xbt_heap_new(8, &free);
   }
 
-  SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
   SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy);
 
   if (sg_cfg_get_boolean("clean_atexit"))
     atexit(SIMIX_clean);
 
 #ifdef HAVE_MC
-  // The communication initialisation is done ASAP.
-  // We need to commuicate  initialisation of the different layers to the model-checker.
+  // The communication initialization is done ASAP.
+  // We need to communicate  initialization of the different layers to the model-checker.
   if (mc_mode == MC_MODE_NONE) {
     if (getenv(MC_ENV_SOCKET_FD)) {
       mc_mode = MC_MODE_CLIENT;
@@ -243,7 +242,14 @@ void SIMIX_clean(void)
 #endif
   if (cleaned) return; // to avoid double cleaning by java and C
   cleaned = 1;
-  /* Kill everyone (except maestro) */
+  XBT_DEBUG("SIMIX_clean called. Simulation's over.");
+  if (!xbt_dynar_is_empty(simix_global->process_to_run) && SIMIX_get_clock() == 0.0) {
+         XBT_CRITICAL("   ");
+         XBT_CRITICAL("The time is still 0, and you still have processes ready to run.");
+         XBT_CRITICAL("It seems that you forgot to run the simulation that you setup.");
+         xbt_die("Bailing out to avoid that stop-before-start madness. Please fix your code.");
+  }
+  /* Kill all processes (but maestro) */
   SIMIX_process_killall(simix_global->maestro_process, 1);
 
   /* Exit the SIMIX network module */
@@ -260,6 +266,9 @@ void SIMIX_clean(void)
   simix_global->process_to_destroy = NULL;
   xbt_dict_free(&(simix_global->registered_functions));
 
+  xbt_os_mutex_destroy(simix_global->mutex);
+  simix_global->mutex = NULL;
+
   /* Let's free maestro now */
   SIMIX_context_free(simix_global->maestro_process->context);
   xbt_free(simix_global->maestro_process->running_ctx);
@@ -483,7 +492,7 @@ void SIMIX_run(void)
       char *hostname = NULL;
       xbt_dynar_foreach(host_that_restart,iter,hostname) {
         XBT_INFO("Restart processes on host: %s",hostname);
-        SIMIX_host_autorestart(SIMIX_host_get_by_name(hostname));
+        SIMIX_host_autorestart(sg_host_by_name(hostname));
       }
       xbt_dynar_reset(host_that_restart);
     }
@@ -515,7 +524,7 @@ void SIMIX_run(void)
  *   \param arg Parameters of the function
  *
  */
-XBT_INLINE void SIMIX_timer_set(double date, void *function, void *arg)
+XBT_INLINE smx_timer_t SIMIX_timer_set(double date, void *function, void *arg)
 {
   smx_timer_t timer = xbt_new0(s_smx_timer_t, 1);
 
@@ -523,6 +532,16 @@ XBT_INLINE void SIMIX_timer_set(double date, void *function, void *arg)
   timer->func = function;
   timer->args = arg;
   xbt_heap_push(simix_timers, timer, date);
+  return timer;
+}
+/** @brief cancels a timer that was added earlier */
+XBT_INLINE void SIMIX_timer_remove(smx_timer_t timer) {
+       xbt_heap_rm_elm(simix_timers, timer, timer->date);
+}
+
+/** @brief Returns the date at which the timer will trigger (or 0 if NULL timer) */
+XBT_INLINE double SIMIX_timer_get_date(smx_timer_t timer) {
+       return timer?timer->date:0;
 }
 
 /**
@@ -617,12 +636,12 @@ void SIMIX_display_process_status(void)
         break;
       }
       XBT_INFO("Process %lu (%s@%s): waiting for %s synchro %p (%s) in state %d to finish",
-          process->pid, process->name, sg_host_name(process->smx_host),
+          process->pid, process->name, sg_host_name(process->host),
           synchro_description, process->waiting_synchro,
           process->waiting_synchro->name, (int)process->waiting_synchro->state);
     }
     else {
-      XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_name(process->smx_host));
+      XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_name(process->host));
     }
   }
 }