From 61c63b5df9b55aec7c072edb5b392569b215cb83 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Wed, 26 Jan 2011 13:38:09 +0100 Subject: [PATCH] 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. --- main.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) 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); -- 2.39.5