blob: 01d1779c0eb4692c4484f137a72f48cfed42b259 [file] [log] [blame]
rsc1a0954a2005-01-04 21:18:08 +00001#ifndef _MUX_H_
2#define _MUX_H_ 1
3#if defined(__cplusplus)
4extern "C" {
5#endif
6
7AUTOLIB(mux)
8
rscd3df3082003-12-06 18:08:52 +00009typedef struct Mux Mux;
10typedef struct Muxrpc Muxrpc;
11typedef struct Muxqueue Muxqueue;
12
13struct Muxrpc
14{
15 Muxrpc *next;
16 Muxrpc *prev;
17 Rendez r;
18 uint tag;
19 void *p;
20};
21
22struct 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 */
31
32/* private */
rscb2146632004-01-09 00:04:55 +000033 QLock lk; /* must be first for muxinit */
rscd3df3082003-12-06 18:08:52 +000034 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};
47
48void muxinit(Mux*);
49void* muxrpc(Mux*, void*);
50void muxthreads(Mux*);
51
52/* private */
53int _muxsend(Mux*, void*);
54void* _muxrecv(Mux*);
55void _muxsendproc(void*);
56void _muxrecvproc(void*);
57Muxqueue *_muxqalloc(void);
58int _muxqsend(Muxqueue*, void*);
59void *_muxqrecv(Muxqueue*);
60void _muxqhangup(Muxqueue*);
61void *_muxnbqrecv(Muxqueue*);
62
rsc1a0954a2005-01-04 21:18:08 +000063#if defined(__cplusplus)
64}
65#endif
66#endif