Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add a clock per process when running in MC mode.
[simgrid.git] / src / simix / smx_global.c
index d6b84ed..059130d 100644 (file)
@@ -10,6 +10,7 @@
 #include "xbt/log.h"
 #include "xbt/str.h"
 #include "xbt/ex.h"             /* ex_backtrace_display */
+#include "mc/mc.h"
 
 XBT_LOG_EXTERNAL_CATEGORY(simix);
 XBT_LOG_EXTERNAL_CATEGORY(simix_action);
@@ -22,7 +23,7 @@ XBT_LOG_EXTERNAL_CATEGORY(simix_context);
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
                                 "Logging specific to SIMIX (kernel)");
 
-SIMIX_Global_t simix_global = NULL;
+smx_global_t simix_global = NULL;
 static xbt_heap_t simix_timers = NULL;
 
 /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */
@@ -63,11 +64,10 @@ void SIMIX_global_init(int *argc, char **argv)
     XBT_LOG_CONNECT(simix_synchro, simix);
     XBT_LOG_CONNECT(simix_context, simix);
 
-    simix_global = xbt_new0(s_SIMIX_Global_t, 1);
+    simix_global = xbt_new0(s_smx_global_t, 1);
 
     simix_global->host = xbt_dict_new();
-    simix_global->process_to_run =
-        xbt_swag_new(xbt_swag_offset(proc, synchro_hookup));
+    simix_global->process_to_run = xbt_dynar_new(sizeof(void *), NULL);
     simix_global->process_list =
         xbt_swag_new(xbt_swag_offset(proc, process_hookup));
     simix_global->process_to_destroy =
@@ -80,10 +80,7 @@ void SIMIX_global_init(int *argc, char **argv)
     simix_global->kill_process_function = NULL;
     simix_global->cleanup_process_function = SIMIX_process_cleanup;
 
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-    simix_global->latency_limited_dict = xbt_dict_new();
-#endif
-
+    surf_init(argc, argv);      /* Initialize SURF structures */
     SIMIX_context_mod_init();
     SIMIX_create_maestro_process();
 
@@ -99,7 +96,6 @@ void SIMIX_global_init(int *argc, char **argv)
 
     /* Prepare to display some more info when dying on Ctrl-C pressing */
     signal(SIGINT, inthandler);
-    surf_init(argc, argv);      /* Initialize SURF structures */
   }
   if (!simix_timers) {
     simix_timers = xbt_heap_new(8, &free);
@@ -124,7 +120,7 @@ void SIMIX_clean(void)
 
   xbt_heap_free(simix_timers);
   /* Free the remaining data structures */
-  xbt_swag_free(simix_global->process_to_run);
+  xbt_dynar_free(&simix_global->process_to_run);
   xbt_swag_free(simix_global->process_to_destroy);
   xbt_swag_free(simix_global->process_list);
   simix_global->process_list = NULL;
@@ -132,10 +128,6 @@ void SIMIX_clean(void)
   xbt_dict_free(&(simix_global->registered_functions));
   xbt_dict_free(&(simix_global->host));
 
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  xbt_dict_free(&(simix_global->latency_limited_dict));
-#endif
-
   /* Let's free maestro now */
   SIMIX_context_free(simix_global->maestro_process->context);
   xbt_free(simix_global->maestro_process->running_ctx);
@@ -165,7 +157,11 @@ void SIMIX_clean(void)
  */
 XBT_INLINE double SIMIX_get_clock(void)
 {
-  return surf_get_clock();
+  if(MC_IS_ENABLED){
+    return MC_process_clock_get(SIMIX_process_self());
+  }else{
+    return surf_get_clock();
+  }
 }
 
 void SIMIX_run(void)
@@ -180,13 +176,14 @@ void SIMIX_run(void)
 
   do {
     do {
-      DEBUG0("New Schedule Round");
+      DEBUG1("New Schedule Round; size(queue)=%lu",
+          xbt_dynar_length(simix_global->process_to_run));
       SIMIX_context_runall(simix_global->process_to_run);
       while ((req = SIMIX_request_pop())) {
         DEBUG1("Handling request %p", req);
-        SIMIX_request_pre(req);
+        SIMIX_request_pre(req, 0);
       }
-    } while (xbt_swag_size(simix_global->process_to_run));
+    } while (xbt_dynar_length(simix_global->process_to_run));
 
     time = surf_solve(SIMIX_timer_next());
 
@@ -215,6 +212,12 @@ void SIMIX_run(void)
     }
   } while (time != -1.0);
 
+  if (xbt_swag_size(simix_global->process_list) != 0) {
+
+    WARN0("Oops ! Deadlock or code not perfectly clean.");
+    SIMIX_display_process_status();
+    xbt_abort();
+  }
 }
 
 /**
@@ -289,8 +292,6 @@ void SIMIX_display_process_status(void)
   }
 
   smx_process_t process = NULL;
-  /*xbt_fifo_item_t item = NULL;
-  smx_action_t act;*/
   int nbprocess = xbt_swag_size(simix_global->process_list);
 
   INFO1("%d processes are still running, waiting for something.", nbprocess);
@@ -298,70 +299,37 @@ void SIMIX_display_process_status(void)
   INFO0
     ("Legend of the following listing: \"<process> on <host>: <status>.\"");
   xbt_swag_foreach(process, simix_global->process_list) {
-    char *who, *who2;
-
-    asprintf(&who, "%s on %s: %s",
-             process->name,
-             process->smx_host->name,
-             (process->blocked) ? "[BLOCKED] "
-             : ((process->suspended) ? "[SUSPENDED] " : ""));
 
     if (process->waiting_action) {
-      who2 = bprintf("Waiting for action %p to finish", process->waiting_action);
-    }
 
-      /*
-    if (process->mutex) {
-      who2 =
-        bprintf("%s Blocked on mutex %p", who,
-                (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_verbose)) ?
-                process->mutex : (void *) 0xdead);
-      free(who);
-      who = who2;
-    } else if (process->cond) {
-      who2 =
-        bprintf
-        ("%s Blocked on condition %p; Waiting for the following actions:",
-         who,
-         (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_verbose)) ?
-         process->cond : (void *) 0xdead);
-      free(who);
-      who = who2;
-      xbt_fifo_foreach(process->cond->actions, item, act, smx_action_t) {
-        who2 =
-          bprintf("%s '%s'(%p)", who, act->name,
-                  (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_verbose))
-                  ? act : (void *) 0xdead);
-        free(who);
-        who = who2;
-      }
-    } else if (process->sem) {
-      who2 =
-        bprintf
-        ("%s Blocked on semaphore %p; Waiting for the following actions:",
-         who,
-         (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_verbose)) ?
-         process->sem : (void *) 0xdead);
-      free(who);
-      who = who2;
-      xbt_fifo_foreach(process->sem->actions, item, act, smx_action_t) {
-        who2 =
-          bprintf("%s '%s'(%p)", who, act->name,
-                  (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_verbose))
-                  ? act : (void *) 0xdead);
-        free(who);
-        who = who2;
-      }
+      const char* action_description = "unknown";
+      switch (process->waiting_action->type) {
+
+       case SIMIX_ACTION_EXECUTE:
+         action_description = "execution";
+         break;
+
+       case SIMIX_ACTION_PARALLEL_EXECUTE:
+         action_description = "parallel execution";
+         break;
 
-    } else {
-      who2 =
-        bprintf
-        ("%s Blocked in an unknown status (please report this bug)", who);
-      free(who);
-      who = who2;
+       case SIMIX_ACTION_COMMUNICATE:
+         action_description = "communication";
+         break;
+
+       case SIMIX_ACTION_SLEEP:
+         action_description = "sleeping";
+         break;
+
+       case SIMIX_ACTION_SYNCHRO:
+         action_description = "synchronization";
+         break;
+
+       case SIMIX_ACTION_IO:
+         action_description = "I/O";
+         break;
+      }
+      INFO2("Waiting for %s action %p to finish", action_description, process->waiting_action);
     }
-    */
-    INFO1("%s.", who);
-    free(who);
   }
 }