This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change pp_tie and pp_dbmopen to use perl_call_sv instead of a
[perl5.git] / thread.h
CommitLineData
ea0efc06 1#ifdef USE_THREADS
12ca11f6 2
ea0efc06
MB
3#ifdef WIN32
4# include "win32/win32thread.h"
5#endif
12ca11f6 6
12ca11f6
MB
7/* POSIXish threads */
8typedef pthread_t perl_thread;
11343788 9#ifdef OLD_PTHREADS_API
ea0efc06
MB
10# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
11# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
12# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
13# define YIELD pthread_yield()
14# define DETACH(t) \
15 STMT_START { \
46930d8f 16 if (pthread_detach(&(t)->self)) { \
ea0efc06
MB
17 MUTEX_UNLOCK(&(t)->mutex); \
18 croak("panic: DETACH"); \
19 } \
20 } STMT_END
11343788 21#else
ea0efc06
MB
22# define pthread_mutexattr_default NULL
23# define pthread_condattr_default NULL
24# define pthread_attr_default NULL
11343788
MB
25#endif /* OLD_PTHREADS_API */
26
ea0efc06
MB
27#ifndef YIELD
28# define YIELD sched_yield()
29#endif
30
31#ifndef MUTEX_INIT
32#define MUTEX_INIT(m) \
33 STMT_START { \
34 if (pthread_mutex_init((m), pthread_mutexattr_default)) \
35 croak("panic: MUTEX_INIT"); \
36 } STMT_END
37#define MUTEX_LOCK(m) \
38 STMT_START { \
39 if (pthread_mutex_lock((m))) \
40 croak("panic: MUTEX_LOCK"); \
41 } STMT_END
42#define MUTEX_UNLOCK(m) \
43 STMT_START { \
44 if (pthread_mutex_unlock((m))) \
45 croak("panic: MUTEX_UNLOCK"); \
46 } STMT_END
47#define MUTEX_DESTROY(m) \
48 STMT_START { \
49 if (pthread_mutex_destroy((m))) \
50 croak("panic: MUTEX_DESTROY"); \
51 } STMT_END
52#endif /* MUTEX_INIT */
53
54#ifndef COND_INIT
55#define COND_INIT(c) \
56 STMT_START { \
57 if (pthread_cond_init((c), pthread_condattr_default)) \
58 croak("panic: COND_INIT"); \
59 } STMT_END
60#define COND_SIGNAL(c) \
61 STMT_START { \
62 if (pthread_cond_signal((c))) \
63 croak("panic: COND_SIGNAL"); \
64 } STMT_END
65#define COND_BROADCAST(c) \
66 STMT_START { \
67 if (pthread_cond_broadcast((c))) \
68 croak("panic: COND_BROADCAST"); \
69 } STMT_END
70#define COND_WAIT(c, m) \
71 STMT_START { \
72 if (pthread_cond_wait((c), (m))) \
73 croak("panic: COND_WAIT"); \
74 } STMT_END
75#define COND_DESTROY(c) \
76 STMT_START { \
77 if (pthread_cond_destroy((c))) \
78 croak("panic: COND_DESTROY"); \
79 } STMT_END
80#endif /* COND_INIT */
33f46ff6 81
f826a10b 82/* DETACH(t) must only be called while holding t->mutex */
ea0efc06
MB
83#ifndef DETACH
84#define DETACH(t) \
85 STMT_START { \
46930d8f 86 if (pthread_detach((t)->self)) { \
ea0efc06
MB
87 MUTEX_UNLOCK(&(t)->mutex); \
88 croak("panic: DETACH"); \
89 } \
90 } STMT_END
91#endif /* DETACH */
33f46ff6 92
ea0efc06
MB
93#ifndef JOIN
94#define JOIN(t, avp) \
95 STMT_START { \
46930d8f 96 if (pthread_join((t)->self, (void**)(avp))) \
ea0efc06
MB
97 croak("panic: pthread_join"); \
98 } STMT_END
99#endif /* JOIN */
100
101#ifndef SET_THR
102#define SET_THR(t) \
103 STMT_START { \
104 if (pthread_setspecific(thr_key, (void *) (t))) \
105 croak("panic: pthread_setspecific"); \
106 } STMT_END
107#endif /* SET_THR */
108
109#ifndef THR
110# ifdef OLD_PTHREADS_API
11343788 111struct thread *getTHR _((void));
ea0efc06
MB
112# define THR getTHR()
113# else
114# define THR ((struct thread *) pthread_getspecific(thr_key))
115# endif /* OLD_PTHREADS_API */
116#endif /* THR */
117
118#ifndef dTHR
119# define dTHR struct thread *thr = THR
120#endif /* dTHR */
11343788 121
33f46ff6
MB
122#ifndef INIT_THREADS
123# ifdef NEED_PTHREAD_INIT
124# define INIT_THREADS pthread_init()
125# else
126# define INIT_THREADS NOOP
127# endif
128#endif
11343788 129
ea0efc06
MB
130#ifndef THREAD_RET_TYPE
131# define THREAD_RET_TYPE void *
132# define THREAD_RET_CAST(p) ((void *)(p))
133#endif /* THREAD_RET */
134
33f46ff6 135struct thread {
11343788 136 /* The fields that used to be global */
33f46ff6 137 /* Important ones in the first cache line (if alignment is done right) */
11343788 138 SV ** Tstack_sp;
462e5cf6
MB
139#ifdef OP_IN_REGISTER
140 OP * Topsave;
141#else
11343788 142 OP * Top;
462e5cf6 143#endif
33f46ff6
MB
144 SV ** Tcurpad;
145 SV ** Tstack_base;
146
147 SV ** Tstack_max;
11343788
MB
148
149 I32 * Tscopestack;
150 I32 Tscopestack_ix;
151 I32 Tscopestack_max;
152
153 ANY * Tsavestack;
154 I32 Tsavestack_ix;
155 I32 Tsavestack_max;
156
157 OP ** Tretstack;
158 I32 Tretstack_ix;
159 I32 Tretstack_max;
160
161 I32 * Tmarkstack;
162 I32 * Tmarkstack_ptr;
163 I32 * Tmarkstack_max;
164
11343788
MB
165 SV * TSv;
166 XPV * TXpv;
11343788
MB
167 struct stat Tstatbuf;
168 struct tms Ttimesbuf;
169
170 /* XXX What about regexp stuff? */
171
172 /* Now the fields that used to be "per interpreter" (even when global) */
173
a863c7d1
MB
174 /* Fields used by magic variables such as $@, $/ and so on */
175 bool Ttainted;
176 PMOP * Tcurpm;
177 SV * Tnrs;
178 SV * Trs;
179 GV * Tlast_in_gv;
180 char * Tofs;
181 STRLEN Tofslen;
182 GV * Tdefoutgv;
183 char * Tchopset;
184 SV * Tformtarget;
185 SV * Tbodytarget;
186 SV * Ttoptarget;
187
188 /* Stashes */
11343788
MB
189 HV * Tdefstash;
190 HV * Tcurstash;
11343788 191
a863c7d1 192 /* Stacks */
11343788
MB
193 SV ** Ttmps_stack;
194 I32 Ttmps_ix;
195 I32 Ttmps_floor;
196 I32 Ttmps_max;
197
198 int Tin_eval;
199 OP * Trestartop;
200 int Tdelaymagic;
201 bool Tdirty;
202 U8 Tlocalizing;
0f15f207 203 COP * Tcurcop;
11343788
MB
204
205 CONTEXT * Tcxstack;
206 I32 Tcxstack_ix;
207 I32 Tcxstack_max;
208
0f15f207 209 AV * Tcurstack;
11343788 210 AV * Tmainstack;
e858de61 211 JMPENV * Ttop_env;
11343788
MB
212 I32 Trunlevel;
213
214 /* XXX Sort stuff, firstgv, secongv and so on? */
215
199100c8
MB
216 SV * oursv;
217 HV * cvcache;
46930d8f 218 perl_thread self; /* Underlying thread object */
33f46ff6 219 U32 flags;
554b3eca
MB
220 AV * magicals; /* Per-thread magicals */
221 AV * specific; /* Thread-specific user data */
f826a10b 222 perl_mutex mutex; /* For the fields others can change */
33f46ff6
MB
223 U32 tid;
224 struct thread *next, *prev; /* Circular linked list of threads */
12ca11f6 225
f826a10b
MB
226#ifdef ADD_THREAD_INTERN
227 struct thread_intern i; /* Platform-dependent internals */
228#endif
199100c8 229 char trailing_nul; /* For the sake of thrsv and oursv */
11343788
MB
230};
231
232typedef struct thread *Thread;
233
33f46ff6 234/* Values and macros for thr->flags */
605e5515
MB
235#define THRf_STATE_MASK 7
236#define THRf_R_JOINABLE 0
237#define THRf_R_JOINED 1
238#define THRf_R_DETACHED 2
239#define THRf_ZOMBIE 3
240#define THRf_DEAD 4
f93b4edd 241
605e5515 242#define THRf_DIE_FATAL 8
07b73707 243
f826a10b 244/* ThrSTATE(t) and ThrSETSTATE(t) must only be called while holding t->mutex */
605e5515 245#define ThrSTATE(t) ((t)->flags)
f93b4edd 246#define ThrSETSTATE(t, s) STMT_START { \
605e5515 247 (t)->flags &= ~THRf_STATE_MASK; \
33f46ff6 248 (t)->flags |= (s); \
605e5515
MB
249 DEBUG_L(PerlIO_printf(PerlIO_stderr(), \
250 "thread %p set to state %d\n", (t), (s))); \
f93b4edd
MB
251 } STMT_END
252
253typedef struct condpair {
f826a10b
MB
254 perl_mutex mutex; /* Protects all other fields */
255 perl_cond owner_cond; /* For when owner changes at all */
256 perl_cond cond; /* For cond_signal and cond_broadcast */
257 Thread owner; /* Currently owning thread */
f93b4edd
MB
258} condpair_t;
259
260#define MgMUTEXP(mg) (&((condpair_t *)(mg->mg_ptr))->mutex)
261#define MgOWNERCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->owner_cond)
262#define MgCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->cond)
263#define MgOWNER(mg) ((condpair_t *)(mg->mg_ptr))->owner
264
11343788
MB
265#undef stack_base
266#undef stack_sp
267#undef stack_max
0f15f207 268#undef curstack
11343788
MB
269#undef mainstack
270#undef markstack
271#undef markstack_ptr
272#undef markstack_max
273#undef scopestack
274#undef scopestack_ix
275#undef scopestack_max
276#undef savestack
277#undef savestack_ix
278#undef savestack_max
279#undef retstack
280#undef retstack_ix
281#undef retstack_max
0f15f207 282#undef curcop
11343788
MB
283#undef cxstack
284#undef cxstack_ix
285#undef cxstack_max
809a5acc
MB
286#undef defstash
287#undef curstash
6d4ff0d2
MB
288#undef tmps_stack
289#undef tmps_floor
290#undef tmps_ix
291#undef tmps_max
11343788
MB
292#undef curpad
293#undef Sv
294#undef Xpv
96827780
MB
295#undef statbuf
296#undef timesbuf
a863c7d1
MB
297#undef tainted
298#undef curpm
299#undef nrs
300#undef rs
301#undef last_in_gv
302#undef ofs
303#undef ofslen
304#undef defoutgv
305#undef chopset
306#undef formtarget
307#undef bodytarget
308#undef toptarget
11343788
MB
309#undef top_env
310#undef runlevel
311#undef in_eval
809a5acc
MB
312#undef restartop
313#undef delaymagic
314#undef dirty
315#undef localizing
11343788 316
11343788
MB
317#define stack_base (thr->Tstack_base)
318#define stack_sp (thr->Tstack_sp)
319#define stack_max (thr->Tstack_max)
462e5cf6
MB
320#ifdef OP_IN_REGISTER
321#define opsave (thr->Topsave)
322#else
323#undef op
11343788 324#define op (thr->Top)
462e5cf6 325#endif
0f15f207 326#define curcop (thr->Tcurcop)
11343788 327#define stack (thr->Tstack)
809a5acc 328#define curstack (thr->Tcurstack)
11343788
MB
329#define mainstack (thr->Tmainstack)
330#define markstack (thr->Tmarkstack)
331#define markstack_ptr (thr->Tmarkstack_ptr)
332#define markstack_max (thr->Tmarkstack_max)
333#define scopestack (thr->Tscopestack)
334#define scopestack_ix (thr->Tscopestack_ix)
335#define scopestack_max (thr->Tscopestack_max)
336
337#define savestack (thr->Tsavestack)
338#define savestack_ix (thr->Tsavestack_ix)
339#define savestack_max (thr->Tsavestack_max)
340
341#define retstack (thr->Tretstack)
342#define retstack_ix (thr->Tretstack_ix)
343#define retstack_max (thr->Tretstack_max)
344
345#define cxstack (thr->Tcxstack)
346#define cxstack_ix (thr->Tcxstack_ix)
347#define cxstack_max (thr->Tcxstack_max)
348
349#define curpad (thr->Tcurpad)
350#define Sv (thr->TSv)
351#define Xpv (thr->TXpv)
96827780
MB
352#define statbuf (thr->Tstatbuf)
353#define timesbuf (thr->Ttimesbuf)
a863c7d1
MB
354#define tainted (thr->Ttainted)
355#define tainted (thr->Ttainted)
356#define curpm (thr->Tcurpm)
357#define nrs (thr->Tnrs)
358#define rs (thr->Trs)
359#define last_in_gv (thr->Tlast_in_gv)
360#define ofs (thr->Tofs)
57d3b86d 361#define ofslen (thr->Tofslen)
a863c7d1
MB
362#define defoutgv (thr->Tdefoutgv)
363#define chopset (thr->Tchopset)
364#define formtarget (thr->Tformtarget)
365#define bodytarget (thr->Tbodytarget)
366#define toptarget (thr->Ttoptarget)
11343788
MB
367#define defstash (thr->Tdefstash)
368#define curstash (thr->Tcurstash)
11343788
MB
369
370#define tmps_stack (thr->Ttmps_stack)
371#define tmps_ix (thr->Ttmps_ix)
372#define tmps_floor (thr->Ttmps_floor)
373#define tmps_max (thr->Ttmps_max)
374
375#define in_eval (thr->Tin_eval)
376#define restartop (thr->Trestartop)
377#define delaymagic (thr->Tdelaymagic)
378#define dirty (thr->Tdirty)
379#define localizing (thr->Tlocalizing)
380
381#define top_env (thr->Ttop_env)
382#define runlevel (thr->Trunlevel)
383
ea0efc06
MB
384#else
385/* USE_THREADS is not defined */
386#define MUTEX_LOCK(m)
387#define MUTEX_UNLOCK(m)
388#define MUTEX_INIT(m)
389#define MUTEX_DESTROY(m)
390#define COND_INIT(c)
391#define COND_SIGNAL(c)
392#define COND_BROADCAST(c)
393#define COND_WAIT(c, m)
394#define COND_DESTROY(c)
395
396#define THR
397/* Rats: if dTHR is just blank then the subsequent ";" throws an error */
398#define dTHR extern int errno
11343788 399#endif /* USE_THREADS */