diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
commit | c558a99e0be506a9abdf677f0ca4490644e05fc1 (patch) | |
tree | 17aef678ad05a32ef96ce8385703cb3fe089a5c7 /sys/include/thread.h | |
parent | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (diff) |
Import sources from 2011-03-30 iso image - sys/include
Diffstat (limited to 'sys/include/thread.h')
-rwxr-xr-x | sys/include/thread.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/sys/include/thread.h b/sys/include/thread.h new file mode 100755 index 000000000..f67012f77 --- /dev/null +++ b/sys/include/thread.h @@ -0,0 +1,133 @@ +#pragma src "/sys/src/libthread" +#pragma lib "libthread.a" + +#pragma varargck argpos chanprint 2 + +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. + */ + +enum { + Nqwds = 2, + Nqshift = 5, /* logâ‚‚ # of bits in long */ + Nqmask = -1, + Nqbits = (1 << Nqshift) * 2, +}; + +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 */ + volatile Alt **qentry; /* Receivers/senders waiting (malloc) */ + volatile int nentry; /* # of entries malloc-ed */ + volatile int closed; /* channel is closed */ + uchar v[1]; /* Array of s values in the channel */ +}; + + +/* Channel operations for alt: */ +typedef enum { + CHANEND, + CHANSND, + CHANRCV, + CHANNOP, + CHANNOBLK, +} ChanOp; + +struct Alt { + Channel *c; /* channel */ + void *v; /* pointer to value */ + ChanOp op; /* operation */ + char *err; /* did the op fail? */ + /* + * the next variables are used internally to alt + * they need not be initialized + */ + Channel **tag; /* pointer to rendez-vous tag */ + int entryno; /* entry number */ +}; + +struct Ref { + long ref; +}; + +int alt(Alt alts[]); +int chanclose(Channel*); +int chanclosing(Channel *c); +Channel*chancreate(int elemsize, int bufsize); +int chaninit(Channel *c, int elemsize, int elemcnt); +void chanfree(Channel *c); +int chanprint(Channel *, char *, ...); +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); +void needstack(int); +int proccreate(void (*f)(void *arg), void *arg, uint stacksize); +int procrfork(void (*f)(void *arg), void *arg, uint stacksize, int flag); +void** 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); +void** threaddata(void); +void threadexits(char *); +void threadexitsall(char *); +int threadgetgrp(void); /* return thread group of current thread */ +char* threadgetname(void); +void threadint(int); /* interrupt thread */ +void threadintgrp(int); /* interrupt threads in grp */ +void threadkill(int); /* kill thread */ +void threadkillgrp(int); /* kill threads in group */ +void threadmain(int argc, char *argv[]); +void threadnonotes(void); +int threadnotify(int (*f)(void*, char*), int in); +int threadid(void); +int threadpid(int); +int threadsetgrp(int); /* set thread group, return old */ +void threadsetname(char *fmt, ...); +Channel*threadwaitchan(void); +int tprivalloc(void); +void tprivfree(int); +void **tprivaddr(int); +void yield(void); + +extern int mainstacksize; + +/* slave I/O processes */ +typedef struct Ioproc Ioproc; + +#pragma incomplete Ioproc + + +Ioproc* ioproc(void); +void closeioproc(Ioproc*); +void iointerrupt(Ioproc*); + +int ioclose(Ioproc*, int); +int iodial(Ioproc*, char*, char*, char*, int*); +int ioopen(Ioproc*, char*, int); +long ioread(Ioproc*, int, void*, long); +long ioreadn(Ioproc*, int, void*, long); +long iowrite(Ioproc*, int, void*, long); +int iosleep(Ioproc*, long); + +long iocall(Ioproc*, long (*)(va_list*), ...); +void ioret(Ioproc*, int); |