struct Thread {
- enum ThreadState
- {
- INITIALIZING, // Thread is initializing itself
- SEARCHING, // Thread is performing work
- AVAILABLE, // Thread is waiting for work
- BOOKED, // Other thread (master) has booked us as a slave
- WORKISWAITING, // Master has ordered us to start
- 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);
SplitPoint splitPoints[MAX_ACTIVE_SPLIT_POINTS];
MaterialInfoTable materialTable;
PawnInfoTable pawnTable;
+ int threadID;
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; }
int size() const { return activeThreads; }
- void set_size(int cnt) { activeThreads = cnt; }
+ void set_size(int cnt);
void read_uci_options();
bool available_slave_exists(int master) const;
- void idle_loop(int threadID, SplitPoint* sp);
template <bool Fake>
- void split(Position& pos, SearchStack* ss, Value* alpha, const Value beta, Value* bestValue,
- Depth depth, Move threatMove, int moveCount, MovePicker* mp, int nodeType);
+ 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];
Lock threadsLock;
int maxThreadsPerSplitPoint;
int activeThreads;
bool useSleepingThreads;
- volatile bool allThreadsShouldExit;
};
extern ThreadsManager Threads;