* load balance with a least-loaded neighbor,
* without breaking the ping-pong condition
*/
-double loba_simple::load_balance(double my_load)
+void loba_simple::load_balance()
{
int imin = -1;
int imax = -1;
- double min = my_load;
+ double min = get_load();
double max = -1.0;
for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
double l = pneigh[i]->get_load();
- if (l >= my_load)
+ if (l >= get_load())
continue;
if (l < min) {
imin = i;
max = l;
}
}
- if (imin != -1) {
- // found someone
- double balance = (my_load - max) / 2;
- DEBUG6("%d:%g %d:%g %g %g", imin, min, imax, max, my_load, balance);
- pneigh[imin]->set_to_send(balance);
- pneigh[imin]->add_load(balance);
- return balance;
- } else {
- return 0.0;
+ if (imin != -1) { // found someone
+ double balance = std::min((get_load() - min) / 2.0,
+ (get_load() - max));
+ XBT_DEBUG("%d:%g %d:%g %g %g",
+ imin, min, imax, max, get_load(), balance);
+ send(pneigh[imin], balance);
}
}