| #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 |