if (Time::now() - SearchTime > (TimeMgr.available_time() * 62) / 100)
stop = true;
+ bool recapture = pos.is_capture(RootMoves[0].pv[0])
+ && pos.captured_piece_type()
+ && SetupMoves->size()
+ && to_sq(SetupMoves->back()) == to_sq(RootMoves[0].pv[0]);
+
// Stop search early if one move seems to be much better than others
if ( depth >= 12
&& !stop
&& PVSize == 1
- && ( (bestMoveNeverChanged && pos.captured_piece_type())
+ && ( (bestMoveNeverChanged && recapture)
+ || RootMoves.size() == 1
|| Time::now() - SearchTime > (TimeMgr.available_time() * 40) / 100))
{
Value rBeta = bestValue - 2 * PawnValueMg;
// Pointer 'this_sp' is not null only if we are called from split(), and not
// at the thread creation. So it means we are the split point's master.
- const SplitPoint* this_sp = splitPointsSize ? activeSplitPoint : NULL;
+ SplitPoint* this_sp = splitPointsSize ? activeSplitPoint : NULL;
assert(!this_sp || (this_sp->masterThread == this && searching));
// their work at this split point, return from the idle loop.
while (!this_sp || this_sp->slavesMask)
{
+ if (this_sp)
+ this_sp->mutex.unlock();
+
// If we are not searching, wait for a condition to be signaled instead of
// wasting CPU time polling for work.
while ((!searching && Threads.sleepWhileIdle) || exit)
// unsafe because if we are exiting there is a chance are already freed.
sp->mutex.unlock();
}
+
+ if(this_sp)
+ this_sp->mutex.lock();
}
}