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 d3df3087 2003-12-06 devnull };
23 d3df3087 2003-12-06 devnull
24 d3df3087 2003-12-06 devnull struct Mux
25 d3df3087 2003-12-06 devnull {
26 d3df3087 2003-12-06 devnull uint mintag; /* to be filled by client */
27 d3df3087 2003-12-06 devnull uint maxtag;
28 d3df3087 2003-12-06 devnull int (*send)(Mux*, void*);
29 d3df3087 2003-12-06 devnull void *(*recv)(Mux*);
30 c02bc16b 2006-06-25 devnull void *(*nbrecv)(Mux*);
31 d3df3087 2003-12-06 devnull int (*gettag)(Mux*, void*);
32 d3df3087 2003-12-06 devnull int (*settag)(Mux*, void*, uint);
33 d3df3087 2003-12-06 devnull void *aux; /* for private use by client */
34 d3df3087 2003-12-06 devnull
35 d3df3087 2003-12-06 devnull /* private */
36 b214663d 2004-01-09 devnull QLock lk; /* must be first for muxinit */
37 d3df3087 2003-12-06 devnull QLock inlk;
38 d3df3087 2003-12-06 devnull QLock outlk;
39 d3df3087 2003-12-06 devnull Rendez tagrend;
40 d3df3087 2003-12-06 devnull Rendez rpcfork;
41 d3df3087 2003-12-06 devnull Muxqueue *readq;
42 d3df3087 2003-12-06 devnull Muxqueue *writeq;
43 d3df3087 2003-12-06 devnull uint nwait;
44 d3df3087 2003-12-06 devnull uint mwait;
45 d3df3087 2003-12-06 devnull uint freetag;
46 d3df3087 2003-12-06 devnull Muxrpc **wait;
47 c02bc16b 2006-06-25 devnull Muxrpc *muxer;
48 d3df3087 2003-12-06 devnull Muxrpc sleep;
49 d3df3087 2003-12-06 devnull };
50 d3df3087 2003-12-06 devnull
51 d3df3087 2003-12-06 devnull void muxinit(Mux*);
52 d3df3087 2003-12-06 devnull void* muxrpc(Mux*, void*);
53 c02bc16b 2006-06-25 devnull void muxprocs(Mux*);
54 c02bc16b 2006-06-25 devnull Muxrpc* muxrpcstart(Mux*, void*);
55 c02bc16b 2006-06-25 devnull void* muxrpccanfinish(Muxrpc*);
56 d3df3087 2003-12-06 devnull
57 d3df3087 2003-12-06 devnull /* private */
58 d3df3087 2003-12-06 devnull int _muxsend(Mux*, void*);
59 c02bc16b 2006-06-25 devnull void* _muxrecv(Mux*, int);
60 d3df3087 2003-12-06 devnull void _muxsendproc(void*);
61 d3df3087 2003-12-06 devnull void _muxrecvproc(void*);
62 d3df3087 2003-12-06 devnull Muxqueue *_muxqalloc(void);
63 d3df3087 2003-12-06 devnull int _muxqsend(Muxqueue*, void*);
64 d3df3087 2003-12-06 devnull void *_muxqrecv(Muxqueue*);
65 d3df3087 2003-12-06 devnull void _muxqhangup(Muxqueue*);
66 d3df3087 2003-12-06 devnull void *_muxnbqrecv(Muxqueue*);
67 d3df3087 2003-12-06 devnull
68 1a0954ab 2005-01-04 devnull #if defined(__cplusplus)
69 1a0954ab 2005-01-04 devnull }
70 1a0954ab 2005-01-04 devnull #endif
71 1a0954ab 2005-01-04 devnull #endif