]> AND Private Git Repository - loba.git/blobdiff - main.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Synchronize the processes before exiting.
[loba.git] / main.cpp
index ccd11bd4143aa8d68f4da203500a0cfcb58a547e..fc42d750f9c992b8fe9a27b17f5aac7ec232b48c 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -34,6 +34,10 @@ namespace {
         EXIT_FAILURE_CLEAN = 0x08,  // error at cleanup
     };
 
+    xbt_mutex_t proc_mutex;
+    xbt_cond_t proc_cond;
+    unsigned proc_counter;
+
     struct statistics comps;
     struct statistics loads;
 
@@ -45,9 +49,28 @@ static int simulation_main(int argc, char* argv[])
     process* proc;
     try {
         proc = opt::loba_algorithms.new_instance(opt::loba_algo, argc, argv);
+
+        xbt_mutex_acquire(proc_mutex);
+        ++proc_counter;
+        xbt_mutex_release(proc_mutex);
+
         result = proc->run();
+
+        xbt_mutex_acquire(proc_mutex);
         comps.push(proc->get_comp());
         loads.push(proc->get_real_load());
+
+        // Synchronization barrier...
+        // The goal is to circumvent a limitation in SimGrid (at least
+        // in version 3.5): a process must be alive when another one
+        // destroys a communication they had together.
+
+        --proc_counter;
+        xbt_cond_broadcast(proc_cond);
+        while (proc_counter > 0)
+            xbt_cond_wait(proc_cond, proc_mutex);
+        xbt_mutex_release(proc_mutex);
+
         delete proc;
     }
     catch (std::invalid_argument& e) {
@@ -65,7 +88,7 @@ static void check_for_lost_load()
     double lost_ratio = 100.0 * lost / total_init;
     if (lost_ratio < -opt::load_ratio_threshold)
         CRITICAL2("Gained load at exit! %g (%g%%) <============",
-                  lost, lost_ratio);
+                  -lost, -lost_ratio);
     else if (lost_ratio > opt::load_ratio_threshold)
         CRITICAL2("Lost load at exit! %g (%g%%) <============",
                   lost, lost_ratio);
@@ -88,7 +111,7 @@ static void check_for_lost_load()
 #define PR_STATS(descr, st)                                             \
     INFO5("| %.*s: %g / %g / %g", 39,                                   \
           descr " total/avg./stddev. at exit.........................", \
-          st.get_sum(), st.get_avg(), st.get_stddev())
+          st.get_sum(), st.get_mean(), st.get_stddev())
 
 int main(int argc, char* argv[])
 {
@@ -167,11 +190,19 @@ int main(int argc, char* argv[])
 
         exit_status = EXIT_FAILURE_SIMU; // =====
 
+        proc_mutex = xbt_mutex_init();
+        proc_cond = xbt_cond_init();
+        proc_counter = 0;
+
         // Launch the MSG simulation.
         INFO1("Starting simulation at %f...", MSG_get_clock());
         res = MSG_main();
         simulated_time = MSG_get_clock();
         INFO1("Simulation ended at %f.", simulated_time);
+
+        xbt_cond_destroy(proc_cond);
+        xbt_mutex_destroy(proc_mutex);
+
         if (res != MSG_OK)
             THROW1(0, 0, "MSG_main() failed with status %#x", res);