rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 1 | typedef struct Mux Mux; |
| 2 | typedef struct Muxrpc Muxrpc; |
| 3 | typedef struct Muxqueue Muxqueue; |
| 4 | |
| 5 | struct Muxrpc |
| 6 | { |
| 7 | Muxrpc *next; |
| 8 | Muxrpc *prev; |
| 9 | Rendez r; |
| 10 | uint tag; |
| 11 | void *p; |
| 12 | }; |
| 13 | |
| 14 | struct Mux |
| 15 | { |
| 16 | uint mintag; /* to be filled by client */ |
| 17 | uint maxtag; |
| 18 | int (*send)(Mux*, void*); |
| 19 | void *(*recv)(Mux*); |
| 20 | int (*gettag)(Mux*, void*); |
| 21 | int (*settag)(Mux*, void*, uint); |
| 22 | void *aux; /* for private use by client */ |
| 23 | |
| 24 | /* private */ |
rsc | b214663 | 2004-01-09 00:04:55 +0000 | [diff] [blame] | 25 | QLock lk; /* must be first for muxinit */ |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 26 | QLock inlk; |
| 27 | QLock outlk; |
| 28 | Rendez tagrend; |
| 29 | Rendez rpcfork; |
| 30 | Muxqueue *readq; |
| 31 | Muxqueue *writeq; |
| 32 | uint nwait; |
| 33 | uint mwait; |
| 34 | uint freetag; |
| 35 | Muxrpc **wait; |
| 36 | uint muxer; |
| 37 | Muxrpc sleep; |
| 38 | }; |
| 39 | |
| 40 | void muxinit(Mux*); |
| 41 | void* muxrpc(Mux*, void*); |
| 42 | void muxthreads(Mux*); |
| 43 | |
| 44 | /* private */ |
| 45 | int _muxsend(Mux*, void*); |
| 46 | void* _muxrecv(Mux*); |
| 47 | void _muxsendproc(void*); |
| 48 | void _muxrecvproc(void*); |
| 49 | Muxqueue *_muxqalloc(void); |
| 50 | int _muxqsend(Muxqueue*, void*); |
| 51 | void *_muxqrecv(Muxqueue*); |
| 52 | void _muxqhangup(Muxqueue*); |
| 53 | void *_muxnbqrecv(Muxqueue*); |
| 54 | |