-/// ThreadsManager class handles all the threads related stuff like init, starting,
-/// parking and, the most important, launching a slave thread at a split point.
-/// All the access to shared thread data is done through this class.
+/// MainThread is a derived class specific for main thread
+
+struct MainThread : public Thread {
+
+ using Thread::Thread;
+
+ void search() override;
+ void check_time();
+
+ bool easyMovePlayed, failedLow;
+ double bestMoveChanges;
+ Value previousScore;
+ int callsCnt;
+};
+
+
+/// ThreadPool struct handles all the threads-related stuff like init, starting,
+/// parking and, most importantly, launching a thread. All the access to threads
+/// is done through this class.
+
+struct ThreadPool : public std::vector<Thread*> {
+
+ void init(size_t); // No constructor and destructor, threads rely on globals that should
+ void exit(); // be initialized and valid during the whole thread lifetime.
+ void start_thinking(Position&, StateListPtr&, const Search::LimitsType&, bool = false);
+ void set(size_t);
+
+ MainThread* main() const { return static_cast<MainThread*>(front()); }
+ uint64_t nodes_searched() const { return accumulate(&Thread::nodes); }
+ uint64_t tb_hits() const { return accumulate(&Thread::tbHits); }
+
+ std::atomic_bool stop, ponder, stopOnPonderhit;