+ if (opt::log_rate >= 0)
+ XBT_INFO("Initial load: %g", real_load);
+ XBT_VERB("Starting...");
+ mutex.acquire();
+ lb_thread->start();
+ while (lb_iter <= opt::comp_iter_delay)
+ cond.wait(mutex);
+ mutex.release();
+ double sleep_duration = opt::comp_time_delay - MSG_get_clock();
+ if (sleep_duration > 0.0)
+ MSG_process_sleep(sleep_duration);
+ compute_loop();
+ lb_thread->wait();
+ XBT_VERB("Done.");
+ return 0;
+}
+
+void process::load_balance_loop()
+{
+ using std::tr1::bind;
+ using std::tr1::placeholders::_1;
+
+ double next_iter_after_date = MSG_get_clock() + opt::min_lb_iter_duration;
+ while (still_running()) {
+ if (lb_iter == opt::comp_iter_delay) {
+ mutex.acquire();
+ ++lb_iter;
+ cond.signal();
+ mutex.release();
+ } else {
+ ++lb_iter;
+ }
+
+ if (opt::log_rate && lb_iter % opt::log_rate == 0) {
+ if (opt::bookkeeping)
+ XBT_INFO("(%u:%u) current load: %g ; expected: %g",
+ lb_iter, comp_iter, real_load, expected_load);
+ else
+ XBT_INFO("(%u:%u) current load: %g",
+ lb_iter, comp_iter, real_load);
+ }
+
+ if (get_load() > 0.0)
+ load_balance();
+
+ print_loads(true, xbt_log_priority_debug);
+
+ // send
+ std::for_each(neigh.begin(), neigh.end(),
+ bind(&process::ctrl_send, this, _1));
+ prev_load_broadcast = get_load();
+
+ sleep_until_date(next_iter_after_date, opt::min_lb_iter_duration);
+ ctrl_receive(0.0);
+
+ comm.ctrl_flush(false);
+ }