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