1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Reparent to latest

Instead of reparenting to oldest split point, try to reparent
to latest. The nice thing here is that we can use the YBWC
helpful master condition to allow the reparenting of a split
point master as long as is reparented to one of its slaves.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2012-04-13 06:32:55 +01:00
parent c645aca199
commit 25a9b601b2

View file

@ -1860,40 +1860,39 @@ void Thread::idle_loop(SplitPoint* sp_master) {
// unsafe because if we are exiting there is a chance are already freed.
lock_release(sp->lock);
// Try to reparent to another split point. Only for slave threads
// that are not master of any active split point.
if (!splitPointsCnt)
// Try to reparent to another split point
for (int i = 0; i < Threads.size(); i++)
{
Thread* th = &Threads[i];
SplitPoint* oldest = &th->splitPoints[0];
int spCnt = th->splitPointsCnt;
SplitPoint* latest = &th->splitPoints[spCnt ? spCnt - 1 : 0];
// Find the first split point with still all slaves running
// where we are available as a possible slave.
if ( !is_searching
&& th->splitPointsCnt
&& !oldest->cutoff
&& oldest->slavesMask == oldest->allSlavesMask
&& !single_bit(oldest->allSlavesMask))
if ( this->is_available_to(th)
&& spCnt > 0
&& !latest->cutoff
&& latest->slavesMask == latest->allSlavesMask
&& !single_bit(latest->allSlavesMask))
{
lock_grab(oldest->lock);
lock_grab(latest->lock);
lock_grab(Threads.splitLock);
// Retest all under lock protection, we are in the middle
// of a race storm here !
if ( !is_searching
&& th->splitPointsCnt
&& !oldest->cutoff
&& oldest->slavesMask == oldest->allSlavesMask
&& !single_bit(oldest->allSlavesMask))
if ( this->is_available_to(th)
&& spCnt == th->splitPointsCnt
&& !latest->cutoff
&& latest->slavesMask == latest->allSlavesMask
&& !single_bit(latest->allSlavesMask))
{
oldest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated
curSplitPoint = oldest;
latest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated
curSplitPoint = latest;
is_searching = true;
}
lock_release(Threads.splitLock);
lock_release(oldest->lock);
lock_release(latest->lock);
break; // Exit anyhow, only one try (enough in 99% of cases)
}