#ifndef _THREAD_H_#define _THREAD_H_ 1#if defined(__cplusplus)extern "C" { #endif AUTOLIB(thread) /* * basic procs and threads */int proccreate(void (*f)(void *arg), void *arg, unsigned int stacksize);int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize);void threadexits(char *);void threadexitsall(char *);void threadsetname(char*, ...);void threadsetstate(char*, ...);char *threadgetname(void);int threadyield(void);int threadidle(void);void _threadready(_Thread*);void _threadswitch(void);void _threadsetsysproc(void);void _threadsleep(Rendez*);_Thread *_threadwakeup(Rendez*);#define yield threadyieldint threadid(void);void _threadpin(void);void _threadunpin(void); /* * I am tired of making this mistake. */#define exits do_not_call_exits_in_threaded_programs#define _exits do_not_call__exits_in_threaded_programs /* * signals */void threadnotify(int(*f)(void*,char*), int); /* * daemonize *void threaddaemonize(void); */ /* * per proc and thread data */void **procdata(void);void **threaddata(void); /* * supplied by user instead of main. * mainstacksize is size of stack allocated to run threadmain */void threadmain(int argc, char *argv[]);extern int mainstacksize; /* * channel communication */typedef struct Alt Alt;typedef struct _Altarray _Altarray;typedef struct Channel Channel; enum{ CHANEND, CHANSND, CHANRCV, CHANNOP, CHANNOBLK}; struct Alt{ Channel *c; void *v; uint op; _Thread *thread;}; struct _Altarray{ Alt **a; uint n; uint m;}; struct Channel{ uint bufsize; uint elemsize; uchar *buf; uint nbuf; uint off; _Altarray asend; _Altarray arecv; char *name;}; /* [Edit .+1,./^$/ |cfn -h $PLAN9/src/libthread/channel.c] */int chanalt(Alt *alts);Channel* chancreate(int elemsize, int elemcnt);void chanfree(Channel *c);int channbrecv(Channel *c, void *v);void* channbrecvp(Channel *c);ulong channbrecvul(Channel *c);int channbsend(Channel *c, void *v);int channbsendp(Channel *c, void *v);int channbsendul(Channel *c, ulong v);int chanrecv(Channel *c, void *v);void* chanrecvp(Channel *c);ulong chanrecvul(Channel *c);int chansend(Channel *c, void *v);int chansendp(Channel *c, void *v);int chansendul(Channel *c, ulong v);void chansetname(Channel *c, char *fmt, ...); #define alt chanalt#define nbrecv channbrecv#define nbrecvp channbrecvp#define nbrecvul channbrecvul#define nbsend channbsend#define nbsendp channbsendp#define nbsendul channbsendul#define recv chanrecv#define recvp chanrecvp#define recvul chanrecvul#define send chansend#define sendp chansendp#define sendul chansendul /* * reference counts */typedef struct Ref Ref; struct Ref { Lock lock; long ref;}; long decref(Ref *r);long incref(Ref *r); /* * slave i/o processes */typedef struct Ioproc Ioproc; /* [Edit .+1,/^$/ |cfn -h $PLAN9/src/libthread/io*.c] */void closeioproc(Ioproc *io);long iocall(Ioproc *io, long (*op)(va_list*), ...);int ioclose(Ioproc *io, int fd);int iodial(Ioproc *io, char *addr, char *local, char *dir, int *cdfp);void iointerrupt(Ioproc *io);int ioopen(Ioproc *io, char *path, int mode);Ioproc* ioproc(void);long ioread(Ioproc *io, int fd, void *a, long n);int ioread9pmsg(Ioproc*, int, void*, int);long ioreadn(Ioproc *io, int fd, void *a, long n);int iorecvfd(Ioproc *, int);int iosendfd(Ioproc*, int, int);int iosleep(Ioproc *io, long n);long iowrite(Ioproc *io, int fd, void *a, long n); /* * exec external programs */void threadexec(Channel*, int[3], char*, char *[]);void threadexecl(Channel*, int[3], char*, ...);int threadspawn(int[3], char*, char*[]);int threadspawnl(int[3], char*, ...);Channel* threadwaitchan(void); /* * alternate interface to threadwaitchan - don't use both! */Waitmsg* procwait(int pid); #if defined(__cplusplus)}#endif#endif /* _THREADH_ */
#ifndef _THREAD_H_
#define _THREAD_H_ 1
#if defined(__cplusplus)
extern "C" {
#endif
AUTOLIB(thread)
/*
* basic procs and threads
*/
int proccreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
int threadcreate(void (*f)(void *arg), void *arg, unsigned int stacksize);
void threadexits(char *);
void threadexitsall(char *);
void threadsetname(char*, ...);
void threadsetstate(char*, ...);
char *threadgetname(void);
int threadyield(void);
int threadidle(void);
void _threadready(_Thread*);
void _threadswitch(void);
void _threadsetsysproc(void);
void _threadsleep(Rendez*);
_Thread *_threadwakeup(Rendez*);
#define yield threadyield
int threadid(void);
void _threadpin(void);
void _threadunpin(void);
/*
* I am tired of making this mistake.
*/
#define exits do_not_call_exits_in_threaded_programs
#define _exits do_not_call__exits_in_threaded_programs
/*
* signals
*/
void threadnotify(int(*f)(void*,char*), int);
/*
* daemonize
*
void threaddaemonize(void);
*/
/*
* per proc and thread data
*/
void **procdata(void);
void **threaddata(void);
/*
* supplied by user instead of main.
* mainstacksize is size of stack allocated to run threadmain
*/
void threadmain(int argc, char *argv[]);
extern int mainstacksize;
/*
* channel communication
*/
typedef struct Alt Alt;
typedef struct _Altarray _Altarray;
typedef struct Channel Channel;
enum
{
CHANEND,
CHANSND,
CHANRCV,
CHANNOP,
CHANNOBLK
};
struct Alt
{
Channel *c;
void *v;
uint op;
_Thread *thread;
};
struct _Altarray
{
Alt **a;
uint n;
uint m;
};
struct Channel
{
uint bufsize;
uint elemsize;
uchar *buf;
uint nbuf;
uint off;
_Altarray asend;
_Altarray arecv;
char *name;
};
/* [Edit .+1,./^$/ |cfn -h $PLAN9/src/libthread/channel.c] */
int chanalt(Alt *alts);
Channel* chancreate(int elemsize, int elemcnt);
void chanfree(Channel *c);
int channbrecv(Channel *c, void *v);
void* channbrecvp(Channel *c);
ulong channbrecvul(Channel *c);
int channbsend(Channel *c, void *v);
int channbsendp(Channel *c, void *v);
int channbsendul(Channel *c, ulong v);
int chanrecv(Channel *c, void *v);
void* chanrecvp(Channel *c);
ulong chanrecvul(Channel *c);
int chansend(Channel *c, void *v);
int chansendp(Channel *c, void *v);
int chansendul(Channel *c, ulong v);
void chansetname(Channel *c, char *fmt, ...);
#define alt chanalt
#define nbrecv channbrecv
#define nbrecvp channbrecvp
#define nbrecvul channbrecvul
#define nbsend channbsend
#define nbsendp channbsendp
#define nbsendul channbsendul
#define recv chanrecv
#define recvp chanrecvp
#define recvul chanrecvul
#define send chansend
#define sendp chansendp
#define sendul chansendul
/*
* reference counts
*/
typedef struct Ref Ref;
struct Ref {
Lock lock;
long ref;
};
long decref(Ref *r);
long incref(Ref *r);
/*
* slave i/o processes
*/
typedef struct Ioproc Ioproc;
/* [Edit .+1,/^$/ |cfn -h $PLAN9/src/libthread/io*.c] */
void closeioproc(Ioproc *io);
long iocall(Ioproc *io, long (*op)(va_list*), ...);
int ioclose(Ioproc *io, int fd);
int iodial(Ioproc *io, char *addr, char *local, char *dir, int *cdfp);
void iointerrupt(Ioproc *io);
int ioopen(Ioproc *io, char *path, int mode);
Ioproc* ioproc(void);
long ioread(Ioproc *io, int fd, void *a, long n);
int ioread9pmsg(Ioproc*, int, void*, int);
long ioreadn(Ioproc *io, int fd, void *a, long n);
int iorecvfd(Ioproc *, int);
int iosendfd(Ioproc*, int, int);
int iosleep(Ioproc *io, long n);
long iowrite(Ioproc *io, int fd, void *a, long n);
/*
* exec external programs
*/
void threadexec(Channel*, int[3], char*, char *[]);
void threadexecl(Channel*, int[3], char*, ...);
int threadspawn(int[3], char*, char*[]);
int threadspawnl(int[3], char*, ...);
Channel* threadwaitchan(void);
/*
* alternate interface to threadwaitchan - don't use both!
*/
Waitmsg* procwait(int pid);
#if defined(__cplusplus)
}
#endif
#endif /* _THREADH_ */