Blob


1 #ifndef _MUX_H_
2 #define _MUX_H_ 1
3 #if defined(__cplusplus)
4 extern "C" {
5 #endif
7 AUTOLIB(mux)
9 typedef struct Mux Mux;
10 typedef struct Muxrpc Muxrpc;
11 typedef struct Muxqueue Muxqueue;
13 struct Muxrpc
14 {
15 Muxrpc *next;
16 Muxrpc *prev;
17 Rendez r;
18 uint tag;
19 void *p;
20 };
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 */
32 /* private */
33 QLock lk; /* must be first for muxinit */
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 };
48 void muxinit(Mux*);
49 void* muxrpc(Mux*, void*);
50 void muxthreads(Mux*);
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*);
63 #if defined(__cplusplus)
64 }
65 #endif
66 #endif