diff options
author | rsc <devnull@localhost> | 2003-12-06 18:08:52 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-12-06 18:08:52 +0000 |
commit | d3df308747ee4d1fcc063a348dcf1146b390bda7 (patch) | |
tree | a204b027256ec29b110caaa86100cbd701808b5b /include/mux.h | |
parent | e97ceade5e1bba5787e39429384336fa37797906 (diff) | |
download | plan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.tar.gz plan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.tar.bz2 plan9port-d3df308747ee4d1fcc063a348dcf1146b390bda7.zip |
File system stuff.
Diffstat (limited to 'include/mux.h')
-rw-r--r-- | include/mux.h | 54 |
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*); + |