#ifndef _MUX_H_ | |
#define _MUX_H_ 1 | |
#if defined(__cplusplus) | |
extern "C" { | |
#endif | |
AUTOLIB(mux) | |
typedef struct Mux Mux; | |
typedef struct Muxrpc Muxrpc; | |
typedef struct Muxqueue Muxqueue; | |
struct Muxrpc | |
{ | |
Muxrpc *next; | |
Muxrpc *prev; | |
Rendez r; | |
uint tag; | |
void *p; | |
}; | |
struct Mux | |
{ | |
uint mintag; /* to be filled by client */ | |
uint maxtag; | |
int (*send)(Mux*, void*); | |
void *(*recv)(Mux*); | |
int (*gettag)(Mux*, void*); | |
int (*settag)(Mux*, void*, uint); | |
void *aux; /* for private use by client */ | |
/* private */ | |
QLock lk; /* must be first for muxinit */ | |
QLock inlk; | |
QLock outlk; | |
Rendez tagrend; | |
Rendez rpcfork; | |
Muxqueue *readq; | |
Muxqueue *writeq; | |
uint nwait; | |
uint mwait; | |
uint freetag; | |
Muxrpc **wait; | |
uint muxer; | |
Muxrpc sleep; | |
}; | |
void muxinit(Mux*); | |
void* muxrpc(Mux*, void*); | |
void muxthreads(Mux*); | |
/* private */ | |
int _muxsend(Mux*, void*); | |
void* _muxrecv(Mux*); | |
void _muxsendproc(void*); | |
void _muxrecvproc(void*); | |
Muxqueue *_muxqalloc(void); | |
int _muxqsend(Muxqueue*, void*); | |
void *_muxqrecv(Muxqueue*); | |
void _muxqhangup(Muxqueue*); | |
void *_muxnbqrecv(Muxqueue*); | |
#if defined(__cplusplus) | |
} | |
#endif | |
#endif |