2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4 Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
6 Stockfish is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 Stockfish is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #if !defined(THREAD_H_INCLUDED)
21 #define THREAD_H_INCLUDED
31 const int MAX_THREADS = 32;
32 const int MAX_ACTIVE_SPLIT_POINTS = 8;
36 // Const data after splitPoint has been setup
46 // Const pointers to shared data
52 volatile int64_t nodes;
54 volatile Value bestValue;
55 volatile int moveCount;
56 volatile bool is_betaCutoff;
57 volatile bool is_slave[MAX_THREADS];
61 /// Thread struct is used to keep together all the thread related stuff like locks,
62 /// state and especially split points. We also use per-thread pawn and material hash
63 /// tables so that once we get a pointer to an entry its life time is unlimited and
64 /// we don't have to care about someone changing the entry under our feet.
70 INITIALIZING, // Thread is initializing itself
71 SEARCHING, // Thread is performing work
72 AVAILABLE, // Thread is waiting for work
73 BOOKED, // Other thread (master) has booked us as a slave
74 WORKISWAITING, // Master has ordered us to start
75 TERMINATED // We are quitting and thread is terminated
79 bool cutoff_occurred() const;
80 bool is_available_to(int master) const;
82 MaterialInfoTable materialTable;
83 PawnInfoTable pawnTable;
86 WaitCondition sleepCond;
87 volatile ThreadState state;
88 SplitPoint* volatile splitPoint;
89 volatile int activeSplitPoints;
90 SplitPoint splitPoints[MAX_ACTIVE_SPLIT_POINTS];
94 /// ThreadsManager class is used to handle all the threads related stuff like init,
95 /// starting, parking and, the most important, launching a slave thread at a split
96 /// point. All the access to shared thread data is done through this class.
98 class ThreadsManager {
99 /* As long as the single ThreadsManager object is defined as a global we don't
100 need to explicitly initialize to zero its data members because variables with
101 static storage duration are automatically set to zero before enter main()
104 Thread& operator[](int threadID) { return threads[threadID]; }
107 void init_hash_tables();
109 int min_split_depth() const { return minimumSplitDepth; }
110 int size() const { return activeThreads; }
111 void set_size(int cnt) { activeThreads = cnt; }
113 void read_uci_options();
114 bool available_slave_exists(int master) const;
115 void idle_loop(int threadID, SplitPoint* sp);
118 void split(Position& pos, SearchStack* ss, Value* alpha, const Value beta, Value* bestValue,
119 Depth depth, Move threatMove, int moveCount, MovePicker* mp, bool pvNode);
122 Depth minimumSplitDepth;
123 int maxThreadsPerSplitPoint;
124 bool useSleepingThreads;
126 volatile bool allThreadsShouldExit;
127 Thread threads[MAX_THREADS];
130 extern ThreadsManager Threads;
132 #endif // !defined(THREAD_H_INCLUDED)