| efd56f68 | 04-Nov-2025 |
Joel Dice <[email protected]> |
fix a couple of partial read/write bugs (#11981)
* reset read/write state back to `Open` on event delivery
If one end of a stream does a partial read or write, we leave the other end in a `GuestRea
fix a couple of partial read/write bugs (#11981)
* reset read/write state back to `Open` on event delivery
If one end of a stream does a partial read or write, we leave the other end in a `GuestReady` state, allowing further reads or writes to proceed until the buffer has been drained or filled, respectively. However, once we've delivered the event regarding the partial operation, we need to set the state back to `Open`, since we'll have released the buffer back to the guest at that point.
Signed-off-by: Joel Dice <[email protected]>
* delay returning `Dropped` until producer buffer drained
If the `StreamProducer` calls `Destination::set_buffer`, we need to make sure all the items in that buffer have been delivered to the receiver (or the receiver closes its end) before telling it the write end has been dropped.
Signed-off-by: Joel Dice <[email protected]>
* add short reads tests
These cover a couple of scenarios where the guest and/or host read owned resource items one-at-a-time from writes of more than one item, forcing the writer to re-take ownership of the unwritten items between writes.
This also covers the case where the host's `StreamProducer` returns `StreamResult::Dropped` after calling `Destination::set_buffer`, in which case Wasmtime must delay telling the other end about the dropped stream until that buffer has been drained.
Signed-off-by: Joel Dice <[email protected]>
---------
Signed-off-by: Joel Dice <[email protected]>
show more ...
|
| ec68a031 | 29-Sep-2025 |
Joel Dice <[email protected]> |
don't trap on idle in `Instance::run_concurrent` (#11756)
Previously, `Instance::run_concurrent` returned `Trap::AsyncDeadlock` when all guest tasks and background host tasks had completed, and yet
don't trap on idle in `Instance::run_concurrent` (#11756)
Previously, `Instance::run_concurrent` returned `Trap::AsyncDeadlock` when all guest tasks and background host tasks had completed, and yet the future parameter it was passed still hadn't resolved. The theory was that this indicated a mistake on the host embedder's part, but it turns out there are scenarios where this is actually what the embedder wanted.
For example, consider a host embedder that implements a pool of worker tasks, each of which runs a loop inside async closure passed to `Instance::run_concurrent`. In this case, each worker accepts jobs (which involve calling guest functions) from a multiple-producer, multiple-consumer job queue, adding them to a `futures::stream::FuturesUnordered` so they can be run concurrently. When all the jobs accepted by a given worker have finished, there may be a lull during which no new jobs are yet available. In that case, the worker _could_ break out of the loop, resolve the future, allow `Instance::run_concurrent` to finish, and wait until the next job arrives before calling `Instance::run_concurrent` again, but that's more awkward (i.e. nested loops, complicated control flow) than just a single loop inside `Instance::run_concurrent` that goes idle now and then.
In short, the closure passed to `Instance::run_concurrent` might experience delays between when a set of guest tasks have completed and when the next set are ready to start, and that's not necessarily a bug.
Internally, I've added a new `run_concurrent_trap_on_idle` function, which provides the original, trapping behavior, and I'm using it to implement `[Typed]Func::call_async`, in which case it _is_ an error if the event loop goes idle without the future resolving. If this turns out to be useful as part of the public API, we can change the `pub(super)` to `pub`.
Signed-off-by: Joel Dice <[email protected]>
show more ...
|
| 024db5b4 | 08-Sep-2025 |
Joel Dice <[email protected]> |
support and test synchronous `{stream,future}.cancel-{read,write}` (#11645)
* support and test synchronous `{stream,future}.cancel-{read,write}`
Previously, we only supported async calls to those i
support and test synchronous `{stream,future}.cancel-{read,write}` (#11645)
* support and test synchronous `{stream,future}.cancel-{read,write}`
Previously, we only supported async calls to those intrinsics; now we support blocking, synchronous calls as well.
Signed-off-by: Joel Dice <[email protected]>
* update future-read.wast test
Signed-off-by: Joel Dice <[email protected]>
---------
Signed-off-by: Joel Dice <[email protected]>
show more ...
|