module Netsys_polysocket:sig..end
Polymorphic message sockets
These pipes are restricted to a single process, and can be used to send messages of any types between threads.
type'apolyendpoint ='a Netsys_polypipe.polypipe * 'a Netsys_polypipe.polypipe
An endpoint is simply a pair (rd,wr) where rd is a polypipe open
for reading, and wr is a polypipe open for writing.
type 'a polyclient
A client, connected or unconnected
type 'a polyserver
A server
val create_client : int -> 'a polyclientCreate a new socket client. The int is the number of messages in the pipe buffer.
val connect : 'a polyclient -> 'a polyserver -> unitRequests the connection with this server. This function returns always immediately.
Possible Unix.unix_error codes:
EALREADYEISCONNval endpoint : synchronous:bool ->
nonblock:bool ->
'a polyclient -> 'a polyendpointReturns the endpoint once connected. In asynchronous mode, the
connect is immediately successful. In synchronous mode, it is
awaited that the server accepts the connection. If also nonblock
is true, the Unix_error EAGAIN is returned if such waiting
is needed.
Possible Unix.unix_error codes:
EAGAIN: the client is non-blocking, and the connection is not yet
establishedEINTR: a signal arrivedECONNREFUSED: the server went down in the meantimeENOTCONN: no previous connectIf called several times, this function always returns the same endpoint.
val close_client : 'a polyclient -> unitCloses the client and the endpoint. Further interactions with the client
raise the exception Netsys_polypipe.Closed.
val set_connect_notify : 'a polyclient -> (unit -> unit) -> unitset_connect_notify cl f: Sets that the function f is called when
the connection is accepted. There can only be one such function; any
previous function is overwritten. Only future connect events are
reported. The function is called from a different thread.
val connect_descr : 'a polyclient -> Unix.file_descrReturns a descriptor that can be used for polling. This is only
meaningful for synchronous connects. When the descriptor
is readable the connection is accepted, and calling endpoint
again is promising.
If connect_descr is called several times, always the same descriptor is
returned.
The caller has to close the descriptor after use.
You can call this function only after connect.
val create_server : unit -> 'a polyserverCreate a new socket server.
Note that a server needs 2-6 file descriptors in the current implementation.
val accept : nonblock:bool ->
'a polyserver -> 'a polyendpointAccepts the next connection (or returns the next connection from the backlog queue). If the server is blocking, this function waits until the connection is established.
Possible Unix.unix_error codes:
EAGAIN: the server is non-blocking, and no connection attempt is
pendingEINTR: a signal arrivedval refuse : nonblock:bool -> 'a polyserver -> unitAll pending connection attempts will be refused. The clients will get
ECONNREFUSED. It is possible to return to accepting connections.
For a non-blocking refuse you need to call refuse again after
catching EAGAIN.
val pending_connection : 'a polyserver -> boolWhether there is a client waiting for being accepted
val close_server : 'a polyserver -> unitCloses the server. The accepted endpoints need to be closed separately.
Further interactions with the server cause that the exception
Netsys_polypipe.Closed will be raised.
val set_accept_notify : 'a polyserver -> (unit -> unit) -> unitset_accept_notify srv f: Sets that the function f is called when
a new connection arrives. There can only be one such function; any
previous function is overwritten. The event is edge-triggered: when
several connections arrive the function is only called once. The
function is called from a different thread.
val accept_descr : 'a polyserver -> Unix.file_descrReturns a descriptor that can be used for polling. When the descriptor is readable a pending connection exists. If called several times, always the same descriptor is returned.
The caller has to close the descriptor after use.
You can call this function before or after accept.