-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);
+
+
+// set_timer() is used to set the timer to trigger after msec milliseconds.
+// If msec is 0 then timer is stopped.
+
+void ThreadPool::set_timer(int msec) {
+
+ timer->mutex.lock();
+ timer->maxPly = msec;
+ timer->sleepCondition.notify_one(); // Wake up and restart the timer
+ timer->mutex.unlock();
+}
+
+
+// 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() {
+
+ Thread* t = main_thread();
+ t->mutex.lock();
+ t->sleepCondition.notify_one(); // In case is waiting for stop or ponderhit
+ while (!t->do_sleep) 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()->do_sleep = false;
+ main_thread()->wake_up();
+}