+ 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.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);