file: job.t package: muf status: alpha
This is Muq's closest analogue to the C/Unix select() call: It waits until input is available on one of the given streams and returns a block from that stream.
The [streams]
argument must be a block of
streams. There may currently be at most thirteen
streams in the block.
The nf
argument is same as the noFragments
readStreamPacket[
argument.
The millisecs
argument must be either nil
or a
positive (not zero!) integer limit on the number of
milliseconds which the job should wait for input to arrive.
If this limit is exceeded, the job will return
[ | nil nil nil
. (Zero millisecs
values are
disallowed in order to discourage waste of CPU
resources in busy-wait loops.)
The [values]
tag
and who
return
values are as in readStreamPacket[
.
The s
return value is the particular stream
from which the packet was read, or nil
if the call
timed out before input arrived. (The logically
separate operations of finding a nonempty stream and
reading from it are combined into a single operation in
order to avoid race events -- if they were
separate, some other job might empty the stream between
the two operations.)
Example. Here is a simple implementation of
sleepJob
based on
|readAnyStreamPacket
:
: my-sleep-job { $ -> } -> millisecs [ | t millisecs |readAnyStreamPacket pop pop pop ]pop ;
Example. Here is a loop that merges two input streams into one output stream:
: merge-streams { $ $ $ -> @ } -> outstream -> instream2 -> instream1 do{ ( Read a block from either input stream: ) [ instream1 instream2 | t nil |readAnyStreamPacket -> stream -> who -> tag ( Write the block to output stream: ) tag t outstream |writeStreamPacket ( Pop the block and continue: ) pop pop ]pop } ;
See section readStreamPacket[.
Go to the first, previous, next, last section, table of contents.