-template Value ThreadsManager::split<false>(Position&, SearchStack*, Value, Value, Value, Depth, Move, int, MovePicker*, int);
-template Value ThreadsManager::split<true>(Position&, SearchStack*, Value, Value, Value, Depth, Move, int, MovePicker*, int);
+template Value ThreadPool::split<false>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker&, int);
+template Value ThreadPool::split<true>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker&, int);
+
+
+// wait_for_think_finished() waits for main thread to go to sleep then returns
+
+void ThreadPool::wait_for_think_finished() {
+
+ MainThread* t = main_thread();
+ t->mutex.lock();
+ while (t->thinking) sleepCondition.wait(t->mutex);
+ t->mutex.unlock();
+}
+
+
+// start_thinking() wakes up the main thread sleeping in MainThread::idle_loop()
+// so to start a new search, then returns immediately.
+
+void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits,
+ const std::vector<Move>& searchMoves, StateStackPtr& states) {
+ wait_for_think_finished();
+
+ SearchTime = Time::now(); // As early as possible
+
+ Signals.stopOnPonderhit = Signals.firstRootMove = false;
+ Signals.stop = Signals.failedLowAtRoot = false;
+
+ RootPos = pos;
+ Limits = limits;
+ SetupStates = states; // Ownership transfer here
+ RootMoves.clear();
+
+ for (MoveList<LEGAL> ml(pos); !ml.end(); ++ml)
+ if (searchMoves.empty() || count(searchMoves.begin(), searchMoves.end(), ml.move()))
+ RootMoves.push_back(RootMove(ml.move()));
+
+ main_thread()->thinking = true;
+ main_thread()->notify_one(); // Starts main thread
+}