blob: e9890fc31c8fbd67357a23e68bb855e64292095b [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{
rscc02bc162006-06-25 23:50:02 +000015 Mux *mux;
rscd3df3082003-12-06 18:08:52 +000016 Muxrpc *next;
17 Muxrpc *prev;
18 Rendez r;
19 uint tag;
20 void *p;
rscc02bc162006-06-25 23:50:02 +000021 int waiting;
rsc3a194702006-11-04 18:46:00 +000022 int async;
rscd3df3082003-12-06 18:08:52 +000023};
24
25struct Mux
26{
27 uint mintag; /* to be filled by client */
28 uint maxtag;
29 int (*send)(Mux*, void*);
30 void *(*recv)(Mux*);
rsc3a194702006-11-04 18:46:00 +000031 int (*nbrecv)(Mux*, void**);
rscd3df3082003-12-06 18:08:52 +000032 int (*gettag)(Mux*, void*);
33 int (*settag)(Mux*, void*, uint);
34 void *aux; /* for private use by client */
35
36/* private */
rscb2146632004-01-09 00:04:55 +000037 QLock lk; /* must be first for muxinit */
rscd3df3082003-12-06 18:08:52 +000038 QLock inlk;
39 QLock outlk;
40 Rendez tagrend;
41 Rendez rpcfork;
42 Muxqueue *readq;
43 Muxqueue *writeq;
44 uint nwait;
45 uint mwait;
46 uint freetag;
47 Muxrpc **wait;
rscc02bc162006-06-25 23:50:02 +000048 Muxrpc *muxer;
rscd3df3082003-12-06 18:08:52 +000049 Muxrpc sleep;
50};
51
52void muxinit(Mux*);
53void* muxrpc(Mux*, void*);
rscc02bc162006-06-25 23:50:02 +000054void muxprocs(Mux*);
55Muxrpc* muxrpcstart(Mux*, void*);
rsc3a194702006-11-04 18:46:00 +000056int muxrpccanfinish(Muxrpc*, void**);
rscd3df3082003-12-06 18:08:52 +000057
58/* private */
59int _muxsend(Mux*, void*);
rsc3a194702006-11-04 18:46:00 +000060int _muxrecv(Mux*, int, void**);
rscd3df3082003-12-06 18:08:52 +000061void _muxsendproc(void*);
62void _muxrecvproc(void*);
63Muxqueue *_muxqalloc(void);
64int _muxqsend(Muxqueue*, void*);
65void *_muxqrecv(Muxqueue*);
66void _muxqhangup(Muxqueue*);
rsc3a194702006-11-04 18:46:00 +000067int _muxnbqrecv(Muxqueue*, void**);
rscd3df3082003-12-06 18:08:52 +000068
rsc1a0954a2005-01-04 21:18:08 +000069#if defined(__cplusplus)
70}
71#endif
72#endif