Blame


1 1a0954ab 2005-01-04 devnull #ifndef _MUX_H_
2 1a0954ab 2005-01-04 devnull #define _MUX_H_ 1
3 1a0954ab 2005-01-04 devnull #if defined(__cplusplus)
4 1a0954ab 2005-01-04 devnull extern "C" {
5 1a0954ab 2005-01-04 devnull #endif
6 1a0954ab 2005-01-04 devnull
7 1a0954ab 2005-01-04 devnull AUTOLIB(mux)
8 1a0954ab 2005-01-04 devnull
9 d3df3087 2003-12-06 devnull typedef struct Mux Mux;
10 d3df3087 2003-12-06 devnull typedef struct Muxrpc Muxrpc;
11 d3df3087 2003-12-06 devnull typedef struct Muxqueue Muxqueue;
12 d3df3087 2003-12-06 devnull
13 d3df3087 2003-12-06 devnull struct Muxrpc
14 d3df3087 2003-12-06 devnull {
15 c02bc16b 2006-06-25 devnull Mux *mux;
16 d3df3087 2003-12-06 devnull Muxrpc *next;
17 d3df3087 2003-12-06 devnull Muxrpc *prev;
18 d3df3087 2003-12-06 devnull Rendez r;
19 d3df3087 2003-12-06 devnull uint tag;
20 d3df3087 2003-12-06 devnull void *p;
21 c02bc16b 2006-06-25 devnull int waiting;
22 3a194702 2006-11-04 devnull int async;
23 d3df3087 2003-12-06 devnull };
24 d3df3087 2003-12-06 devnull
25 d3df3087 2003-12-06 devnull struct Mux
26 d3df3087 2003-12-06 devnull {
27 d3df3087 2003-12-06 devnull uint mintag; /* to be filled by client */
28 d3df3087 2003-12-06 devnull uint maxtag;
29 d3df3087 2003-12-06 devnull int (*send)(Mux*, void*);
30 d3df3087 2003-12-06 devnull void *(*recv)(Mux*);
31 3a194702 2006-11-04 devnull int (*nbrecv)(Mux*, void**);
32 d3df3087 2003-12-06 devnull int (*gettag)(Mux*, void*);
33 d3df3087 2003-12-06 devnull int (*settag)(Mux*, void*, uint);
34 d3df3087 2003-12-06 devnull void *aux; /* for private use by client */
35 d3df3087 2003-12-06 devnull
36 d3df3087 2003-12-06 devnull /* private */
37 b214663d 2004-01-09 devnull QLock lk; /* must be first for muxinit */
38 d3df3087 2003-12-06 devnull QLock inlk;
39 d3df3087 2003-12-06 devnull QLock outlk;
40 d3df3087 2003-12-06 devnull Rendez tagrend;
41 d3df3087 2003-12-06 devnull Rendez rpcfork;
42 d3df3087 2003-12-06 devnull Muxqueue *readq;
43 d3df3087 2003-12-06 devnull Muxqueue *writeq;
44 d3df3087 2003-12-06 devnull uint nwait;
45 d3df3087 2003-12-06 devnull uint mwait;
46 d3df3087 2003-12-06 devnull uint freetag;
47 d3df3087 2003-12-06 devnull Muxrpc **wait;
48 c02bc16b 2006-06-25 devnull Muxrpc *muxer;
49 d3df3087 2003-12-06 devnull Muxrpc sleep;
50 d3df3087 2003-12-06 devnull };
51 d3df3087 2003-12-06 devnull
52 d3df3087 2003-12-06 devnull void muxinit(Mux*);
53 d3df3087 2003-12-06 devnull void* muxrpc(Mux*, void*);
54 c02bc16b 2006-06-25 devnull void muxprocs(Mux*);
55 c02bc16b 2006-06-25 devnull Muxrpc* muxrpcstart(Mux*, void*);
56 3a194702 2006-11-04 devnull int muxrpccanfinish(Muxrpc*, void**);
57 d3df3087 2003-12-06 devnull
58 d3df3087 2003-12-06 devnull /* private */
59 d3df3087 2003-12-06 devnull int _muxsend(Mux*, void*);
60 3a194702 2006-11-04 devnull int _muxrecv(Mux*, int, void**);
61 d3df3087 2003-12-06 devnull void _muxsendproc(void*);
62 d3df3087 2003-12-06 devnull void _muxrecvproc(void*);
63 d3df3087 2003-12-06 devnull Muxqueue *_muxqalloc(void);
64 d3df3087 2003-12-06 devnull int _muxqsend(Muxqueue*, void*);
65 d3df3087 2003-12-06 devnull void *_muxqrecv(Muxqueue*);
66 d3df3087 2003-12-06 devnull void _muxqhangup(Muxqueue*);
67 3a194702 2006-11-04 devnull int _muxnbqrecv(Muxqueue*, void**);
68 d3df3087 2003-12-06 devnull
69 1a0954ab 2005-01-04 devnull #if defined(__cplusplus)
70 1a0954ab 2005-01-04 devnull }
71 1a0954ab 2005-01-04 devnull #endif
72 1a0954ab 2005-01-04 devnull #endif