Reformat and simplify previous patch

No functional change.
This commit is contained in:
Marco Costalba
2014-05-07 08:47:18 +02:00
parent f6e98a924a
commit 7e3dba4f4c
3 changed files with 39 additions and 50 deletions

View File

@@ -987,7 +987,7 @@ moves_loop: // When in check and at SpNode search starts from here
&& Threads.size() >= 2
&& depth >= Threads.minimumSplitDepth
&& ( !thisThread->activeSplitPoint
|| !thisThread->activeSplitPoint->allowLatejoin)
|| !thisThread->activeSplitPoint->allSlavesSearching)
&& thisThread->splitPointsSize < MAX_SPLITPOINTS_PER_THREAD)
{
assert(bestValue > -VALUE_INFINITE && bestValue < beta);
@@ -1529,9 +1529,10 @@ void Thread::idle_loop() {
assert(searching);
searching = false;
activePosition = NULL;
sp->slavesMask.reset(idx);
sp->allowLatejoin = false;
sp->allSlavesSearching = false;
sp->nodes += pos.nodes_searched();
// Wake up the master thread so to allow it to return from the idle
@@ -1550,9 +1551,36 @@ void Thread::idle_loop() {
// if we are exiting there is a chance that they are already freed.
sp->mutex.unlock();
// Try to late join to another splitpoint
if (Threads.size() <= 2 || !attempt_to_latejoin()) // FIXME: attempt_to_latejoin() is theoretically unsafe when were are exiting the program...
searching = false;
// Try to late join to another split point if none of its slaves has
// already finished.
if (Threads.size() > 2)
for (size_t i = 0; i < Threads.size(); ++i)
{
int size = Threads[i]->splitPointsSize; // Local copy
sp = size ? &Threads[i]->splitPoints[size - 1] : NULL;
if ( sp
&& sp->allSlavesSearching
&& available_to(Threads[i]))
{
// Recheck the conditions under lock protection
Threads.mutex.lock();
sp->mutex.lock();
if ( sp->allSlavesSearching
&& available_to(Threads[i]))
{
sp->slavesMask.set(idx);
activeSplitPoint = sp;
searching = true;
}
sp->mutex.unlock();
Threads.mutex.unlock();
break; // Just a single attempt
}
}
}
// If this thread is the master of a split point and all slaves have finished
@@ -1568,44 +1596,6 @@ void Thread::idle_loop() {
}
}
bool Thread::attempt_to_latejoin()
{
SplitPoint *sp;
size_t i;
bool success = false;
for (i = 0; i < Threads.size(); ++i)
{
int size = Threads[i]->splitPointsSize; // Make a local copy to prevent size from changing under our feet.
sp = size ? &Threads[i]->splitPoints[size - 1] : NULL;
if ( sp
&& sp->allowLatejoin
&& available_to(Threads[i], true))
break;
}
if (i == Threads.size())
return false; // No suitable splitpoint found!
// Recheck conditions under lock protection
Threads.mutex.lock();
sp->mutex.lock();
if ( sp->allowLatejoin
&& available_to(Threads[i], true))
{
activeSplitPoint = sp;
sp->slavesMask.set(this->idx);
success = true;
}
sp->mutex.unlock();
Threads.mutex.unlock();
return success;
}
/// check_time() is called by the timer thread when the timer triggers. It is
/// used to print debug info and, more importantly, to detect when we are out of