#pragma src "/sys/src/libthread"#pragma lib "libthread.a"#pragma varargck argpos threadprint 2typedef 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 4struct 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);
#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);