| #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 | 
 | { | 
 | 	Mux *mux; | 
 | 	Muxrpc *next; | 
 | 	Muxrpc *prev; | 
 | 	Rendez r; | 
 | 	uint tag; | 
 | 	void *p; | 
 | 	int waiting; | 
 | 	int async; | 
 | }; | 
 |  | 
 | struct Mux | 
 | { | 
 | 	uint mintag;	/* to be filled by client */ | 
 | 	uint maxtag; | 
 | 	int (*send)(Mux*, void*); | 
 | 	void *(*recv)(Mux*); | 
 | 	int (*nbrecv)(Mux*, void**); | 
 | 	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; | 
 | 	Muxrpc *muxer; | 
 | 	Muxrpc sleep; | 
 | }; | 
 |  | 
 | void	muxinit(Mux*); | 
 | void*	muxrpc(Mux*, void*); | 
 | void	muxprocs(Mux*); | 
 | Muxrpc*	muxrpcstart(Mux*, void*); | 
 | int	muxrpccanfinish(Muxrpc*, void**); | 
 |  | 
 | /* private */ | 
 | int	_muxsend(Mux*, void*); | 
 | int	_muxrecv(Mux*, int, void**); | 
 | void	_muxsendproc(void*); | 
 | void	_muxrecvproc(void*); | 
 | Muxqueue *_muxqalloc(void); | 
 | int _muxqsend(Muxqueue*, void*); | 
 | void *_muxqrecv(Muxqueue*); | 
 | void _muxqhangup(Muxqueue*); | 
 | int _muxnbqrecv(Muxqueue*, void**); | 
 |  | 
 | #if defined(__cplusplus) | 
 | } | 
 | #endif | 
 | #endif |