blob: b8d242c800c721acda452649feb52aab1292279d [file] [log] [blame]
rscd3df3082003-12-06 18:08:52 +00001typedef struct Mux Mux;
2typedef struct Muxrpc Muxrpc;
3typedef struct Muxqueue Muxqueue;
4
5struct Muxrpc
6{
7 Muxrpc *next;
8 Muxrpc *prev;
9 Rendez r;
10 uint tag;
11 void *p;
12};
13
14struct 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 */
rscb2146632004-01-09 00:04:55 +000025 QLock lk; /* must be first for muxinit */
rscd3df3082003-12-06 18:08:52 +000026 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
40void muxinit(Mux*);
41void* muxrpc(Mux*, void*);
42void muxthreads(Mux*);
43
44/* private */
45int _muxsend(Mux*, void*);
46void* _muxrecv(Mux*);
47void _muxsendproc(void*);
48void _muxrecvproc(void*);
49Muxqueue *_muxqalloc(void);
50int _muxqsend(Muxqueue*, void*);
51void *_muxqrecv(Muxqueue*);
52void _muxqhangup(Muxqueue*);
53void *_muxnbqrecv(Muxqueue*);
54