+ mutex.acquire();
+ if (!opt::bookkeeping)
+ expected_load = real_load - get_sum_of_to_send();
+ // nothing to do with opt::bookkeeping
+
+ if (opt::log_rate && lb_iter % opt::log_rate == 0) {
+ XBT_INFO("(%u:%u:%u) current load: %g",
+ lb_iter, comp_iter, all_comp_iter, real_load);
+ XBT_VERB("... expected load: %g", expected_load);
+ }
+
+ if (expected_load > 0.0)
+ load_balance();
+
+ print_loads(true, xbt_log_priority_debug);
+
+ // send
+ comm.ctrl_flush(false);
+ std::for_each(neigh.begin(), neigh.end(),
+ std::bind(&process::ctrl_send, this, _1));
+ prev_load_broadcast = expected_load;
+ mutex.release();
+
+ sleep_until_date(next_iter_after_date, opt::min_lb_iter_duration);
+ }
+
+ XBT_VERB("Going to finalize for %s...", __func__);
+ XBT_DEBUG("send CTRL_CLOSE to %zu neighbor%s",
+ neigh.size(), ESSE(neigh.size()));
+ std::for_each(neigh.begin(), neigh.end(),
+ std::bind(&process::ctrl_close, this, _1));
+ while (ctrl_close_pending) {
+ comm.ctrl_flush(false);
+ XBT_DEBUG("waiting for %d CTRL_CLOSE", ctrl_close_pending);
+ ctrl_receive(-1.0);
+ }
+ comm.ctrl_flush(true);