aboutsummaryrefslogtreecommitdiff
path: root/include/mux.h
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-12-06 18:08:52 +0000
committerrsc <devnull@localhost>2003-12-06 18:08:52 +0000
commitd3df308747ee4d1fcc063a348dcf1146b390bda7 (patch)
treea204b027256ec29b110caaa86100cbd701808b5b /include/mux.h
parente97ceade5e1bba5787e39429384336fa37797906 (diff)
downloadplan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.tar.gz
plan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.tar.bz2
plan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.zip
File system stuff.
Diffstat (limited to 'include/mux.h')
-rw-r--r--include/mux.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/include/mux.h b/include/mux.h
new file mode 100644
index 00000000..c43ce797
--- /dev/null
+++ b/include/mux.h
@@ -0,0 +1,54 @@
+typedef struct Mux Mux;
+typedef struct Muxrpc Muxrpc;
+typedef struct Muxqueue Muxqueue;
+
+struct Muxrpc
+{
+ Muxrpc *next;
+ Muxrpc *prev;
+ Rendez r;
+ uint tag;
+ void *p;
+};
+
+struct Mux
+{
+ uint mintag; /* to be filled by client */
+ uint maxtag;
+ int (*send)(Mux*, void*);
+ void *(*recv)(Mux*);
+ int (*gettag)(Mux*, void*);
+ int (*settag)(Mux*, void*, uint);
+ void *aux; /* for private use by client */
+
+/* private */
+ QLock lk;
+ QLock inlk;
+ QLock outlk;
+ Rendez tagrend;
+ Rendez rpcfork;
+ Muxqueue *readq;
+ Muxqueue *writeq;
+ uint nwait;
+ uint mwait;
+ uint freetag;
+ Muxrpc **wait;
+ uint muxer;
+ Muxrpc sleep;
+};
+
+void muxinit(Mux*);
+void* muxrpc(Mux*, void*);
+void muxthreads(Mux*);
+
+/* private */
+int _muxsend(Mux*, void*);
+void* _muxrecv(Mux*);
+void _muxsendproc(void*);
+void _muxrecvproc(void*);
+Muxqueue *_muxqalloc(void);
+int _muxqsend(Muxqueue*, void*);
+void *_muxqrecv(Muxqueue*);
+void _muxqhangup(Muxqueue*);
+void *_muxnbqrecv(Muxqueue*);
+