Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for async/streams/futures #9582

Draft
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

dicej
Copy link
Contributor

@dicej dicej commented Nov 7, 2024

This adds support for loading, compiling, linking, and running components which use the Async ABI along with the stream, future, and error-context types. It also adds support for generating host bindings such that multiple host functions can be run concurrently with guest tasks -- without monopolizing the Store.

See the implementation RFC for details, as well as this repo containing end-to-end smoke tests.

This is very much a work-in progress, with a number of tasks remaining:

  • Avoid exposing global task IDs to guests and use per-instance IDs instead (and fix no_std build at the same time)
  • Track task.return type during compilation and assert the actual and expected types match at runtime
  • Ensure all guest pointers are bounds-checked when lifting, lowering, or copying values
  • Reduce code duplication in wasmtime_cranelift::compiler::component
  • Reduce code duplication between StoreContextMut::on_fiber and concurrent::on_fiber
  • Minimize and/or document the use of unsafe code
  • Implement {stream|future}.cancel-{read|write} and error-context.{new|debug-string}
  • Add support for (Typed)Func::call_concurrent per the RFC
  • Add support for multiplexing stream/future reads/writes and concurrent calls to guest exports per the RFC
  • Refactor, clean up, and unify handling of backpressure, yields, and event polling
  • Guard against reentrance where required (e.g. in certain fused adapter calls)
  • Add integration test cases covering new functionality to tests/all/component_model (starting by porting over the tests in https://github.com/dicej/component-async-demo)
  • Add binding generation test cases to crates/component-macro/tests
  • Add WAST tests to tests/misc_testsuite/component-model
  • Add support and test coverage for callback-less async functions (e.g. goroutines)
  • Add doc and code comments to new, non-trivial code (especially concurrent.rs and futures_and_streams.rs)
  • Switch to back to upstream wasm-tools once Add support for async ABI, futures, streams, and errors wasm-tools#1895 has been merged and released

This adds support for loading, compiling, linking, and running components which
use the [Async
ABI](https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md)
along with the [`stream`, `future`, and
`error-context`](WebAssembly/component-model#405) types.
It also adds support for generating host bindings such that multiple host
functions can be run concurrently with guest tasks -- without monopolizing the
`Store`.

See the [implementation RFC](bytecodealliance/rfcs#38)
for details, as well as [this
repo](https://github.com/dicej/component-async-demo) containing end-to-end smoke
tests.

This is very much a work-in progress, with a number of tasks remaining:

- [ ] Avoid exposing global task IDs to guests and use per-instance IDs instead
- [ ] Track `task.return` type during compilation and assert the actual and expected types match at runtime
- [ ] Ensure all guest pointers are bounds-checked when lifting, lowering, or copying values
- [ ] Reduce code duplication in `wasmtime_cranelift::compiler::component`
- [ ] Reduce code duplication between `StoreContextMut::on_fiber` and `concurrent::on_fiber`
- [ ] Minimize and/or document the use of unsafe code
- [ ] Add support for `(Typed)Func::call_concurrent` per the RFC
- [ ] Add support for multiplexing stream/future reads/writes and concurrent calls to guest exports per the RFC
- [ ] Refactor, clean up, and unify handling of backpressure, yields, and even polling
- [ ] Guard against reentrance where required (e.g. in certain fused adapter calls)
- [ ] Add integration test cases covering new functionality to tests/all/component_model (starting by porting over the tests in https://github.com/dicej/component-async-demo)
- [ ] Add binding generation test cases to crates/component-macro/tests
- [ ] Add WAST tests to tests/misc_testsuite/component-model
- [ ] Add support and test coverage for callback-less async functions (e.g. goroutines)
- [ ] Switch to back to upstream `wasm-tools` once bytecodealliance/wasm-tools#1895 has been merged and released

Signed-off-by: Joel Dice <[email protected]>
@dicej dicej self-assigned this Nov 7, 2024
Signed-off-by: Joel Dice <[email protected]>
It's still broken due to the use of `std::collections::HashMap` in
crates/wasmtime/src/runtime/vm/component.rs.  I'll address that as part of the
work to avoid exposing global task/future/stream/error-context handles to
guests.

Signed-off-by: Joel Dice <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: In progress
Development

Successfully merging this pull request may close these issues.

1 participant