henesyinit from p9f0ed2a895 years agoHistory
102 lines · 2.2 KB · C
RawDownload
#include "thread.h" typedef enum {	Running,	Runnable,	Rendezvous,} State;	typedef enum {	Callnil,	Callalt,	Callsnd,	Callrcv,} Callstate; enum {	DOEXEC = 1,	DOEXIT = 2,	DOPROC = 3,}; struct Tqueue {		// Thread queue	Lock	lock;	Thread	*head;	Thread	*tail;}; struct Thread {	Lock		lock;		// protects thread data structure	int			id;		// thread id	int 		grp;		// thread group	State		state;		// state of thread	int			exiting;	// should it die?	Callstate	call;		// which `system call' is current	char		*cmdname;	// ptr to name of thread	Thread		*next;		// next on queue (run, rendezvous)	Thread		*nextt;		// next on list of all theads	Proc		*proc;		// proc of this thread	ulong		tag;		// rendez-vous tag	Alt			*alt;		// pointer to alt structure	ulong		value;		// rendez-vous value	Thread		*garbage;	// ptr to thread to clean up	jmp_buf		env;		// jump buf for launching or switching threads	uchar		*stk;		// top of stack (lowest address of stack)	uint		stksize;	// stack size 	ulong	udata;			// User per-thread data pointer}; struct Proc {	Lock	lock;	int	pid; 	jmp_buf	oldenv;			// jump buf for returning to original stack 	int	nthreads;	Tqueue	threads;		// All threads of this proc	Tqueue	runnable;		// Runnable threads	Thread	*curthread;		// Running thread 	int	blocked;		// In a rendezvous	uint	nextID;			// ID of most recently created thread	Proc	*next;			// linked list of Procs 	void	*arg;			// passed between shared and unshared stk	char	str[ERRLEN];	// used by threadexits to avoid malloc 	ulong	udata;			// User per-proc data pointer}; typedef struct Newproc {	uchar	*stack;	uint	stacksize;	ulong	*stackptr;	ulong	launcher;	int		grp;	int		rforkflag;} Newproc; typedef struct Execproc {	Proc	*procp;	char	*file;	char	**arg;	char	data[4096];} Execproc; struct Pqueue {		// Proc queue	Lock	lock;	Proc	*head;	Proc	*tail;}; extern struct Pqueue pq;	// Linked list of procsextern Proc **procp;		// Pointer to pointer to proc's Proc structure int		tas(int*);int		inc(int*, int);int		cas(Lock *lock, Lock old, Lock new);ulong	_threadrendezvous(ulong, ulong);void	*_threadmalloc(long size);void	_xinc(long*);long	_xdec(long*);