// Step 19. Check for splitting the search
if ( !SpNode
&& depth >= Threads.minimumSplitDepth
- && Threads.slave_available(thisThread)
+ && Threads.available_slave(thisThread)
&& thisThread->splitPointsSize < MAX_SPLITPOINTS_PER_THREAD)
{
assert(bestValue < beta);
// slave_available() tries to find an idle thread which is available as a slave
// for the thread 'master'.
-bool ThreadPool::slave_available(Thread* master) const {
+Thread* ThreadPool::available_slave(Thread* master) const {
for (const_iterator it = begin(); it != end(); ++it)
if ((*it)->is_available_to(master))
- return true;
+ return *it;
- return false;
+ return NULL;
}
activeSplitPoint = &sp;
size_t slavesCnt = 1; // This thread is always included
+ Thread* slave;
- for (ThreadPool::iterator it = Threads.begin(); it != Threads.end() && !Fake; ++it)
+ while ( (slave = Threads.available_slave(this)) != NULL
+ && ++slavesCnt <= Threads.maxThreadsPerSplitPoint && !Fake)
{
- Thread* slave = *it;
-
- if (slave->is_available_to(this) && ++slavesCnt <= Threads.maxThreadsPerSplitPoint)
- {
- sp.slavesMask |= 1ULL << slave->idx;
- slave->activeSplitPoint = &sp;
- slave->searching = true; // Slave leaves idle_loop()
- slave->notify_one(); // Could be sleeping
- }
+ sp.slavesMask |= 1ULL << slave->idx;
+ slave->activeSplitPoint = &sp;
+ slave->searching = true; // Slave leaves idle_loop()
+ slave->notify_one(); // Could be sleeping
}
sp.mutex.unlock();
MainThread* main_thread() { return static_cast<MainThread*>((*this)[0]); }
void read_uci_options();
- bool slave_available(Thread* master) const;
+ Thread* available_slave(Thread* master) const;
void wait_for_think_finished();
void start_thinking(const Position&, const Search::LimitsType&,
const std::vector<Move>&, Search::StateStackPtr&);