xref: /plan9/sys/src/libthread/threadimpl.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "thread.h"
2*7dd7cddfSDavid du Colombier 
3*7dd7cddfSDavid du Colombier typedef enum {
4*7dd7cddfSDavid du Colombier 	Running,
5*7dd7cddfSDavid du Colombier 	Runnable,
6*7dd7cddfSDavid du Colombier 	Rendezvous,
7*7dd7cddfSDavid du Colombier } State;
8*7dd7cddfSDavid du Colombier 
9*7dd7cddfSDavid du Colombier typedef enum {
10*7dd7cddfSDavid du Colombier 	Callnil,
11*7dd7cddfSDavid du Colombier 	Callalt,
12*7dd7cddfSDavid du Colombier 	Callsnd,
13*7dd7cddfSDavid du Colombier 	Callrcv,
14*7dd7cddfSDavid du Colombier } Callstate;
15*7dd7cddfSDavid du Colombier 
16*7dd7cddfSDavid du Colombier enum {
17*7dd7cddfSDavid du Colombier 	DOEXEC = 1,
18*7dd7cddfSDavid du Colombier 	DOEXIT = 2,
19*7dd7cddfSDavid du Colombier 	DOPROC = 3,
20*7dd7cddfSDavid du Colombier };
21*7dd7cddfSDavid du Colombier 
22*7dd7cddfSDavid du Colombier struct Tqueue {		// Thread queue
23*7dd7cddfSDavid du Colombier 	Lock	lock;
24*7dd7cddfSDavid du Colombier 	Thread	*head;
25*7dd7cddfSDavid du Colombier 	Thread	*tail;
26*7dd7cddfSDavid du Colombier };
27*7dd7cddfSDavid du Colombier 
28*7dd7cddfSDavid du Colombier struct Thread {
29*7dd7cddfSDavid du Colombier 	Lock		lock;		// protects thread data structure
30*7dd7cddfSDavid du Colombier 	int		id;		// thread id
31*7dd7cddfSDavid du Colombier 	int 		grp;		// thread group
32*7dd7cddfSDavid du Colombier 	State		state;		// state of thread
33*7dd7cddfSDavid du Colombier 	int		exiting;	// shouls it die?
34*7dd7cddfSDavid du Colombier 	Callstate	call;		// which `system call' is current
35*7dd7cddfSDavid du Colombier 	char		*cmdname;	// ptr to name of thread
36*7dd7cddfSDavid du Colombier 	Thread		*next;		// next on queue (run, rendezvous)
37*7dd7cddfSDavid du Colombier 	Thread		*nextt;		// next on list of all theads
38*7dd7cddfSDavid du Colombier 	Proc		*proc;		// proc of this thread
39*7dd7cddfSDavid du Colombier 	ulong		tag;		// rendez-vous tag
40*7dd7cddfSDavid du Colombier 	Alt		*alt;		// pointer to alt structure
41*7dd7cddfSDavid du Colombier 	ulong		value;		// rendez-vous value
42*7dd7cddfSDavid du Colombier 	jmp_buf		env;		// jump buf for launching or switching threads
43*7dd7cddfSDavid du Colombier 	uchar		*stk;		// top of stack (lowest address of stack)
44*7dd7cddfSDavid du Colombier 	uint		stksize;	// stack size
45*7dd7cddfSDavid du Colombier };
46*7dd7cddfSDavid du Colombier 
47*7dd7cddfSDavid du Colombier struct Proc {
48*7dd7cddfSDavid du Colombier 	Lock	lock;
49*7dd7cddfSDavid du Colombier 	int	pid;
50*7dd7cddfSDavid du Colombier 
51*7dd7cddfSDavid du Colombier 	jmp_buf	oldenv;			// jump buf for returning to original stack
52*7dd7cddfSDavid du Colombier 
53*7dd7cddfSDavid du Colombier 	int	nthreads;
54*7dd7cddfSDavid du Colombier 	Tqueue	threads;		// All threads of this proc
55*7dd7cddfSDavid du Colombier 	Tqueue	runnable;		// Runnable threads
56*7dd7cddfSDavid du Colombier 	Thread	*curthread;		// Running thread
57*7dd7cddfSDavid du Colombier 
58*7dd7cddfSDavid du Colombier 	int	blocked;		// In a rendezvous
59*7dd7cddfSDavid du Colombier 	uint	nextID;			// ID of most recently created thread
60*7dd7cddfSDavid du Colombier 	Proc	*next;			// linked list of Procs
61*7dd7cddfSDavid du Colombier 
62*7dd7cddfSDavid du Colombier 	void	*arg;			// passed between shared and unshared stk
63*7dd7cddfSDavid du Colombier 
64*7dd7cddfSDavid du Colombier 	ulong	udata;			// User per-proc data pointer
65*7dd7cddfSDavid du Colombier };
66*7dd7cddfSDavid du Colombier 
67*7dd7cddfSDavid du Colombier typedef struct Newproc {
68*7dd7cddfSDavid du Colombier 	uchar	*stack;
69*7dd7cddfSDavid du Colombier 	uint	stacksize;
70*7dd7cddfSDavid du Colombier 	ulong	*stackptr;
71*7dd7cddfSDavid du Colombier 	ulong	launcher;
72*7dd7cddfSDavid du Colombier 	int		grp;
73*7dd7cddfSDavid du Colombier } Newproc;
74*7dd7cddfSDavid du Colombier 
75*7dd7cddfSDavid du Colombier typedef struct Execproc {
76*7dd7cddfSDavid du Colombier 	char *file;
77*7dd7cddfSDavid du Colombier 	void **arg;
78*7dd7cddfSDavid du Colombier } Execproc;
79*7dd7cddfSDavid du Colombier 
80*7dd7cddfSDavid du Colombier struct Pqueue {		// Proc queue
81*7dd7cddfSDavid du Colombier 	Lock	lock;
82*7dd7cddfSDavid du Colombier 	Proc	*head;
83*7dd7cddfSDavid du Colombier 	Proc	*tail;
84*7dd7cddfSDavid du Colombier };
85*7dd7cddfSDavid du Colombier 
86*7dd7cddfSDavid du Colombier extern struct Pqueue pq;	// Linked list of procs
87*7dd7cddfSDavid du Colombier extern Proc **procp;		// Pointer to pointer to proc's Proc structure
88*7dd7cddfSDavid du Colombier 
89*7dd7cddfSDavid du Colombier int		tas(int*);
90*7dd7cddfSDavid du Colombier int		inc(int*, int);
91*7dd7cddfSDavid du Colombier int		cas(Lock *lock, Lock old, Lock new);
92*7dd7cddfSDavid du Colombier ulong	threadrendezvous(ulong, ulong);
93*7dd7cddfSDavid du Colombier void	*_threadmalloc(long size);
94*7dd7cddfSDavid du Colombier 
95*7dd7cddfSDavid du Colombier void _xinc(long *);
96*7dd7cddfSDavid du Colombier long _xdec(long *);
97