1 #ifndef _THREAD_H_ 2 #define _THREAD_H_ 1 3 #if defined(__cplusplus) 4 extern "C" { 5 #endif 6 7 AUTOLIB(thread) 8 9 /* 10 * basic procs and threads 11 */ 12 int proccreate(void (*f)(void *arg), void *arg, unsigned int stacksize); 13 int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize); 14 void threadexits(char *); 15 void threadexitsall(char *); 16 void threadsetname(char*, ...); 17 void threadsetstate(char*, ...); 18 char *threadgetname(void); 19 int threadyield(void); 20 int threadidle(void); 21 void _threadready(_Thread*); 22 void _threadswitch(void); 23 void _threadsetsysproc(void); 24 void _threadsleep(Rendez*); 25 _Thread *_threadwakeup(Rendez*); 26 #define yield threadyield 27 int threadid(void); 28 void _threadpin(void); 29 void _threadunpin(void); 30 31 /* 32 * I am tired of making this mistake. 33 */ 34 #define exits do_not_call_exits_in_threaded_programs 35 #define _exits do_not_call__exits_in_threaded_programs 36 37 38 39 /* 40 * signals 41 */ 42 void threadnotify(int(*f)(void*,char*), int); 43 44 /* 45 * daemonize 46 * 47 void threaddaemonize(void); 48 */ 49 50 /* 51 * per proc and thread data 52 */ 53 void **procdata(void); 54 void **threaddata(void); 55 56 /* 57 * supplied by user instead of main. 58 * mainstacksize is size of stack allocated to run threadmain 59 */ 60 void threadmain(int argc, char *argv[]); 61 extern int mainstacksize; 62 63 /* 64 * channel communication 65 */ 66 typedef struct Alt Alt; 67 typedef struct _Altarray _Altarray; 68 typedef struct Channel Channel; 69 70 enum 71 { 72 CHANEND, 73 CHANSND, 74 CHANRCV, 75 CHANNOP, 76 CHANNOBLK 77 }; 78 79 struct Alt 80 { 81 Channel *c; 82 void *v; 83 uint op; 84 _Thread *thread; 85 }; 86 87 struct _Altarray 88 { 89 Alt **a; 90 uint n; 91 uint m; 92 }; 93 94 struct Channel 95 { 96 uint bufsize; 97 uint elemsize; 98 uchar *buf; 99 uint nbuf; 100 uint off; 101 _Altarray asend; 102 _Altarray arecv; 103 char *name; 104 }; 105 106 /* [Edit .+1,./^$/ |cfn -h $PLAN9/src/libthread/channel.c] */ 107 int chanalt(Alt *alts); 108 Channel* chancreate(int elemsize, int elemcnt); 109 void chanfree(Channel *c); 110 int channbrecv(Channel *c, void *v); 111 void* channbrecvp(Channel *c); 112 ulong channbrecvul(Channel *c); 113 int channbsend(Channel *c, void *v); 114 int channbsendp(Channel *c, void *v); 115 int channbsendul(Channel *c, ulong v); 116 int chanrecv(Channel *c, void *v); 117 void* chanrecvp(Channel *c); 118 ulong chanrecvul(Channel *c); 119 int chansend(Channel *c, void *v); 120 int chansendp(Channel *c, void *v); 121 int chansendul(Channel *c, ulong v); 122 void chansetname(Channel *c, char *fmt, ...); 123 124 #define alt chanalt 125 #define nbrecv channbrecv 126 #define nbrecvp channbrecvp 127 #define nbrecvul channbrecvul 128 #define nbsend channbsend 129 #define nbsendp channbsendp 130 #define nbsendul channbsendul 131 #define recv chanrecv 132 #define recvp chanrecvp 133 #define recvul chanrecvul 134 #define send chansend 135 #define sendp chansendp 136 #define sendul chansendul 137 138 /* 139 * reference counts 140 */ 141 typedef struct Ref Ref; 142 143 struct Ref { 144 Lock lock; 145 long ref; 146 }; 147 148 long decref(Ref *r); 149 long incref(Ref *r); 150 151 /* 152 * slave i/o processes 153 */ 154 typedef struct Ioproc Ioproc; 155 156 /* [Edit .+1,/^$/ |cfn -h $PLAN9/src/libthread/io*.c] */ 157 void closeioproc(Ioproc *io); 158 long iocall(Ioproc *io, long (*op)(va_list*), ...); 159 int ioclose(Ioproc *io, int fd); 160 int iodial(Ioproc *io, char *addr, char *local, char *dir, int *cdfp); 161 void iointerrupt(Ioproc *io); 162 int ioopen(Ioproc *io, char *path, int mode); 163 Ioproc* ioproc(void); 164 long ioread(Ioproc *io, int fd, void *a, long n); 165 int ioread9pmsg(Ioproc*, int, void*, int); 166 long ioreadn(Ioproc *io, int fd, void *a, long n); 167 int iorecvfd(Ioproc *, int); 168 int iosendfd(Ioproc*, int, int); 169 int iosleep(Ioproc *io, long n); 170 long iowrite(Ioproc *io, int fd, void *a, long n); 171 172 /* 173 * exec external programs 174 */ 175 void threadexec(Channel*, int[3], char*, char *[]); 176 void threadexecl(Channel*, int[3], char*, ...); 177 int threadspawn(int[3], char*, char*[]); 178 int threadspawnd(int[3], char*, char*[], char*); 179 int threadspawnl(int[3], char*, ...); 180 Channel* threadwaitchan(void); 181 182 /* 183 * alternate interface to threadwaitchan - don't use both! 184 */ 185 Waitmsg* procwait(int pid); 186 187 #if defined(__cplusplus) 188 } 189 #endif 190 #endif /* _THREADH_ */ 191