From d52afb7f1a9c730efbd543f5906a4d5ea9c147c3 Mon Sep 17 00:00:00 2001
From: Guy Bedford
check: funcCheck for readiness on a set of pollables.
+Identical to poll, in taking a list of pollables and returning a list<u32> of handles in the argument list that are ready for I/O, but instead of blocking on at least one pollable in the list to be ready, this function immediately returns and may return an empty list if no pollables are currently ready.
If the list contains more elements than can be indexed with a u32 value, this function traps.
WASI I/O is an I/O abstraction API which is currently focused on providing stream types.
diff --git a/wit/poll.wit b/wit/poll.wit index ddc67f8..779751d 100644 --- a/wit/poll.wit +++ b/wit/poll.wit @@ -38,4 +38,16 @@ interface poll { /// the pollables has an error, it is indicated by marking the source as /// being reaedy for I/O. poll: func(in: listresource errorresource errorA resource which represents some error information.
The only method provided by this resource is to-debug-string,
which provides some human-readable information about the error.
error into a more
concrete type is open.[method]error.to-debug-string: func[method]error.to-debug-string: funcReturns a string that is suitable to assist humans in debugging this error.
WARNING: The returned string should not be consumed mechanically! @@ -37,41 +37,41 @@ details. Parsing this string is a major platform-compatibility hazard.
A poll API intended to let users wait for I/O events on multiple handles at once.
resource pollableresource pollablepollable represents a single I/O event which may be ready, or not.[method]pollable.ready: func[method]pollable.ready: funcReturn the readiness of a pollable. This function never blocks.
Returns true when the pollable is ready, and false otherwise.
[method]pollable.block: func[method]pollable.block: funcblock returns immediately if the pollable is ready, and otherwise
blocks until ready.
This function is equivalent to calling poll.poll on a list
containing only this pollable.
poll: funcpoll: funcPoll for completion on a set of pollables.
This function takes a list of pollables, which identify I/O sources of interest, and waits until one or more of the events is ready for I/O.
@@ -87,54 +87,59 @@ the pollables has an error, it is indicated by marking the source as being reaedy for I/O.check: funccheck: funcCheck for readiness on a set of pollables.
-Identical to poll, in taking a list of pollables and returning a list<u32> of handles in the argument list that are ready for I/O, but instead of blocking on at least one pollable in the list to be ready, this function immediately returns and may return an empty list if no pollables are currently ready.
If the list contains more elements than can be indexed with a u32 value, this function traps.
Identical to poll, in taking a list of pollables and returning a
+list<u32> of handles in the argument list that are ready for I/O, but
+instead of blocking on at least one pollable in the list to be ready,
+this function immediately returns and may return an empty list if no
+pollables are currently ready.
If the list contains more elements than can be indexed with a u32
+value, this function traps.
WASI I/O is an I/O abstraction API which is currently focused on providing stream types.
In the future, the component model is expected to add built-in stream types; when it does, they are expected to subsume this API.
type errortype error-#### `type pollable` +#### `type pollable` [`pollable`](#pollable)
-#### `variant stream-error` +#### `variant stream-error`
An error for input-stream and output-stream operations.
last-operation-failed: own<error>
last-operation-failed: own<error>
The last operation (a write or flush) failed before completion.
More information is available in the error payload.
The stream is closed: no more input will be accepted by the stream. A closed output-stream will return this error on all future operations.
resource input-streamresource input-streamAn input bytestream.
input-streams are non-blocking to the extent practical on underlying
platforms. I/O operations always return promptly; if fewer bytes are
@@ -142,7 +147,7 @@ promptly available than requested, they return the number of bytes promptly
available, which could even be zero. To wait for data to be available,
use the subscribe function to obtain a pollable which can be polled
for using wasi:io/poll.
resource output-streamresource output-streamAn output bytestream.
output-streams are non-blocking to the extent practical on
underlying platforms. Except where specified otherwise, I/O operations also
@@ -151,7 +156,7 @@ promptly, which could even be zero. To wait for the stream to be ready to
accept data, the subscribe function to obtain a pollable which can be
polled for using wasi:io/poll.[method]input-stream.read: func[method]input-stream.read: funcPerform a non-blocking read from the stream.
When the source of a read is binary data, the bytes from the source
are returned verbatim. When the source of a read is known to the
@@ -175,51 +180,51 @@ as a return value by the callee. The callee may return a list of bytes
less than len in size while more bytes are available for reading.
self: borrow<input-stream>len: u64self: borrow<input-stream>len: u64u8>, stream-error>[method]input-stream.blocking-read: func[method]input-stream.blocking-read: funcRead bytes from a stream, after blocking until at least one byte can
be read. Except for blocking, behavior is identical to read.
self: borrow<input-stream>len: u64self: borrow<input-stream>len: u64u8>, stream-error>[method]input-stream.skip: func[method]input-stream.skip: funcSkip bytes from a stream. Returns number of bytes skipped.
Behaves identical to read, except instead of returning a list
of bytes, returns the number of bytes consumed from the stream.
self: borrow<input-stream>len: u64self: borrow<input-stream>len: u64u64, stream-error>[method]input-stream.blocking-skip: func[method]input-stream.blocking-skip: funcSkip bytes from a stream, after blocking until at least one byte
can be skipped. Except for blocking behavior, identical to skip.
self: borrow<input-stream>len: u64self: borrow<input-stream>len: u64u64, stream-error>[method]input-stream.subscribe: func[method]input-stream.subscribe: funcCreate a pollable which will resolve once either the specified stream
has bytes available to read or the other end of the stream has been
closed.
@@ -228,13 +233,13 @@ Implementations may trap if the input-streampollables created with this function are dropped.
self: borrow<input-stream>self: borrow<input-stream>pollable>[method]output-stream.check-write: func[method]output-stream.check-write: funcCheck readiness for writing. This function never blocks.
Returns the number of bytes permitted for the next call to write,
or an error. Calling write with more bytes than this function has
@@ -244,13 +249,13 @@ become ready when this function will report at least 1 byte, or an
error.
self: borrow<output-stream>self: borrow<output-stream>u64, stream-error>[method]output-stream.write: func[method]output-stream.write: funcPerform a write. This function never blocks.
When the destination of a write is binary data, the bytes from
contents are written verbatim. When the destination of a write is
@@ -263,14 +268,14 @@ length of less than or equal to n. Otherwise, this function will trap.
self: borrow<output-stream>contents: list<u8>self: borrow<output-stream>contents: list<u8>stream-error>[method]output-stream.blocking-write-and-flush: func[method]output-stream.blocking-write-and-flush: funcPerform a write of up to 4096 bytes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
This is a convenience wrapper around the use of check-write,
@@ -294,14 +299,14 @@ let _ = this.check-write(); // eliding error handling
self: borrow<output-stream>contents: list<u8>self: borrow<output-stream>contents: list<u8>stream-error>[method]output-stream.flush: func[method]output-stream.flush: funcRequest to flush buffered output. This function never blocks.
This tells the output-stream that the caller intends any buffered
output to be flushed. the output which is expected to be flushed
@@ -312,24 +317,24 @@ completed. The subscribe pollable will become ready when the
flush has completed and the stream can accept more writes.
self: borrow<output-stream>self: borrow<output-stream>stream-error>[method]output-stream.blocking-flush: func[method]output-stream.blocking-flush: funcRequest to flush buffered output, and block until flush completes and stream is ready for writing again.
self: borrow<output-stream>self: borrow<output-stream>stream-error>[method]output-stream.subscribe: func[method]output-stream.subscribe: funcCreate a pollable which will resolve once the output-stream
is ready for more writing, or an error has occured. When this
pollable is ready, check-write will return ok(n) with n>0, or an
@@ -340,13 +345,13 @@ Implementations may trap if the output-streams created with this function are dropped.pollable
self: borrow<output-stream>self: borrow<output-stream>pollable>[method]output-stream.write-zeroes: func[method]output-stream.write-zeroes: funcWrite zeroes to a stream.
This should be used precisely like write with the exact same
preconditions (must use check-write first), but instead of
@@ -354,14 +359,14 @@ passing a list of bytes, you simply pass the number of zero-bytes
that should be written.
self: borrow<output-stream>len: u64self: borrow<output-stream>len: u64stream-error>[method]output-stream.blocking-write-zeroes-and-flush: func[method]output-stream.blocking-write-zeroes-and-flush: funcPerform a write of up to 4096 zeroes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
@@ -385,14 +390,14 @@ let _ = this.check-write(); // eliding error handlingself: borrow<output-stream>len: u64self: borrow<output-stream>len: u64stream-error>[method]output-stream.splice: func[method]output-stream.splice: funcRead from one stream and write to another.
The behavior of splice is equivelant to:
len.
self: borrow<output-stream>src: borrow<input-stream>len: u64self: borrow<output-stream>src: borrow<input-stream>len: u64u64, stream-error>[method]output-stream.blocking-splice: func[method]output-stream.blocking-splice: funcRead from one stream and write to another, with blocking.
This is similar to splice, except that it blocks until the
output-stream is ready for writing, and the input-stream
is ready for reading, before performing the splice.
self: borrow<output-stream>src: borrow<input-stream>len: u64self: borrow<output-stream>src: borrow<input-stream>len: u64