Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Revert "got a "might be clobbered by ‘longjmp’ or ‘vfork’" error when compiled"
[simgrid.git] / src / simix / smx_global.c
index 913abb2..0de13d2 100644 (file)
 #include "xbt/ex.h"             /* ex_backtrace_display */
 #include "mc/mc.h"
 
-XBT_LOG_EXTERNAL_CATEGORY(simix);
-XBT_LOG_EXTERNAL_CATEGORY(simix_action);
-XBT_LOG_EXTERNAL_CATEGORY(simix_deployment);
-XBT_LOG_EXTERNAL_CATEGORY(simix_environment);
-XBT_LOG_EXTERNAL_CATEGORY(simix_host);
-XBT_LOG_EXTERNAL_CATEGORY(simix_process);
-XBT_LOG_EXTERNAL_CATEGORY(simix_synchro);
-XBT_LOG_EXTERNAL_CATEGORY(simix_context);
+XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
                                 "Logging specific to SIMIX (kernel)");
 
@@ -66,16 +59,6 @@ void SIMIX_global_init(int *argc, char **argv)
   s_smx_process_t proc;
 
   if (!simix_global) {
-    /* Connect our log channels: that must be done manually under windows */
-    XBT_LOG_CONNECT(simix_action, simix);
-    XBT_LOG_CONNECT(simix_deployment, simix);
-    XBT_LOG_CONNECT(simix_environment, simix);
-    XBT_LOG_CONNECT(simix_host, simix);
-    XBT_LOG_CONNECT(simix_kernel, simix);
-    XBT_LOG_CONNECT(simix_process, simix);
-    XBT_LOG_CONNECT(simix_synchro, simix);
-    XBT_LOG_CONNECT(simix_context, simix);
-
     simix_global = xbt_new0(s_smx_global_t, 1);
 
     simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL);
@@ -182,6 +165,19 @@ XBT_INLINE double SIMIX_get_clock(void)
   }
 }
 
+static int process_syscall_color(void *p)
+{
+  switch ((*(smx_process_t *)p)->simcall.call) {
+  case SIMCALL_NONE:
+  case SIMCALL_PROCESS_KILL:
+    return 2;
+  case SIMCALL_PROCESS_RESUME:
+    return 1;
+  default:
+    return 0;
+  }
+}
+
 void SIMIX_run(void)
 {
   double time = 0;
@@ -202,6 +198,7 @@ void SIMIX_run(void)
       XBT_DEBUG("New Sub-Schedule Round; size(queue)=%lu",
               xbt_dynar_length(simix_global->process_to_run));
       SIMIX_process_runall();
+      xbt_dynar_three_way_partition(simix_global->process_that_ran, process_syscall_color);
       xbt_dynar_foreach(simix_global->process_that_ran, iter, process) {
         if (process->simcall.call != SIMCALL_NONE) {
           SIMIX_simcall_pre(&process->simcall, 0);
@@ -334,33 +331,33 @@ void SIMIX_display_process_status(void)
       const char* action_description = "unknown";
       switch (process->waiting_action->type) {
 
-       case SIMIX_ACTION_EXECUTE:
-         action_description = "execution";
-         break;
+      case SIMIX_ACTION_EXECUTE:
+        action_description = "execution";
+        break;
 
-       case SIMIX_ACTION_PARALLEL_EXECUTE:
-         action_description = "parallel execution";
-         break;
+      case SIMIX_ACTION_PARALLEL_EXECUTE:
+        action_description = "parallel execution";
+        break;
 
-       case SIMIX_ACTION_COMMUNICATE:
-         action_description = "communication";
-         break;
+      case SIMIX_ACTION_COMMUNICATE:
+        action_description = "communication";
+        break;
 
-       case SIMIX_ACTION_SLEEP:
-         action_description = "sleeping";
-         break;
+      case SIMIX_ACTION_SLEEP:
+        action_description = "sleeping";
+        break;
 
-       case SIMIX_ACTION_SYNCHRO:
-         action_description = "synchronization";
-         break;
+      case SIMIX_ACTION_SYNCHRO:
+        action_description = "synchronization";
+        break;
 
-       case SIMIX_ACTION_IO:
-         action_description = "I/O";
-         break;
+      case SIMIX_ACTION_IO:
+        action_description = "I/O";
+        break;
       }
       XBT_INFO("Process %lu (%s@%s): waiting for %s action %p (%s) in state %d to finish",
           process->pid, process->name, process->smx_host->name,
-         action_description, process->waiting_action,
+          action_description, process->waiting_action,
           process->waiting_action->name, (int)process->waiting_action->state);
     }
     else {