henesyinit from p9f0ed2a895 years agoHistory
93 lines · 2.8 KB · C
RawDownload
#pragma src "/sys/src/libthread"#pragma lib "libthread.a" #pragma	varargck	argpos	threadprint	2 typedef struct Proc	Proc;typedef struct Thread	Thread;typedef struct Tqueue	Tqueue;typedef struct Alt	Alt;typedef struct Channel	Channel;typedef struct Ref	Ref; /* Channel structure.  S is the size of the buffer.  For unbuffered channels * s is zero.  v is an array of s values.  If s is zero, v is unused. * f and n represent the state of the queue pointed to by v. * rcvrs and sndrs must be initialized to nil and should not be touched * by code outside channel.c */ struct Channel {	int		s;			// Size of the channel (may be zero)	uint	f;			// Extraction point (insertion pt: (f + n) % s)	uint	n;			// Number of values in the channel	int		e;			// Element size	int		freed;		// Set when channel is being deleted	ulong	qused;		// Bitmap of used entries in rcvrs	Alt	*	qentry[32];	// Receivers/senders waiting	uchar	v[1];		// Array of max(1, s) values in the channel};  /* Channel operations for alt: */#define CHANEND		0#define CHANSND		1#define CHANRCV		2#define CHANNOP		3#define CHANNOBLK	4 struct Alt {	Channel	*c;		/* channel */	void	*v;		/* pointer to value */	int	op;		/* operation 0 == send, 1 == receive */ 	/* the next variables are used internally to alt	 * they need not be initialized	 */	Channel	**tag;	/* pointer to rendez-vous tag */	ulong	q;}; struct Ref {	long ref;}; int		alt(Alt alts[]);Channel*	chancreate(int elemsize, int bufsize);int		chaninit(Channel *c, int elemsize, int elemcnt);void		chanfree(Channel *c);long		decref(Ref *r);		/* returns 0 iff value is now zero */void		incref(Ref *r);int		nbrecv(Channel *c, void *v);void*		nbrecvp(Channel *c);ulong		nbrecvul(Channel *c);int		nbsend(Channel *c, void *v);int		nbsendp(Channel *c, void *v);int		nbsendul(Channel *c, ulong v);int		proccreate(void (*f)(void *arg), void *arg, uint stacksize);int		procrfork(void (*f)(void *arg), void *arg, uint stacksize, int flag);ulong *		procdata(void);void		procexec(Channel *, char *, char *[]);void		procexecl(Channel *, char *, ...);int		recv(Channel *c, void *v);void*		recvp(Channel *c);ulong		recvul(Channel *c);int		send(Channel *c, void *v);int		sendp(Channel *c, void *v);int		sendul(Channel *c, ulong v);int		threadcreate(void (*f)(void *arg), void *arg, uint stacksize);ulong*		threaddata(void);void		threadexits(char *);void		threadexitsall(char *);int		threadgetgrp(void);	/* return thread group of current thread */char*		threadgetname(void);void		threadkill(int);	/* kill thread */void		threadkillgrp(int);	/* kill threads in group */void		threadmain(int argc, char *argv[]);void		threadnonotes(void);int		threadpid(int);int		threadprint(int, char*, ...);int		threadsetgrp(int);	/* set thread group, return old */void		threadsetname(char *name);Channel*	threadwaitchan(void);void		yield(void);