Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merge branches
[simgrid.git] / src / simix / smx_global.c
index eccb2a5..ebd3dea 100644 (file)
@@ -35,10 +35,16 @@ extern void smx_ctx_raw_new_sr(void);
 /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */
 #include <signal.h>
 
+int _surf_do_verbose_exit = 1;
 static void _XBT_CALL inthandler(int ignored)
 {
-  XBT_INFO("CTRL-C pressed. Displaying status and bailing out");
-  SIMIX_display_process_status();
+  if ( _surf_do_verbose_exit ) {
+     XBT_INFO("CTRL-C pressed. Displaying status and bailing out");
+     SIMIX_display_process_status();
+  }
+  else {
+     XBT_INFO("CTRL-C pressed. bailing out without displaying because verbose-exit disabled");
+  }
   exit(1);
 }
 
@@ -72,8 +78,8 @@ void SIMIX_global_init(int *argc, char **argv)
 
     simix_global = xbt_new0(s_smx_global_t, 1);
 
-    simix_global->host = xbt_dict_new();
-    simix_global->process_to_run = xbt_dynar_new(sizeof(void *), NULL);
+    simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL);
+    simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL);
     simix_global->process_list =
         xbt_swag_new(xbt_swag_offset(proc, process_hookup));
     simix_global->process_to_destroy =
@@ -97,9 +103,6 @@ void SIMIX_global_init(int *argc, char **argv)
     __xbt_running_ctx_fetch = SIMIX_process_get_running_context;
     __xbt_ex_terminate = SIMIX_process_exception_terminate;
 
-    /* Initialize request mechanism */
-    SIMIX_request_init();
-
     /* Initialize the SIMIX network module */
     SIMIX_network_init();
 
@@ -109,6 +112,9 @@ void SIMIX_global_init(int *argc, char **argv)
   if (!simix_timers) {
     simix_timers = xbt_heap_new(8, &free);
   }
+
+  XBT_DEBUG("ADD SIMIX LEVELS");
+  SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
 }
 
 /**
@@ -128,18 +134,15 @@ 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_dynar_free(&simix_global->process_to_run);
+  xbt_dynar_free(&simix_global->process_that_ran);
   xbt_swag_free(simix_global->process_to_destroy);
   xbt_swag_free(simix_global->process_list);
   simix_global->process_list = NULL;
   simix_global->process_to_destroy = NULL;
   xbt_dict_free(&(simix_global->registered_functions));
-  xbt_dict_free(&(simix_global->host));
 
   /* Let's free maestro now */
   SIMIX_context_free(simix_global->maestro_process->context);
@@ -181,7 +184,7 @@ XBT_INLINE double SIMIX_get_clock(void)
 void SIMIX_run(void)
 {
   double time = 0;
-  smx_req_t req;
+  smx_process_t process;
   xbt_swag_t set;
   surf_action_t action;
   smx_timer_t timer;
@@ -194,17 +197,21 @@ void SIMIX_run(void)
 #ifdef TIME_BENCH
     smx_ctx_raw_new_sr();
 #endif
-    do {
+    while (xbt_dynar_length(simix_global->process_to_run)) {
       XBT_DEBUG("New Sub-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())) {
-        XBT_DEBUG("Handling request %p", req);
-        SIMIX_request_pre(req, 0);
+      SIMIX_process_runall();
+      xbt_dynar_foreach(simix_global->process_that_ran, iter, process) {
+        if (process->request.call != REQ_NO_REQ) {
+          XBT_DEBUG("Handling request %p", &process->request);
+          SIMIX_request_pre(&process->request, 0);
+        }
       }
-    } while (xbt_dynar_length(simix_global->process_to_run));
+    }
 
-    time = surf_solve(SIMIX_timer_next());
+    time = SIMIX_timer_next();
+    if (time != -1.0 || xbt_swag_size(simix_global->process_list) != 0)
+      time = surf_solve(time);
 
     /* Notify all the hosts that have failed */
     /* FIXME: iterate through the list of failed host and mark each of them */
@@ -229,10 +236,18 @@ void SIMIX_run(void)
           SIMIX_request_post((smx_action_t) action->data);
       }
     }
+
+    /* Clean processes to destroy */
+    SIMIX_process_empty_trash();
+
   } while (time != -1.0);
 
   if (xbt_swag_size(simix_global->process_list) != 0) {
 
+#ifdef HAVE_TRACING
+    TRACE_end();
+#endif
+
     XBT_WARN("Oops ! Deadlock or code not perfectly clean.");
     SIMIX_display_process_status();
     xbt_abort();
@@ -313,7 +328,7 @@ void SIMIX_display_process_status(void)
   XBT_INFO("%d processes are still running, waiting for something.", nbprocess);
   /*  List the process and their state */
   XBT_INFO
-    ("Legend of the following listing: \"<process> on <host>: <status>.\"");
+    ("Legend of the following listing: \"<process>(<pid>) on <host>: <status>.\"");
   xbt_swag_foreach(process, simix_global->process_list) {
 
     if (process->waiting_action) {
@@ -345,7 +360,8 @@ void SIMIX_display_process_status(void)
          action_description = "I/O";
          break;
       }
-      XBT_INFO("Waiting for %s action %p to finish", action_description, process->waiting_action);
+      XBT_INFO("Process %ld (%s@%s): waiting for %s action %p (%s) to finish", process->pid, process->name, process->smx_host->name,
+         action_description, process->waiting_action, process->waiting_action->name);
     }
   }
 }