[MLton] Re: exene example
Wesley W. Terpstra
wesley@terpstra.ca
Thu, 1 Sep 2005 16:27:59 +0200
On Sep 1, 2005, at 3:33 PM, Matthew Fluet wrote:
> Remember: the SML/NJ implementation of CML reimplements much of the
> IO sub-system of the Basis Library to both be thread safe and to
> play nice with switching threads. In particular, the CML version
> of Socket.recvVec is implemented as follows:
>
> fun inEvt (CMLSock{sock, ...}) =
> CML.wrap(IOManager.ioEvt (OS.IO.pollIn (pollD sock)), ignore)
>
> fun recvVec (s as PS.CMLSock{sock, ...}, n) =
> case Socket.recvVecNB (sock, n)
> of (SOME res) => res
> | NONE => (CML.sync(inEvt s); Socket.recvVec (sock, n))
>
> So, you can see that behind the scenes, it attempts a non-blocking
> receive; if that succeeds, it simply returns that data. If the
> call would block, then it registers the socket with the IOManager,
> which takes care of polling io descriptors and resuming a thread
> once the io descriptor's state has changed (e.g., data has appeared
> on the socket). It is the CML.sync on the (inEvt s) that makes the
> recvVec yield to other threads until such time as the socket has
> data. Note, even though recvVec may be considered a blocking form
> of read (since the call won't return until there is actual data on
> the socket), other threads get a chance to run because it never
> performs a blocking system call unless it is certain that the call
> will not actually block.
>
> The situation is entirely different in MLton (at the current time).
> There is no $(SML_LIB)/cml/basis.mlb corresponding to a thread
> safe / non-blocking implementation of the Basis Library.
My port of state-threads to standard ML does this, if you are
interested.
However, it is quite different from CML...