Communication between Glish and clients is handled by a data transport layer called SOS. SOS is a library which provides platform independent transport of binary data between different machines, e.g. data can be moved from a SPARC machine to an ALPHA machine transparently. Any necessary conversion is done at the receiving end of the communication. This avoids unnecessary conversion on some architectures. SOS is a reimplementation in C++ of a portion of another transport library called SDS (contact Chris Saltmarsh at salty@farpoint.co.uk for more information about SDS).
The header portion of each event encodes information such as the architecture of the
machine which sent the event, a time stamp, length of the event, etc. The interface
to the event header is defined in the C++ header file <sos/header.h>. The
header is followed by the actual event data.
The header information and binary values are written to and read from SOS
sinks and sources. These are C++ objects which provide an I/O abstraction
which allows you to read and write values from and to file descriptors, e.g. the
pipes or sockets which connect Glish to clients. The header file <sos/io.h>
defines the interface for SOS sources and sinks.
For the most part, Glish's dependence on the transport layer is isolated in two
functions send_event() and recv_event(). Both of which can be found
in Client.cc. These routines are parameterized with SOS source and
sink objects. This is necessary to allow events being sent by the interpreter
to be non-blocking. When used by the interpreter, send_event() sends what
it can and the returns under the assumption that it will resume later. This
eliminates some deadlock situations.