-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_search_finished() waits for main thread to go to sleep, this means
+// search is finished. Then returns.
+
+void ThreadPool::wait_for_search_finished() {
+
+ MainThread* t = main_thread();
+ t->mutex.lock();
+ while (!t->is_finished) sleepCondition.wait(t->mutex);
+ t->mutex.unlock();
+}
+
+
+// start_searching() wakes up the main thread sleeping in main_loop() so to start
+// a new search, then returns immediately.
+
+void ThreadPool::start_searching(const Position& pos, const LimitsType& limits,
+ const std::vector<Move>& searchMoves, StateStackPtr& states) {
+ wait_for_search_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()->is_finished = false;
+ main_thread()->notify_one(); // Starts main thread
+}