Fix endless reaparenting loop
authorMarco Costalba <mcostalba@gmail.com>
Tue, 17 Apr 2012 07:11:34 +0000 (09:11 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 17 Apr 2012 17:51:49 +0000 (18:51 +0100)
commitce159b16b9483f83b9e96ac6bf3d6e2ba7e5619c
treec0213acf374684c8deee27e2ac9a7b3ea4ba2fc7
parent5392007a249644475da6cbb92de87502d982fc0d
Fix endless reaparenting loop

The check for detecting when a split point has all the
slaves still running is done with:

   slavesMask == allSlavesMask

When a thread reparents, slavesMask is increased, then, if
the same thread finishes, because there are no more moves,
slavesMask returns to original value and the above condition
returns to be true. So that the just finished thread immediately
reparents again with the same split point, then starts and
then immediately exits in a tight loop that ends only when a
second slave finishes, so that slavesMask decrements and the
condition becomes false. This gives a spurious and anomaly
high number of faked reparents.

With this patch, that rewrites the logic to avoid this pitfall,
the reparenting success rate drops to a more realistical 5-10%
for 4 threads case.

As a side effect note that now there is no more the limit of
maxThreadsPerSplitPoint when reparenting.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp
src/thread.cpp
src/thread.h