+ Thread* master = pos.this_thread();
+
+ if (master->splitPointsCnt >= MAX_SPLITPOINTS_PER_THREAD)
+ return bestValue;
+
+ // Pick the next available split point from the split point stack
+ SplitPoint* sp = &master->splitPoints[master->splitPointsCnt];
+
+ sp->parent = master->curSplitPoint;
+ sp->master = master;
+ sp->cutoff = false;
+ sp->slavesMask = 1ULL << master->idx;
+ sp->allSlavesMask = 1ULL << master->idx;
+ sp->depth = depth;
+ sp->bestMove = *bestMove;
+ sp->threatMove = threatMove;
+ sp->alpha = alpha;
+ sp->beta = beta;
+ sp->nodeType = nodeType;
+ sp->bestValue = bestValue;
+ sp->mp = mp;
+ sp->moveCount = moveCount;
+ sp->pos = &pos;
+ sp->nodes = 0;
+ sp->ss = ss;
+
+ assert(master->is_searching);
+
+ master->curSplitPoint = sp;
+ int slavesCnt = 0;
+
+ // Try to allocate available threads and ask them to start searching setting
+ // is_searching flag. This must be done under lock protection to avoid concurrent
+ // allocation of the same slave by another master.
+ lock_grab(sp->lock);
+ lock_grab(splitLock);
+
+ for (int i = 0; i < size() && !Fake; ++i)
+ if (threads[i]->is_available_to(master))
+ {
+ sp->slavesMask |= 1ULL << i;
+ sp->allSlavesMask |= 1ULL << i;
+ threads[i]->curSplitPoint = sp;
+ threads[i]->is_searching = true; // Slave leaves idle_loop()
+
+ if (useSleepingThreads)
+ threads[i]->wake_up();
+
+ if (++slavesCnt + 1 >= maxThreadsPerSplitPoint) // Master is always included
+ {
+ sp->allSlavesMask = 0; // Disable reparenting to this split point
+ break;
+ }
+ }