Blob


1 typedef struct Mux Mux;
2 typedef struct Muxrpc Muxrpc;
3 typedef struct Muxqueue Muxqueue;
5 struct Muxrpc
6 {
7 Muxrpc *next;
8 Muxrpc *prev;
9 Rendez r;
10 uint tag;
11 void *p;
12 };
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 */
24 /* private */
25 QLock lk; /* must be first for muxinit */
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 };
40 void muxinit(Mux*);
41 void* muxrpc(Mux*, void*);
42 void muxthreads(Mux*);
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*);