Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix a bunch of compilation warnings
[simgrid.git] / src / simix / smx_global.c
index 2139013..4957361 100644 (file)
@@ -22,7 +22,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,17 +63,15 @@ 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 =
         xbt_swag_new(xbt_swag_offset(proc, destroy_hookup));
 
-    simix_global->current_process = NULL;
     simix_global->maestro_process = NULL;
     simix_global->registered_functions = xbt_dict_new();
 
@@ -85,6 +83,7 @@ void SIMIX_global_init(int *argc, char **argv)
     simix_global->latency_limited_dict = xbt_dict_new();
 #endif
 
+    surf_init(argc, argv);      /* Initialize SURF structures */
     SIMIX_context_mod_init();
     SIMIX_create_maestro_process();
 
@@ -97,10 +96,9 @@ void SIMIX_global_init(int *argc, char **argv)
 
     /* Initialize the SIMIX network module */
     SIMIX_network_init();
-    
+
     /* 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);
@@ -119,13 +117,13 @@ void SIMIX_clean(void)
 
   /* Exit the SIMIX network module */
   SIMIX_network_exit();
-  
+
   /* Exit request mechanism */
   SIMIX_request_destroy();
-  
+
   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;
@@ -178,23 +176,24 @@ void SIMIX_run(void)
   smx_timer_t timer;
   surf_model_t model;
   unsigned int iter;
+
   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())){
+      while ((req = SIMIX_request_pop())) {
         DEBUG1("Handling request %p", req);
         SIMIX_request_pre(req);
       }
-    } while (xbt_swag_size(simix_global->process_to_run));
+    } while (xbt_dynar_length(simix_global->process_to_run));
 
     time = surf_solve(SIMIX_timer_next());
 
     /* Notify all the hosts that have failed */
     /* FIXME: iterate through the list of failed host and mark each of them */
     /* as failed. On each host, signal all the running processes with host_fail */
-    
+
     /* Handle any pending timer */
     while (xbt_heap_size(simix_timers) > 0 && SIMIX_get_clock() >= SIMIX_timer_next()) {
        //FIXME: make the timers being real callbacks
@@ -205,17 +204,23 @@ void SIMIX_run(void)
     }
     /* Wake up all process waiting for the action finish */
     xbt_dynar_foreach(model_list, iter, model) {
-      for(set = model->states.failed_action_set;
-          set;
-          set = (set == model->states.failed_action_set)
-                ? model->states.done_action_set
-                : NULL) {
+      for (set = model->states.failed_action_set;
+           set;
+           set = (set == model->states.failed_action_set)
+                 ? model->states.done_action_set
+                 : NULL) {
         while ((action = xbt_swag_extract(set)))
-          SIMIX_request_post((smx_action_t)action->data);
+          SIMIX_request_post((smx_action_t) action->data);
       }
     }
-  } while(time != -1.0);
+  } 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();
+  }
 }
 
 /**
@@ -290,8 +295,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);
@@ -299,70 +302,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);
   }
 }