|
NAMEMux, muxinit, muxrpc, muxthreads - protocol multiplexorSYNOPSIS#include <mux.h>struct Mux { uint mintag; uint maxtag; int (*settag)(Mux *mux, void *msg, uint tag); int (*gettag)(Mux *mux, void *msg); int (*send)(Mux *mux, void *msg); void *(*recv)(Mux *mux); void *(*nbrecv)(Mux *mux); void *aux; ... /* private fields follow */ }; void muxinit(Mux *mux); void* muxrpc(Mux *mux, void *request); void muxprocs(Mux *mux); Muxrpc* muxrpcstart(Mux *mux, void *request); void* muxrpccanfinish(Muxrpc *rpc); DESCRIPTIONLibmux is a generic protocol multiplexor. A client program initializes a Mux structure with information about the protocol (mainly in the form of helper functions) and can then use muxrpc to execute individual RPCs without worrying about details of multiplexing requests and demultiplexing responses.Libmux assumes that the protocol messages contain a tag (or message ID) field that exists for the sole purpose of demultiplexing messages. Libmux chooses the tags and then calls a helper function to put them in the outgoing messages. Libmux calls another helper function to retrieve tags from incoming messages. It also calls helper functions to send and receive packets. A client should allocate a Mux structure and then call muxinit to initialize the library's private elements. The client must initialize the following elements:
Libmux also provides a non-blocking interface, useful for programs forced to use a main loop. Muxrpcstart runs the first half of muxrpc: it assigns a tag and sends the request, but does not wait for the reply. Instead it returns a pointer to a Muxrpc structure that represents the in-progress call. Muxrpccanfinish checks whether the given call can finish. If no mux procs have been started, muxrpccanfinish may call nbrecv to poll for newly arrived responses. EXAMPLESee /src/lib9pclient/fs.c for an example of using libmux with 9P (see intro(9p)).SOURCE/src/libmuxSEE ALSOintro(9p)BUGSLibmux does not know how to free protocol messages, so message arriving with unexpected or invalid tags are leaked. Visit the GSP FreeBSD Man Page Interface. |