This source file includes following definitions.
- THREADP
- CHECK_THREAD
- XTHREAD
- MUTEXP
- CHECK_MUTEX
- XMUTEX
- CONDVARP
- CHECK_CONDVAR
- XCONDVAR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #ifndef THREAD_H
20 #define THREAD_H
21
22 #include "regex-emacs.h"
23
24 #ifdef WINDOWSNT
25 #include <sys/socket.h>
26 #endif
27
28 #ifdef MSDOS
29 #include <time.h>
30 #include <signal.h>
31 #endif
32
33 #include "sysselect.h"
34 #include "systhread.h"
35
36
37
38
39 #ifdef HAVE___BUILTIN_FRAME_ADDRESS
40 # define NEAR_STACK_TOP(addr) ((void) (addr), __builtin_frame_address (0))
41 #else
42 # define NEAR_STACK_TOP(addr) (addr)
43 #endif
44
45 INLINE_HEADER_BEGIN
46
47
48 struct bc_thread_state {
49 struct bc_frame *fp;
50
51
52 char *stack;
53 char *stack_end;
54 };
55
56 struct thread_state
57 {
58 union vectorlike_header header;
59
60
61
62
63 Lisp_Object m_last_thing_searched;
64 #define last_thing_searched (current_thread->m_last_thing_searched)
65
66 Lisp_Object m_saved_last_thing_searched;
67 #define saved_last_thing_searched (current_thread->m_saved_last_thing_searched)
68
69
70 Lisp_Object name;
71
72
73 Lisp_Object function;
74
75
76 Lisp_Object result;
77
78
79 Lisp_Object error_symbol;
80 Lisp_Object error_data;
81
82
83
84 Lisp_Object event_object;
85
86
87
88
89 char const *m_stack_bottom;
90 #define stack_bottom (current_thread->m_stack_bottom)
91
92
93
94
95
96
97
98
99 void const *stack_top;
100
101 struct catchtag *m_catchlist;
102 #define catchlist (current_thread->m_catchlist)
103
104
105
106
107
108
109 struct handler *m_handlerlist;
110 #define handlerlist (current_thread->m_handlerlist)
111
112 struct handler *m_handlerlist_sentinel;
113 #define handlerlist_sentinel (current_thread->m_handlerlist_sentinel)
114
115
116 union specbinding *m_specpdl;
117 #define specpdl (current_thread->m_specpdl)
118
119
120 union specbinding *m_specpdl_end;
121 #define specpdl_end (current_thread->m_specpdl_end)
122
123
124 union specbinding *m_specpdl_ptr;
125 #define specpdl_ptr (current_thread->m_specpdl_ptr)
126
127
128 intmax_t m_lisp_eval_depth;
129 #define lisp_eval_depth (current_thread->m_lisp_eval_depth)
130
131
132 struct buffer *m_current_buffer;
133 #define current_buffer (current_thread->m_current_buffer)
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152 struct re_registers m_search_regs;
153 #define search_regs (current_thread->m_search_regs)
154
155 struct re_registers m_saved_search_regs;
156 #define saved_search_regs (current_thread->m_saved_search_regs)
157
158
159
160
161
162
163
164
165
166 int m_waiting_for_user_input_p;
167 #define waiting_for_user_input_p (current_thread->m_waiting_for_user_input_p)
168
169
170 bool m_waiting_for_input;
171 #define waiting_for_input (current_thread->m_waiting_for_input)
172
173
174
175
176
177 sys_jmp_buf m_getcjmp;
178 #define getcjmp (current_thread->m_getcjmp)
179
180
181 sys_thread_t thread_id;
182
183
184
185 sys_cond_t thread_condvar;
186
187
188
189
190 sys_cond_t *wait_condvar;
191
192
193 char *thread_name;
194
195
196
197
198
199
200 int not_holding_lock;
201
202
203 struct thread_state *next_thread;
204
205 struct bc_thread_state bc;
206 } GCALIGNED_STRUCT;
207
208 INLINE bool
209 THREADP (Lisp_Object a)
210 {
211 return PSEUDOVECTORP (a, PVEC_THREAD);
212 }
213
214 INLINE void
215 CHECK_THREAD (Lisp_Object x)
216 {
217 CHECK_TYPE (THREADP (x), Qthreadp, x);
218 }
219
220 INLINE struct thread_state *
221 XTHREAD (Lisp_Object a)
222 {
223 eassert (THREADP (a));
224 return XUNTAG (a, Lisp_Vectorlike, struct thread_state);
225 }
226
227
228
229
230
231
232
233 typedef struct
234 {
235
236 struct thread_state *owner;
237
238 unsigned int count;
239
240 sys_cond_t condition;
241 } lisp_mutex_t;
242
243
244 struct Lisp_Mutex
245 {
246 union vectorlike_header header;
247
248
249 Lisp_Object name;
250
251
252 lisp_mutex_t mutex;
253 } GCALIGNED_STRUCT;
254
255 INLINE bool
256 MUTEXP (Lisp_Object a)
257 {
258 return PSEUDOVECTORP (a, PVEC_MUTEX);
259 }
260
261 INLINE void
262 CHECK_MUTEX (Lisp_Object x)
263 {
264 CHECK_TYPE (MUTEXP (x), Qmutexp, x);
265 }
266
267 INLINE struct Lisp_Mutex *
268 XMUTEX (Lisp_Object a)
269 {
270 eassert (MUTEXP (a));
271 return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Mutex);
272 }
273
274
275 struct Lisp_CondVar
276 {
277 union vectorlike_header header;
278
279
280 Lisp_Object mutex;
281
282
283 Lisp_Object name;
284
285
286 sys_cond_t cond;
287 } GCALIGNED_STRUCT;
288
289 INLINE bool
290 CONDVARP (Lisp_Object a)
291 {
292 return PSEUDOVECTORP (a, PVEC_CONDVAR);
293 }
294
295 INLINE void
296 CHECK_CONDVAR (Lisp_Object x)
297 {
298 CHECK_TYPE (CONDVARP (x), Qcondition_variable_p, x);
299 }
300
301 INLINE struct Lisp_CondVar *
302 XCONDVAR (Lisp_Object a)
303 {
304 eassert (CONDVARP (a));
305 return XUNTAG (a, Lisp_Vectorlike, struct Lisp_CondVar);
306 }
307
308 extern struct thread_state *current_thread;
309
310 extern void finalize_one_thread (struct thread_state *state);
311 extern void finalize_one_mutex (struct Lisp_Mutex *);
312 extern void finalize_one_condvar (struct Lisp_CondVar *);
313 extern void maybe_reacquire_global_lock (void);
314
315 extern void init_threads (void);
316 extern void syms_of_threads (void);
317 extern bool main_thread_p (const void *);
318 extern bool in_current_thread (void);
319
320 typedef int select_func (int, fd_set *, fd_set *, fd_set *,
321 const struct timespec *, const sigset_t *);
322
323 int thread_select (select_func *func, int max_fds, fd_set *rfds,
324 fd_set *wfds, fd_set *efds, struct timespec *timeout,
325 sigset_t *sigmask);
326
327 bool thread_check_current_buffer (struct buffer *);
328
329 INLINE_HEADER_END
330
331 #endif