b476d529f4d3a1455e662958a8190a6094178870
[stockfish] / src / thread.h
1 /*
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
5
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.
10
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.
15
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/>.
18 */
19
20 #if !defined(THREAD_H_INCLUDED)
21 #define THREAD_H_INCLUDED
22
23 #include <cstring>
24
25 #include "lock.h"
26 #include "movepick.h"
27 #include "position.h"
28 #include "search.h"
29
30 const int MAX_THREADS = 32;
31 const int MAX_ACTIVE_SPLIT_POINTS = 8;
32
33 struct SplitPoint {
34
35   // Const data after splitPoint has been setup
36   SplitPoint* parent;
37   const Position* pos;
38   Depth depth;
39   bool pvNode;
40   Value beta;
41   int ply;
42   int master;
43   Move threatMove;
44
45   // Const pointers to shared data
46   MovePicker* mp;
47   SearchStack* ss;
48
49   // Shared data
50   Lock lock;
51   volatile int64_t nodes;
52   volatile Value alpha;
53   volatile Value bestValue;
54   volatile int moveCount;
55   volatile bool betaCutoff;
56   volatile int slaves[MAX_THREADS];
57 };
58
59 // ThreadState type is used to represent thread's current state
60 enum ThreadState
61 {
62   THREAD_INITIALIZING,  // thread is initializing itself
63   THREAD_SEARCHING,     // thread is performing work
64   THREAD_AVAILABLE,     // thread is waiting for work
65   THREAD_BOOKED,        // other thread (master) has booked us as a slave
66   THREAD_WORKISWAITING, // master has ordered us to start
67   THREAD_TERMINATED     // we are quitting and thread is terminated
68 };
69
70 struct Thread {
71   int maxPly;
72   Lock sleepLock;
73   WaitCondition sleepCond;
74   volatile ThreadState state;
75   SplitPoint* volatile splitPoint;
76   volatile int activeSplitPoints;
77   SplitPoint splitPoints[MAX_ACTIVE_SPLIT_POINTS];
78
79   void wake_up() {
80     lock_grab(&sleepLock);
81     cond_signal(&sleepCond);
82     lock_release(&sleepLock);
83   }
84 };
85
86 #endif // !defined(THREAD_H_INCLUDED)