From: Arnaud Giersch Date: Wed, 26 Jan 2011 12:38:09 +0000 (+0100) Subject: Synchronize the processes before exiting. X-Git-Tag: v0.1~188^2~4 X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/61c63b5df9b55aec7c072edb5b392569b215cb83?hp=-c Synchronize the processes before exiting. 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. --- 61c63b5df9b55aec7c072edb5b392569b215cb83 diff --git a/main.cpp b/main.cpp index 67af3fe..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) { @@ -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);