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 | { |
rsc | c02bc16 | 2006-06-25 23:50:02 +0000 | [diff] [blame] | 15 | Mux *mux; |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 16 | Muxrpc *next; |
| 17 | Muxrpc *prev; |
| 18 | Rendez r; |
| 19 | uint tag; |
| 20 | void *p; |
rsc | c02bc16 | 2006-06-25 23:50:02 +0000 | [diff] [blame] | 21 | int waiting; |
rsc | 3a19470 | 2006-11-04 18:46:00 +0000 | [diff] [blame] | 22 | int async; |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 23 | }; |
| 24 | |
| 25 | struct Mux |
| 26 | { |
| 27 | uint mintag; /* to be filled by client */ |
| 28 | uint maxtag; |
| 29 | int (*send)(Mux*, void*); |
| 30 | void *(*recv)(Mux*); |
rsc | 3a19470 | 2006-11-04 18:46:00 +0000 | [diff] [blame] | 31 | int (*nbrecv)(Mux*, void**); |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 32 | int (*gettag)(Mux*, void*); |
| 33 | int (*settag)(Mux*, void*, uint); |
| 34 | void *aux; /* for private use by client */ |
| 35 | |
| 36 | /* private */ |
rsc | b214663 | 2004-01-09 00:04:55 +0000 | [diff] [blame] | 37 | QLock lk; /* must be first for muxinit */ |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 38 | QLock inlk; |
| 39 | QLock outlk; |
| 40 | Rendez tagrend; |
| 41 | Rendez rpcfork; |
| 42 | Muxqueue *readq; |
| 43 | Muxqueue *writeq; |
| 44 | uint nwait; |
| 45 | uint mwait; |
| 46 | uint freetag; |
| 47 | Muxrpc **wait; |
rsc | c02bc16 | 2006-06-25 23:50:02 +0000 | [diff] [blame] | 48 | Muxrpc *muxer; |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 49 | Muxrpc sleep; |
| 50 | }; |
| 51 | |
| 52 | void muxinit(Mux*); |
| 53 | void* muxrpc(Mux*, void*); |
rsc | c02bc16 | 2006-06-25 23:50:02 +0000 | [diff] [blame] | 54 | void muxprocs(Mux*); |
| 55 | Muxrpc* muxrpcstart(Mux*, void*); |
rsc | 3a19470 | 2006-11-04 18:46:00 +0000 | [diff] [blame] | 56 | int muxrpccanfinish(Muxrpc*, void**); |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 57 | |
| 58 | /* private */ |
| 59 | int _muxsend(Mux*, void*); |
rsc | 3a19470 | 2006-11-04 18:46:00 +0000 | [diff] [blame] | 60 | int _muxrecv(Mux*, int, void**); |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 61 | void _muxsendproc(void*); |
| 62 | void _muxrecvproc(void*); |
| 63 | Muxqueue *_muxqalloc(void); |
| 64 | int _muxqsend(Muxqueue*, void*); |
| 65 | void *_muxqrecv(Muxqueue*); |
| 66 | void _muxqhangup(Muxqueue*); |
rsc | 3a19470 | 2006-11-04 18:46:00 +0000 | [diff] [blame] | 67 | int _muxnbqrecv(Muxqueue*, void**); |
rsc | d3df308 | 2003-12-06 18:08:52 +0000 | [diff] [blame] | 68 | |
rsc | 1a0954a | 2005-01-04 21:18:08 +0000 | [diff] [blame] | 69 | #if defined(__cplusplus) |
| 70 | } |
| 71 | #endif |
| 72 | #endif |