xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/fakethr.h (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*    fakethr.h
2*0Sstevel@tonic-gate  *
3*0Sstevel@tonic-gate  *    Copyright (C) 1999, by Larry Wall and others
4*0Sstevel@tonic-gate  *
5*0Sstevel@tonic-gate  *    You may distribute under the terms of either the GNU General Public
6*0Sstevel@tonic-gate  *    License or the Artistic License, as specified in the README file.
7*0Sstevel@tonic-gate  *
8*0Sstevel@tonic-gate  */
9*0Sstevel@tonic-gate 
10*0Sstevel@tonic-gate typedef int perl_mutex;
11*0Sstevel@tonic-gate typedef int perl_key;
12*0Sstevel@tonic-gate 
13*0Sstevel@tonic-gate typedef struct perl_thread *perl_os_thread;
14*0Sstevel@tonic-gate /* With fake threads, thr is global(ish) so we don't need dTHR */
15*0Sstevel@tonic-gate #define dTHR extern int errno
16*0Sstevel@tonic-gate 
17*0Sstevel@tonic-gate struct perl_wait_queue {
18*0Sstevel@tonic-gate     struct perl_thread *	thread;
19*0Sstevel@tonic-gate     struct perl_wait_queue *	next;
20*0Sstevel@tonic-gate };
21*0Sstevel@tonic-gate typedef struct perl_wait_queue *perl_cond;
22*0Sstevel@tonic-gate 
23*0Sstevel@tonic-gate /* Ask thread.h to include our per-thread extras */
24*0Sstevel@tonic-gate #define HAVE_THREAD_INTERN
25*0Sstevel@tonic-gate struct thread_intern {
26*0Sstevel@tonic-gate     perl_os_thread next_run, prev_run;  /* Linked list of runnable threads */
27*0Sstevel@tonic-gate     perl_cond   wait_queue;             /* Wait queue that we are waiting on */
28*0Sstevel@tonic-gate     IV          private;                /* Holds data across time slices */
29*0Sstevel@tonic-gate     I32         savemark;               /* Holds MARK for thread join values */
30*0Sstevel@tonic-gate };
31*0Sstevel@tonic-gate 
32*0Sstevel@tonic-gate #define init_thread_intern(t) 				\
33*0Sstevel@tonic-gate     STMT_START {					\
34*0Sstevel@tonic-gate 	t->self = (t);					\
35*0Sstevel@tonic-gate 	(t)->i.next_run = (t)->i.prev_run = (t);	\
36*0Sstevel@tonic-gate 	(t)->i.wait_queue = 0;				\
37*0Sstevel@tonic-gate 	(t)->i.private = 0;				\
38*0Sstevel@tonic-gate     } STMT_END
39*0Sstevel@tonic-gate 
40*0Sstevel@tonic-gate /*
41*0Sstevel@tonic-gate  * Note that SCHEDULE() is only callable from pp code (which
42*0Sstevel@tonic-gate  * must be expecting to be restarted). We'll have to do
43*0Sstevel@tonic-gate  * something a bit different for XS code.
44*0Sstevel@tonic-gate  */
45*0Sstevel@tonic-gate 
46*0Sstevel@tonic-gate #define SCHEDULE() return schedule(), PL_op
47*0Sstevel@tonic-gate 
48*0Sstevel@tonic-gate #define MUTEX_LOCK(m)
49*0Sstevel@tonic-gate #define MUTEX_UNLOCK(m)
50*0Sstevel@tonic-gate #define MUTEX_INIT(m)
51*0Sstevel@tonic-gate #define MUTEX_DESTROY(m)
52*0Sstevel@tonic-gate #define COND_INIT(c) perl_cond_init(c)
53*0Sstevel@tonic-gate #define COND_SIGNAL(c) perl_cond_signal(c)
54*0Sstevel@tonic-gate #define COND_BROADCAST(c) perl_cond_broadcast(c)
55*0Sstevel@tonic-gate #define COND_WAIT(c, m)		\
56*0Sstevel@tonic-gate     STMT_START {		\
57*0Sstevel@tonic-gate 	perl_cond_wait(c);	\
58*0Sstevel@tonic-gate 	SCHEDULE();		\
59*0Sstevel@tonic-gate     } STMT_END
60*0Sstevel@tonic-gate #define COND_DESTROY(c)
61*0Sstevel@tonic-gate 
62*0Sstevel@tonic-gate #define THREAD_CREATE(t, f)	f((t))
63*0Sstevel@tonic-gate #define THREAD_POST_CREATE(t)	NOOP
64*0Sstevel@tonic-gate 
65*0Sstevel@tonic-gate #define YIELD	NOOP
66