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 Mux *mux;
16 Muxrpc *next;
17 Muxrpc *prev;
18 Rendez r;
19 uint tag;
20 void *p;
21 int waiting;
22 };
24 struct Mux
25 {
26 uint mintag; /* to be filled by client */
27 uint maxtag;
28 int (*send)(Mux*, void*);
29 void *(*recv)(Mux*);
30 void *(*nbrecv)(Mux*);
31 int (*gettag)(Mux*, void*);
32 int (*settag)(Mux*, void*, uint);
33 void *aux; /* for private use by client */
35 /* private */
36 QLock lk; /* must be first for muxinit */
37 QLock inlk;
38 QLock outlk;
39 Rendez tagrend;
40 Rendez rpcfork;
41 Muxqueue *readq;
42 Muxqueue *writeq;
43 uint nwait;
44 uint mwait;
45 uint freetag;
46 Muxrpc **wait;
47 Muxrpc *muxer;
48 Muxrpc sleep;
49 };
51 void muxinit(Mux*);
52 void* muxrpc(Mux*, void*);
53 void muxprocs(Mux*);
54 Muxrpc* muxrpcstart(Mux*, void*);
55 void* muxrpccanfinish(Muxrpc*);
57 /* private */
58 int _muxsend(Mux*, void*);
59 void* _muxrecv(Mux*, int);
60 void _muxsendproc(void*);
61 void _muxrecvproc(void*);
62 Muxqueue *_muxqalloc(void);
63 int _muxqsend(Muxqueue*, void*);
64 void *_muxqrecv(Muxqueue*);
65 void _muxqhangup(Muxqueue*);
66 void *_muxnbqrecv(Muxqueue*);
68 #if defined(__cplusplus)
69 }
70 #endif
71 #endif