99 Commits

Author SHA1 Message Date
Alex Crichton 8f03b22e07 Remove wasm-c-api submodule (#8170)
* Remove wasm-c-api submodule

This submodule hasn't been updated in ~3 years at this point and we
additionally don't need most of the submodule. Instead add a script to
copy the files we need and verify in CI that the files are up-to-date.

This also makes using the C API a bit nicer where you don't have to have
two `include` directories with a Wasmtime source tree, just one
suffices.

* Don't format wasm.h{,h} vendored files
2024-03-18 18:58:11 +00:00
Pat Hickey 97e3a450a8 wasmtime-wasi: introduce WasiP1Ctx, re-jigger p0 & p1 linkers to take closure (#8053)
and add a few missing bits of functionality for use in the c-api
2024-03-08 00:17:32 +00:00
Nick Fitzgerald bd2ea901d3 Define garbage collection rooting APIs (#8011)
* Define garbage collection rooting APIs

Rooting prevents GC objects from being collected while they are actively being
used.

We have a few sometimes-conflicting goals with our GC rooting APIs:

1. Safety: It should never be possible to get a use-after-free bug because the
   user misused the rooting APIs, the collector "mistakenly" determined an
   object was unreachable and collected it, and then the user tried to access
   the object. This is our highest priority.

2. Moving GC: Our rooting APIs should moving collectors (such as generational
   and compacting collectors) where an object might get relocated after a
   collection and we need to update the GC root's pointer to the moved
   object. This means we either need cooperation and internal mutability from
   individual GC roots as well as the ability to enumerate all GC roots on the
   native Rust stack, or we need a level of indirection.

3. Performance: Our rooting APIs should generally be as low-overhead as
   possible. They definitely shouldn't require synchronization and locking to
   create, access, and drop GC roots.

4. Ergonomics: Our rooting APIs should be, if not a pleasure, then at least not
   a burden for users. Additionally, the API's types should be `Sync` and `Send`
   so that they work well with async Rust.

For example, goals (3) and (4) are in conflict when we think about how to
support (2). Ideally, for ergonomics, a root would automatically unroot itself
when dropped. But in the general case that requires holding a reference to the
store's root set, and that root set needs to be held simultaneously by all GC
roots, and they each need to mutate the set to unroot themselves. That implies
`Rc<RefCell<...>>` or `Arc<Mutex<...>>`! The former makes the store and GC root
types not `Send` and not `Sync`. The latter imposes synchronization and locking
overhead. So we instead make GC roots indirect and require passing in a store
context explicitly to unroot in the general case. This trades worse ergonomics
for better performance and support for moving GC and async Rust.

Okay, with that out of the way, this module provides two flavors of rooting
API. One for the common, scoped lifetime case, and another for the rare case
where we really need a GC root with an arbitrary, non-LIFO/non-scoped lifetime:

1. `RootScope` and `Rooted<T>`: These are used for temporarily rooting GC
   objects for the duration of a scope. Upon exiting the scope, they are
   automatically unrooted. The internal implementation takes advantage of the
   LIFO property inherent in scopes, making creating and dropping `Rooted<T>`s
   and `RootScope`s super fast and roughly equivalent to bump allocation.

   This type is vaguely similar to V8's [`HandleScope`].

   [`HandleScope`]: https://v8.github.io/api/head/classv8_1_1HandleScope.html

   Note that `Rooted<T>` can't be statically tied to its context scope via a
   lifetime parameter, unfortunately, as that would allow the creation and use
   of only one `Rooted<T>` at a time, since the `Rooted<T>` would take a borrow
   of the whole context.

   This supports the common use case for rooting and provides good ergonomics.

2. `ManuallyRooted<T>`: This is the fully general rooting API used for holding
   onto non-LIFO GC roots with arbitrary lifetimes. However, users must manually
   unroot them. Failure to manually unroot a `ManuallyRooted<T>` before it is
   dropped will result in the GC object (and everything it transitively
   references) leaking for the duration of the `Store`'s lifetime.

   This type is roughly similar to SpiderMonkey's [`PersistentRooted<T>`],
   although they avoid the manual-unrooting with internal mutation and shared
   references. (Our constraints mean we can't do those things, as mentioned
   explained above.)

   [`PersistentRooted<T>`]: http://devdoc.net/web/developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS::PersistentRooted.html

At the end of the day, both `Rooted<T>` and `ManuallyRooted<T>` are just tagged
indices into the store's `RootSet`. This indirection allows working with Rust's
borrowing discipline (we use `&mut Store` to represent mutable access to the GC
heap) while still allowing rooted references to be moved around without tying up
the whole store in borrows. Additionally, and crucially, this indirection allows
us to update the *actual* GC pointers in the `RootSet` and support moving GCs
(again, as mentioned above).

* Reorganize GC-related submodules in `wasmtime-runtime`

* Reorganize GC-related submodules in `wasmtime`

* Use `Into<StoreContext[Mut]<'a, T>` for `Externref::data[_mut]` methods

* Run rooting tests under MIRI

* Make `into_abi` take an `AutoAssertNoGc`

* Don't use atomics to update externref ref counts anymore

* Try to make lifetimes/safety more-obviously correct

Remove some transmute methods, assert that `VMExternRef`s are the only valid
`VMGcRef`, etc.

* Update extenref constructor examples

* Make `GcRefImpl::transmute_ref` a non-default trait method

* Make inline fast paths for GC LIFO scopes

* Make `RootSet::unroot_gc_ref` an `unsafe` function

* Move Hash and Eq for Rooted, move to impl methods

* Remove type parameter from `AutoAssertNoGc`

Just wrap a `&mut StoreOpaque` directly.

* Make a bunch of internal `ExternRef` methods that deal with raw `VMGcRef`s take `AutoAssertNoGc` instead of `StoreOpaque`

* Fix compile after rebase

* rustfmt

* revert unrelated egraph changes

* Fix non-gc build

* Mark `AutoAssertNoGc` methods inline

* review feedback

* Temporarily remove externref support from the C API

Until we can add proper GC rooting.

* Remove doxygen reference to temp deleted function

* Remove need to `allow(private_interfaces)`

* Fix call benchmark compilation
2024-03-06 00:40:02 +00:00
Alex Crichton 9949140d4a Update to wit-bindgen 0.20.0 (#8032)
Keepin' up to date.
2024-02-29 23:00:51 +00:00
Alex Crichton b81bb7a369 Add a "custom" platform configuration for Wasmtime (#7995)
* Add a "custom" platform configuration for Wasmtime

This commit leverages adds a new "platform" to Wasmtime to be supported
in the `crates/runtime/src/sys` folder. This joins preexisting platforms
such as Unix and Windows. The goal of this platform is to be an opt-in
way to build Wasmtime for targets that don't have a predefined way to
run.

The new "custom" platform requires `--cfg wasmtime_custom_platform` to
be passed to the Rust compiler, for example by using `RUSTFLAGS`. This
new platform bottoms out in a C API that is intended to be small and
Linux-like. The C API is effectively the interface to virtual memory
that Wasmtime requires. This C API is also available as a header file at
`examples/min-platform/embedding/wasmtime-platform.h` (generated by
`cbindgen`).

The main purpose of this is to make it easier to experiment with porting
Wasmtime to new platforms. By decoupling a platform implementation from
Wasmtime itself it should be possible to run these experiments
out-of-tree. An example of this I've been working on is getting
Wasmtime running on bare-metal with a custom kernel. This support
enables defining the platform interface of the custom kernel's syscalls
outside of Wasmtime.

* Exclude wasmtime-platform.h from formatting

* Include build-wasmtime-target-wasm32 in final job

* Don't force any single toolchain

* Add notes to no_std docs

* Add rust-src to CI

* Review comments

* Change APIs to be fallible

* Only compile the min-platform example on Linux

* Fix compile of min-platform example

* Fix another compile error in the example
2024-02-28 20:23:33 +00:00
Alex Crichton 5b82502084 Remove a binary file I accidentally committed (#7985)
This snuck in #7983 by accident as I was rebasing and failed to juggle
branches correctly.
2024-02-23 02:05:34 +00:00
Alex Crichton 9ce3ffe15e Update some CI dependencies (#7983)
* Update some CI dependencies

* Update to the latest nightly toolchain
* Update mdbook
* Update QEMU for cross-compiled testing
* Update `cargo nextest` for usage with MIRI

prtest:full

* Remove lots of unnecessary imports

* Downgrade qemu as 8.2.1 seems to segfault

* Remove more imports

* Remove unused winch trait method

* Fix warnings about unused trait methods

* More unused imports

* More unused imports
2024-02-22 23:54:03 +00:00
Pat Hickey a56bd5e469 Promote wasmtime-wasi::preview2 to root of crate (#7933)
* better top matter

* eliminate wasi-common deprecations from wasmtime-wasi

* wasmtime-wasi: preview2 feature always enabled, so just eliminate it

* rename preview1-on-preview2 feature to just preview1

* wasi-http fix

* dep fixes. change some log::debug! to tracing::debug!

* mv preview2 up to root

and `sed -i 's/crate::preview2/crate/g' **/*.rs`

* fix tests too

* fixes throughout wasmtime-wasi-http

* cli: s/wasmtime_wasi::preview2/wasmtime_wasi

* rustfmt

* fix wasi-async example

* fix docs build (needs wasi-common built to compile examples)

* c-api: use wasi-common directly

i guess we didnt build the c-api in CI with deprecation warnings denied

prtest:full

* fix example required-features

* fix examples CMakeLists build
2024-02-21 00:09:53 +00:00
Nick Fitzgerald ff93bce067 Wasmtime: Finish support for the typed function references proposal (#7943)
* Wasmtime: Finish support for the typed function references proposal

While we supported the function references proposal inside Wasm, we didn't
support it on the "outside" in the Wasmtime embedder APIs. So much of the work
here is exposing typed function references, and their type system updates, in
the embedder API. These changes include:

* `ValType::FuncRef` and `ValType::ExternRef` are gone, replaced with the
  introduction of the `RefType` and `HeapType` types and a
  `ValType::Ref(RefType)` variant.

* `ValType` and `FuncType` no longer implement `Eq` and `PartialEq`. Instead
  there are `ValType::matches` and `FuncType::matches` methods which check
  directional subtyping. I also added `ValType::eq` and `FuncType::eq` static
  methods for the rare case where someone needs to check precise equality, but
  that is almost never actually the case, 99.99% of the time you want to check
  subtyping.

* There are also public `Val::matches_ty` predicates for checking if a value is
  an instance of a type, as well as internal helpers like
  `Val::ensure_matches_ty` that return a formatted error if the value does not
  match the given type. These helpers are used throughout Wasmtime internals
  now.

* There is now a dedicated `wasmtime::Ref` type that represents reference
  values. Table operations have been updated to take and return `Ref`s rather
  than `Val`s.

Furthermore, this commit also includes type registry changes to correctly manage
lifetimes of types that reference other types. This wasn't previously an issue
because the only thing that could reference types that reference other types was
a Wasm module that added all the types that could reference each other at the
same time and removed them all at the same time. But now that the previously
discussed work to expose these things in the embedder API is done, type lifetime
management in the registry becomes a little trickier because the embedder might
grab a reference to a type that references another type, and then unload the
Wasm module that originally defined that type, but then the user should still be
able use that type and the other types it transtively references. Before, we
were refcounting individual registry entries. Now, we still are refcounting
individual entries, but now we are also accounting for type-to-type references
and adding a new type to the registry will increment the refcounts of each of
the types that it references, and removing a type from the registry will
decrement the refcounts of each of the types it references, and then recursively
(logically, not literally) remove any types whose refcount has now reached zero.

Additionally, this PR adds support for subtyping to `Func::typed`- and
`Func::wrap`-style APIs. For result types, you can always use a supertype of the
WebAssembly function's actual declared return type in `Func::typed`. And for
param types, you can always use a subtype of the Wasm function's actual declared
param type. Doing these things essentially erases information but is always
correct. But additionally, for functions which take a reference to a concrete
type as a parameter, you can also use the concrete type's supertype. Consider a
WebAssembly function that takes a reference to a function with a concrete type:
`(ref null <func type index>)`. In this scenario, there is no static
`wasmtime::Foo` Rust type that corresponds to that particular Wasm-defined
concrete reference type because Wasm modules are loaded dynamically at
runtime. You *could* do `f.typed::<Option<NoFunc>, ()>()`, and while that is
correctly typed and valid, it is often overly restrictive. The only value you
could call the resulting typed function with is the null function reference, but
we'd like to call it with non-null function references that happen to be of the
correct type. Therefore, `f.typed<Option<Func>, ()>()` is also allowed in this
case, even though `Option<Func>` represents `(ref null func)` which is the
supertype, not subtype, of `(ref null <func type index>)`. This does imply some
minimal dynamic type checks in this case, but it is supported for better
ergonomics, to enable passing non-null references into the function.

We can investigate whether it is possible to use generic type parameters and
combinators to define Rust types that precisely match concrete reference types
in future, follow-up pull requests. But for now, we've made things usable, at
least.

Finally, this also takes the first baby step towards adding support for the Wasm
GC proposal. Right now the only thing that is supported is `nofunc` references,
and this was mainly to make testing function reference subtyping easier. But
that does mean that supporting `nofunc` references entailed also adding a
`wasmtime::NoFunc` type as well as the `Config::wasm_gc(enabled)` knob. So we
officially have an in-progress implementation of Wasm GC in Wasmtime after this
PR lands!

Fixes https://github.com/bytecodealliance/wasmtime/issues/6455

* Fix WAT in test to be valid

* Check that dependent features are enabled for function-references and GC

* Remove unnecessary engine parameters from a few methods

Ever since `FuncType`'s internal `RegisteredType` holds onto its own `Engine`,
we don't need these anymore.

Still useful to keep the `Engine` parameter around for the `ensure_matches`
methods because that can be used to check correct store/engine usage for
embedders.

* Add missing dependent feature enabling for some tests

* Remove copy-paste bit from test

* match self to show it is uninhabited

* Add a missing `is_v128` method

* Short circuit a few func type comparisons

* Turn comment into part of doc comment

* Add test for `Global::new` and subtyping

* Add tests for embedder API, tables, and subtyping

* Add an embedder API test for setting globals and subtyping

* Construct realloc's type from its index, rather than from scratch

* Help LLVM better optimize our dynamic type checks in `TypedFunc::call_raw`

* Fix call benchmark compilation

* Change `WasmParams::into_abi` to take the whole func type instead of iter of params

* Fix doc links

prtest:full

* Fix size assertion on s390x
2024-02-20 20:33:28 +00:00
Pat Hickey 2b00a541f3 Make wasi-common self-contained, deprecate exports from wasmtime-wasi (#7881)
* WIP: try to make wasi-common self contained.

* rebase: cargo.lock

* remove all dependencies between wasi-common and wasmtime-wasi

* use wasi-common directly throughout tests, benches, examples, cli run

* wasi-threads: use wasi-common's maybe_exit_on_error in spawned thread

not a very modular design, but at this point wasi-common and
wasi-threads are forever wed

* fix wasmtime's docs

* re-introduce wasmtime-wasi's exports of wasi-common definitions behind deprecated

* factor out determining i32 process exit code

and remove libc dep because rustix provides the same constant

* commands/run: inline the logic about aborting on trap

since this is the sole place in the codebase its used

* Add high-level summary to wasi-common's top-level doc comment.

* c-api: fix use of wasi_cap_std_sync => wasi_common::sync, wasmtime_wasi => wasi_common

* fix tokio example

* think better of combining downcast and masking into one method

* fix references to wasmtime_wasi in docs

prtest:full

* benches: use wasi-common

* cfg-if around use of rustix::process because that doesnt exist on windows

* wasi-common: include tests, caught by verify-publish

* fix another bench

* exit requires wasmtime dep. caught by verify-publish.
2024-02-13 17:57:58 +00:00
Andrew Brown c2fc362da2 mpk: enable MPK if available in CI (#7815)
* mpk: enable MPK if available in CI

After discussing several options for testing MPK in CI, this stopgap
measure at least provides some coverage. Other options include
maintaining a separate MPK-enabled CI runner (configuration is not
transparent, hard to maintain) or running the MPK-enabled tests in a
system-mode QEMU VM (tricky to get right, also hard to maintain). For
now, those of us at the Cranelift meeting agreed this at least gets some
CI testing for the MPK bits, which shouldn't be changing too often.
Since not all GitHub runners have MPK available, we only set the
`WASMTIME_TEST_FORCE_MPK` environment variable when it is. This change
also emits a warning to the GitHub logs in either case for easier
troubleshooting (e.g., to attempt to provide context if MPK logic breaks
and is only found in a later CI run).

prtest:full

* review: create a separate matrix entry

As requested by @alexcrichton, this change limits the MPK testing (and
the associated warnings) to a new matrix target: `Test Linux x86_64 with
MPK`.
2024-02-03 18:33:16 +00:00
Dave Bakker 649e6b5ad2 WASI: remove unnecessary Sync constraints (#7802)
* Remove `+ Sync` constraints from preview2 implementation

* Only use mutable references in WasiView to guarantee unique access to Preview2 resources. Removed the _mut suffixes to align with WasiHttpView.

* Always use Descriptor::Directory for directories, regardless of whether they were preopened or opened using open_at. This fixes build errors regarding overlapping mutable lifetimes introduced in the previous commit.

* Remove some more `+ Sync`s

* Remove one more

* typo

* Fix build errors on Rust <= 1.73. Code already compiled fine on >= 1.74
2024-01-22 17:46:36 +00:00
Bruce Mitchener 93580f247c examples: Don't fread() within assert(...). (#7803)
This is fine in debug builds but release builds without assertions
results in the file data not being read.
2024-01-22 17:10:14 +00:00
Tyler Rockwood b5169d9902 examples: add component model example (#7759)
Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>
2024-01-09 21:55:05 +00:00
Katie Bell 20079d9789 Add WASI async example and update the Rust WASI docs. (#7752) 2024-01-05 16:34:37 +00:00
Dan Gohman 8573214213 Update several dependencies to windows-sys 0.52. (#7740)
* Update several dependencies to windows-sys 0.52.

Update cap-std, rustix, io-extras, errno, fd-lock, fs-set-times, and
winx to versions which use windows-sys 0.52.

I started out hoping that everything could be updated to
windows-sys 0.52, however tokio and mio have not yet updated to
windows-sys 0.52 due to supporting an older MSRV.

* Link the C++ examples with CoreFoundation.

This is needed due to the iana-time-zone support.

prtest:full

* Fix compilation on non-Apple platfoms.

* Fix compilation on Apple platforms.
2024-01-03 05:50:36 +00:00
Alex Crichton 21c065e3a7 Increase stack size in examples/threads.c (#7651)
This commit is an attempt to address the CI failure popping up in #7636.
I can reproduce the failure locally and it appears to be due to the fact
that macOS is giving spawned threads via `pthread_create` a 512K stack
by default. Cranelift when compiled in debug mode is taking more stack
than this (but working in release mode). I was talking with Trevor and
Jamey about possible ways to reduce the stack size here but for now I'm
going with Jamey's suggestion of increasing the stack size as the best
course of action for now.
2023-12-06 22:18:59 +00:00
Andrew Brown 57efd60879 mpk: add an example testing the memory limits (#7609)
* mpk: allow checking for MPK without a config instance

It is inconvenient to have to construct a `PoolingAllocationConfig` in
order to check if memory protection keys are available. This removes
the unused `&self` restriction.

* mpk: improve logging of calculated slab layout

When double-checking the slab layout calculations it is quite convenient
to see the total slab size. This helps in correlating with mapped
regions.

* mpk: add an example testing the memory limits

This adds an example that can be run with `cargo run --example mpk`. Not
only does the example demonstrate how to build a pool-allocated engine
that uses MPK, it performs an exponential search to find the maximum
number of slots the system can support, with and without MPK.

* review: document Linux requirement

* review: `env_logger::init`

* review: replace `proc-maps` with manual parsing

* vet: audit `bytesize`

* fix: provide `main` for non-Linux systems

* fix: move `cfg` to avoid unused code
2023-12-02 00:46:12 +00:00
Tyler Rockwood f8fee9385d add clang format (#7601)
* add clang-format

We chose WebKit style because out of all the builtin styles it seems the
closest to what already exists in wasmtime.

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: don't reorder headers

The order here matters

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: apply clang-format

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* fiber: apply clang-format

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* runtime: apply clang-format

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* examples: apply clang format

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* tests: apply clang-format

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* ci: add clang-format checks

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* clang-format: keep braces on the same line

This is more the existing style

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* remove clang-format

Just use the tool defaults (LLVM)

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* Fix ci name

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* manually reformat a couple of comments

prtest:full

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* disable formatting for doc-wasm.h

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* manually reformat wasmtime.h

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* disable formatting

To prevent a link from being broken

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* examples: fixing build commands

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* fix parameter comment

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

---------

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>
2023-11-29 18:39:04 +00:00
Alex Crichton 5856590fae Configure workspace lints, enable running some Clippy lints on CI (#7561)
* Configure Rust lints at the workspace level

This commit adds necessary configuration knobs to have lints configured
at the workspace level in Wasmtime rather than the crate level. This
uses a feature of Cargo first released with 1.74.0 (last week) of the
`[workspace.lints]` table. This should help create a more consistent set
of lints applied across all crates in our workspace in addition to
possibly running select clippy lints on CI as well.

* Move `unused_extern_crates` to the workspace level

This commit configures a `deny` lint level for the
`unused_extern_crates` lint to the workspace level rather than the
previous configuration at the individual crate level.

* Move `trivial_numeric_casts` to workspace level

* Change workspace lint levels to `warn`

CI will ensure that these don't get checked into the codebase and
otherwise provide fewer speed bumps for in-process development.

* Move `unstable_features` lint to workspace level

* Move `unused_import_braces` lint to workspace level

* Start running Clippy on CI

This commit configures our CI to run `cargo clippy --workspace` for all
merged PRs. Historically this hasn't been all the feasible due to the
amount of configuration required to control the number of warnings on
CI, but with Cargo's new `[lint]` table it's possible to have a
one-liner to silence all lints from Clippy by default. This commit by
default sets the `all` lint in Clippy to `allow` to by-default disable
warnings from Clippy. The goal of this PR is to enable selective access
to Clippy lints for Wasmtime on CI.

* Selectively enable `clippy::cast_sign_loss`

This would have fixed #7558 so try to head off future issues with that
by warning against this situation in a few crates. This lint is still
quite noisy though for Cranelift for example so it's not worthwhile at
this time to enable it for the whole workspace.

* Fix CI error

prtest:full
2023-11-20 23:23:41 +00:00
Xinzhao Xu d9be6e113c Fix the wrong cmake path in wasi example comments (#7343) 2023-10-24 14:21:06 +00:00
Tyler Rockwood 85c0a2df54 Switch to simpler fuel APIs (#7298)
In an effort to simplify the many fuel related APIs, simplify the
interface here to a single counter with get and set methods.
Additionally the async yield is reduced to an interval of the total fuel
instead of injecting fuel, so it's easy to still reason about how much
fuel is left even with yielding turned on.

Internally this works by keeping two counters - one the VM uses to
increment towards 0 for fuel, the other to track how much is in
"reserve". Then when we're out of gas, we pull from the reserve to
refuel and continue. We use the reserve in two cases: one for overflow
of the fuel (which is an i64 and the API expresses fuel as u64) and the
other for async yieling, which then the yield interval acts as a cap to
how much we can refuel with.

This also means that `get_fuel` can return the full range of `u64`
before this change it could only return up to `i64::MAX`. This is
important because this PR is removing the functionality to track fuel
consumption, and this makes the API less error prone for embedders to
track consumption themselves.

Careful to note that the VM counter that is stored as `i64` can be
positive if an instruction "costs" multiple units of fuel when the fuel
ran out.

prtest:full

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>
2023-10-23 19:50:23 +00:00
Xinzhao Xu ce796a9684 Fix typo in examples/threads.rs (#7328) 2023-10-23 04:21:12 +00:00
Tyler Rockwood 37cf8e1e75 Async support in the C API (#7106)
* c-api: Add a feature for async

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Add support for async config

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Add support for calling async functions

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Add ability to yield execution of Wasm in a store

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Introduce wasmtime_linker_instantiate_async

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Support defining async host functions

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* gitignore: ignore cmake cache for examples

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* examples: Add example of async API in C

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Consolidate async functionality into a single place

Put all the async stuff in it's own header and own rust source file

Also remove the wasmtime_async_continuation_new function, users can just
allocate it directly.

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Make async function safe

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Remove wasmtime_call_future_get_results

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Simplify CHostCallFuture

Move the result translation and hostcall_val_storage usage into an async
function

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Simplify C continuation implementation

Remove the caller, which means that we don't need another struct for the
future implementation.

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Improve async.h documentation

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Cleanup from previous changes

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* examples: Fix example

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Simplify continuation callback

This gives more duality with calling an async function and also means
that the implementation can pretty much mirror the sync version.

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Fix async.h documentation

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Fix documentation for async.h

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: Review feedback

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* examples: Downgrade async.cpp example to C++11

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* c-api: initialize continuation with a panic callback

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

* prtest:full

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>

---------

Signed-off-by: Tyler Rockwood <rockwood@redpanda.com>
2023-10-03 13:42:56 +00:00
Alex Crichton 3cdc63bcc8 Bump wasm-tools crates (#7094)
* Bump wasm-tools crates

Two major changes/reasons for this update:

* Primarily pulling in support for semicolons-in-WIT files. Semicolons are
  not currently required, though, so I'll follow-up later with actual
  semicolons.

* The syntax for parsing `(if ...)` was fixed in `wast`. Previously it
  did not require `(then ...)` but this is required by the spec. New
  spec tests require this as well. This breaks existing text format
  tests which don't use `(then ...)` inside of an `(if ...)`. Most tests
  were updated by hand but `embenchen_*` tests were updated by running
  through the old parser to produce non-s-expression using code.

* Fix an example `*.wat`
2023-09-27 14:36:00 +00:00