X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/61856fb5422e392a34106b1c698cf5d67a9647b4..dad7be6bee684505c05fae88ff0c89a02db422eb:/main.cpp?ds=sidebyside diff --git a/main.cpp b/main.cpp index 4e8864c..fc42d75 100644 --- 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) { @@ -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);