struct Thread {
- enum ThreadState
- {
- INITIALIZING, // Thread is initializing itself
- SEARCHING, // Thread is performing work
- AVAILABLE, // Thread is waiting for work
- WORKISWAITING, // Master has ordered us to start searching
- TERMINATED // We are quitting and thread is terminated
- };
-
void wake_up();
bool cutoff_occurred() const;
bool is_available_to(int master) const;
void idle_loop(SplitPoint* sp);
+ void listener_loop();
+ void timer_loop();
SplitPoint splitPoints[MAX_ACTIVE_SPLIT_POINTS];
MaterialInfoTable materialTable;
int maxPly;
Lock sleepLock;
WaitCondition sleepCond;
- volatile ThreadState state;
SplitPoint* volatile splitPoint;
volatile int activeSplitPoints;
+ volatile bool is_searching;
volatile bool do_sleep;
volatile bool do_terminate;
+
+#if defined(_MSC_VER)
+ HANDLE handle;
+#else
+ pthread_t handle;
+#endif
};
Thread& operator[](int threadID) { return threads[threadID]; }
void init();
void exit();
- void init_hash_tables();
bool use_sleeping_threads() const { return useSleepingThreads; }
int min_split_depth() const { return minimumSplitDepth; }
void read_uci_options();
bool available_slave_exists(int master) const;
+ void getline(std::string& cmd);
+ void start_listener();
+ void stop_listener();
+ void set_timer(int msec);
+
template <bool Fake>
Value split(Position& pos, SearchStack* ss, Value alpha, Value beta, Value bestValue,
Depth depth, Move threatMove, int moveCount, MovePicker* mp, int nodeType);
private:
- Thread threads[MAX_THREADS];
+ friend struct Thread;
+
+ Thread threads[MAX_THREADS + 2]; // Last 2 are the listener and the timer
Lock threadsLock;
Depth minimumSplitDepth;
int maxThreadsPerSplitPoint;
int activeThreads;
bool useSleepingThreads;
+ WaitCondition sleepCond;
+ std::string inputLine;
};
extern ThreadsManager Threads;