Blame


1 76193d7c 2003-09-30 devnull #ifndef _THREADH_
2 76193d7c 2003-09-30 devnull #define _THREADH_ 1
3 76193d7c 2003-09-30 devnull
4 76193d7c 2003-09-30 devnull /* avoid conflicts with socket library */
5 76193d7c 2003-09-30 devnull #undef send
6 76193d7c 2003-09-30 devnull #define send _threadsend
7 76193d7c 2003-09-30 devnull #undef recv
8 76193d7c 2003-09-30 devnull #define recv _threadrecv
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull typedef struct Alt Alt;
11 76193d7c 2003-09-30 devnull typedef struct Channel Channel;
12 76193d7c 2003-09-30 devnull typedef struct Ref Ref;
13 76193d7c 2003-09-30 devnull
14 76193d7c 2003-09-30 devnull /* Channel structure. S is the size of the buffer. For unbuffered channels
15 76193d7c 2003-09-30 devnull * s is zero. v is an array of s values. If s is zero, v is unused.
16 76193d7c 2003-09-30 devnull * f and n represent the state of the queue pointed to by v.
17 76193d7c 2003-09-30 devnull */
18 76193d7c 2003-09-30 devnull
19 76193d7c 2003-09-30 devnull enum {
20 76193d7c 2003-09-30 devnull Nqwds = 2,
21 76193d7c 2003-09-30 devnull Nqshift = 5, // 2log #of bits in long
22 76193d7c 2003-09-30 devnull Nqmask = - 1,
23 76193d7c 2003-09-30 devnull Nqbits = (1 << Nqshift) * 2,
24 76193d7c 2003-09-30 devnull };
25 76193d7c 2003-09-30 devnull
26 76193d7c 2003-09-30 devnull struct Channel {
27 76193d7c 2003-09-30 devnull int s; // Size of the channel (may be zero)
28 76193d7c 2003-09-30 devnull unsigned int f; // Extraction point (insertion pt: (f + n) % s)
29 76193d7c 2003-09-30 devnull unsigned int n; // Number of values in the channel
30 76193d7c 2003-09-30 devnull int e; // Element size
31 76193d7c 2003-09-30 devnull int freed; // Set when channel is being deleted
32 76193d7c 2003-09-30 devnull volatile Alt **qentry; // Receivers/senders waiting (malloc)
33 76193d7c 2003-09-30 devnull volatile int nentry; // # of entries malloc-ed
34 76193d7c 2003-09-30 devnull unsigned char v[1]; // Array of s values in the channel
35 76193d7c 2003-09-30 devnull };
36 76193d7c 2003-09-30 devnull
37 76193d7c 2003-09-30 devnull
38 76193d7c 2003-09-30 devnull /* Channel operations for alt: */
39 76193d7c 2003-09-30 devnull typedef enum {
40 76193d7c 2003-09-30 devnull CHANEND,
41 76193d7c 2003-09-30 devnull CHANSND,
42 76193d7c 2003-09-30 devnull CHANRCV,
43 76193d7c 2003-09-30 devnull CHANNOP,
44 76193d7c 2003-09-30 devnull CHANNOBLK,
45 76193d7c 2003-09-30 devnull } ChanOp;
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull struct Alt {
48 76193d7c 2003-09-30 devnull Channel *c; /* channel */
49 76193d7c 2003-09-30 devnull void *v; /* pointer to value */
50 76193d7c 2003-09-30 devnull ChanOp op; /* operation */
51 76193d7c 2003-09-30 devnull
52 76193d7c 2003-09-30 devnull /* the next variables are used internally to alt
53 76193d7c 2003-09-30 devnull * they need not be initialized
54 76193d7c 2003-09-30 devnull */
55 76193d7c 2003-09-30 devnull Channel **tag; /* pointer to rendez-vous tag */
56 76193d7c 2003-09-30 devnull int entryno; /* entry number */
57 76193d7c 2003-09-30 devnull };
58 76193d7c 2003-09-30 devnull
59 76193d7c 2003-09-30 devnull struct Ref {
60 76193d7c 2003-09-30 devnull long ref;
61 76193d7c 2003-09-30 devnull };
62 76193d7c 2003-09-30 devnull
63 76193d7c 2003-09-30 devnull int alt(Alt alts[]);
64 76193d7c 2003-09-30 devnull Channel* chancreate(int elemsize, int bufsize);
65 76193d7c 2003-09-30 devnull int chaninit(Channel *c, int elemsize, int elemcnt);
66 76193d7c 2003-09-30 devnull void chanfree(Channel *c);
67 76193d7c 2003-09-30 devnull int chanprint(Channel *, char *, ...);
68 76193d7c 2003-09-30 devnull long decref(Ref *r); /* returns 0 iff value is now zero */
69 76193d7c 2003-09-30 devnull void incref(Ref *r);
70 76193d7c 2003-09-30 devnull int nbrecv(Channel *c, void *v);
71 76193d7c 2003-09-30 devnull void* nbrecvp(Channel *c);
72 76193d7c 2003-09-30 devnull unsigned long nbrecvul(Channel *c);
73 76193d7c 2003-09-30 devnull int nbsend(Channel *c, void *v);
74 76193d7c 2003-09-30 devnull int nbsendp(Channel *c, void *v);
75 76193d7c 2003-09-30 devnull int nbsendul(Channel *c, unsigned long v);
76 76193d7c 2003-09-30 devnull int proccreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
77 76193d7c 2003-09-30 devnull int procrfork(void (*f)(void *arg), void *arg, unsigned int stacksize, int flag);
78 76193d7c 2003-09-30 devnull void** procdata(void);
79 76193d7c 2003-09-30 devnull void procexec(Channel *, char *, char *[]);
80 76193d7c 2003-09-30 devnull void procexecl(Channel *, char *, ...);
81 76193d7c 2003-09-30 devnull int recv(Channel *c, void *v);
82 76193d7c 2003-09-30 devnull void* recvp(Channel *c);
83 76193d7c 2003-09-30 devnull unsigned long recvul(Channel *c);
84 76193d7c 2003-09-30 devnull int send(Channel *c, void *v);
85 76193d7c 2003-09-30 devnull int sendp(Channel *c, void *v);
86 76193d7c 2003-09-30 devnull int sendul(Channel *c, unsigned long v);
87 76193d7c 2003-09-30 devnull int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
88 76193d7c 2003-09-30 devnull void** threaddata(void);
89 76193d7c 2003-09-30 devnull void threadexits(char *);
90 76193d7c 2003-09-30 devnull void threadexitsall(char *);
91 76193d7c 2003-09-30 devnull int threadgetgrp(void); /* return thread group of current thread */
92 76193d7c 2003-09-30 devnull char* threadgetname(void);
93 76193d7c 2003-09-30 devnull void threadint(int); /* interrupt thread */
94 76193d7c 2003-09-30 devnull void threadintgrp(int); /* interrupt threads in grp */
95 76193d7c 2003-09-30 devnull void threadkill(int); /* kill thread */
96 76193d7c 2003-09-30 devnull void threadkillgrp(int); /* kill threads in group */
97 76193d7c 2003-09-30 devnull void threadmain(int argc, char *argv[]);
98 76193d7c 2003-09-30 devnull void threadnonotes(void);
99 76193d7c 2003-09-30 devnull int threadnotify(int (*f)(void*, char*), int in);
100 76193d7c 2003-09-30 devnull int threadid(void);
101 76193d7c 2003-09-30 devnull int threadpid(int);
102 76193d7c 2003-09-30 devnull int threadsetgrp(int); /* set thread group, return old */
103 76193d7c 2003-09-30 devnull void threadsetname(char *name);
104 76193d7c 2003-09-30 devnull Channel* threadwaitchan(void);
105 76193d7c 2003-09-30 devnull int tprivalloc(void);
106 76193d7c 2003-09-30 devnull void tprivfree(int);
107 76193d7c 2003-09-30 devnull void **tprivaddr(int);
108 76193d7c 2003-09-30 devnull void yield(void);
109 76193d7c 2003-09-30 devnull
110 76193d7c 2003-09-30 devnull long threadstack(void);
111 76193d7c 2003-09-30 devnull
112 76193d7c 2003-09-30 devnull extern int mainstacksize;
113 76193d7c 2003-09-30 devnull
114 76193d7c 2003-09-30 devnull /* slave I/O processes */
115 76193d7c 2003-09-30 devnull typedef struct Ioproc Ioproc;
116 76193d7c 2003-09-30 devnull
117 76193d7c 2003-09-30 devnull Ioproc* ioproc(void);
118 76193d7c 2003-09-30 devnull void closeioproc(Ioproc*);
119 76193d7c 2003-09-30 devnull void iointerrupt(Ioproc*);
120 76193d7c 2003-09-30 devnull
121 76193d7c 2003-09-30 devnull int ioclose(Ioproc*, int);
122 76193d7c 2003-09-30 devnull int iodial(Ioproc*, char*, char*, char*, int*);
123 76193d7c 2003-09-30 devnull int ioopen(Ioproc*, char*, int);
124 76193d7c 2003-09-30 devnull long ioread(Ioproc*, int, void*, long);
125 76193d7c 2003-09-30 devnull long ioreadn(Ioproc*, int, void*, long);
126 76193d7c 2003-09-30 devnull long iowrite(Ioproc*, int, void*, long);
127 76193d7c 2003-09-30 devnull int iosleep(Ioproc*, long);
128 76193d7c 2003-09-30 devnull
129 76193d7c 2003-09-30 devnull long iocall(Ioproc*, long (*)(va_list*), ...);
130 76193d7c 2003-09-30 devnull void ioret(Ioproc*, int);
131 76193d7c 2003-09-30 devnull
132 76193d7c 2003-09-30 devnull #endif /* _THREADH_ */