Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
use a typed extension for simix::Host
[simgrid.git] / src / simix / smx_global.cpp
index 0a8a05c..a47eaec 100644 (file)
@@ -165,6 +165,8 @@ static std::function<void()> maestro_code;
 namespace simgrid {
 namespace simix {
 
+simgrid::xbt::signal<void()> onDeadlock;
+
 XBT_PUBLIC(void) set_maestro(std::function<void()> code)
 {
   maestro_code = std::move(code);
@@ -226,7 +228,6 @@ void SIMIX_global_init(int *argc, char **argv)
     simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) {
       SIMIX_host_create(&host);
     });
-    SIMIX_HOST_LEVEL = simgrid::s4u::Host::extension_create(SIMIX_host_destroy);
 
     simgrid::surf::storageCreatedCallbacks.connect([](simgrid::surf::Storage* storage) {
       const char* name = storage->getName();
@@ -531,24 +532,26 @@ void SIMIX_run()
     } while (again);
 
     /* Autorestart all process */
-    char *hostname = nullptr;
-    unsigned int iter;
-    xbt_dynar_foreach(host_that_restart,iter,hostname) {
-      XBT_INFO("Restart processes on host: %s",hostname);
-      SIMIX_host_autorestart(sg_host_by_name(hostname));
+    for (auto host: host_that_restart) {
+      XBT_INFO("Restart processes on host: %s", sg_host_get_name(host));
+      SIMIX_host_autorestart(host);
     }
-    xbt_dynar_reset(host_that_restart);
+    host_that_restart.clear();
 
     /* Clean processes to destroy */
     SIMIX_process_empty_trash();
 
     XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run));
 
+    if (xbt_dynar_is_empty(simix_global->process_to_run) &&
+        xbt_swag_size(simix_global->process_list) != 0)
+    simgrid::simix::onDeadlock();
+
   } while (time > -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run));
 
   if (xbt_swag_size(simix_global->process_list) != 0) {
 
-  TRACE_end();
+    TRACE_end();
 
     XBT_CRITICAL("Oops ! Deadlock or code not perfectly clean.");
     SIMIX_display_process_status();