Change the injection count of fuel in a store from u32 to u64 (#3048)

* Change the injection count of fuel in a store from u32 to u64

This commit updates the type of the amount of times to inject fuel in
the `out_of_fuel_async_yield` to `u64` instead of `u32`. This should
allow effectively infinite fuel to get injected, even if a small amount
of fuel is injected per iteration.

Closes #2927
Closes #3046

* Fix tokio example
This commit is contained in:
Alex Crichton
2021-07-01 10:46:21 -05:00
committed by GitHub
parent 7453bd5f0d
commit b9985fe2e5
4 changed files with 8 additions and 8 deletions

View File

@@ -1606,7 +1606,7 @@ impl<T> Caller<'_, T> {
/// ///
/// For more information see /// For more information see
/// [`Store::out_of_fuel_async_yield`](crate::Store::out_of_fuel_async_yield) /// [`Store::out_of_fuel_async_yield`](crate::Store::out_of_fuel_async_yield)
pub fn out_of_fuel_async_yield(&mut self, injection_count: u32, fuel_to_inject: u64) { pub fn out_of_fuel_async_yield(&mut self, injection_count: u64, fuel_to_inject: u64) {
self.store self.store
.out_of_fuel_async_yield(injection_count, fuel_to_inject) .out_of_fuel_async_yield(injection_count, fuel_to_inject)
} }

View File

@@ -178,7 +178,7 @@ struct StoreInstance {
enum OutOfGas { enum OutOfGas {
Trap, Trap,
InjectFuel { InjectFuel {
injection_count: u32, injection_count: u64,
fuel_to_inject: u64, fuel_to_inject: u64,
}, },
} }
@@ -558,7 +558,7 @@ impl<T> Store<T> {
/// ///
/// This method will panic if it is not called on a store associated with an [async /// This method will panic if it is not called on a store associated with an [async
/// config](crate::Config::async_support). /// config](crate::Config::async_support).
pub fn out_of_fuel_async_yield(&mut self, injection_count: u32, fuel_to_inject: u64) { pub fn out_of_fuel_async_yield(&mut self, injection_count: u64, fuel_to_inject: u64) {
self.inner self.inner
.out_of_fuel_async_yield(injection_count, fuel_to_inject) .out_of_fuel_async_yield(injection_count, fuel_to_inject)
} }
@@ -655,7 +655,7 @@ impl<'a, T> StoreContextMut<'a, T> {
/// runs out. /// runs out.
/// ///
/// For more information see [`Store::out_of_fuel_async_yield`] /// For more information see [`Store::out_of_fuel_async_yield`]
pub fn out_of_fuel_async_yield(&mut self, injection_count: u32, fuel_to_inject: u64) { pub fn out_of_fuel_async_yield(&mut self, injection_count: u64, fuel_to_inject: u64) {
self.0 self.0
.out_of_fuel_async_yield(injection_count, fuel_to_inject) .out_of_fuel_async_yield(injection_count, fuel_to_inject)
} }
@@ -838,7 +838,7 @@ impl StoreInnermost {
self.out_of_gas_behavior = OutOfGas::Trap; self.out_of_gas_behavior = OutOfGas::Trap;
} }
fn out_of_fuel_async_yield(&mut self, injection_count: u32, fuel_to_inject: u64) { fn out_of_fuel_async_yield(&mut self, injection_count: u64, fuel_to_inject: u64) {
assert!( assert!(
self.async_support(), self.async_support(),
"cannot use `out_of_fuel_async_yield` without enabling async support in the config" "cannot use `out_of_fuel_async_yield` without enabling async support in the config"

View File

@@ -95,8 +95,8 @@ async fn run_wasm(inputs: Inputs) -> Result<(), Error> {
let mut store = Store::new(&inputs.env.engine, wasi); let mut store = Store::new(&inputs.env.engine, wasi);
// WebAssembly execution will be paused for an async yield every time it // WebAssembly execution will be paused for an async yield every time it
// consumes 10000 fuel. Fuel will be refilled u32::MAX times. // consumes 10000 fuel. Fuel will be refilled u64::MAX times.
store.out_of_fuel_async_yield(u32::MAX, 10000); store.out_of_fuel_async_yield(u64::MAX, 10000);
// Instantiate into our own unique store using the shared linker, afterwards // Instantiate into our own unique store using the shared linker, afterwards
// acquiring the `_start` function for the module and executing it. // acquiring the `_start` function for the module and executing it.

View File

@@ -392,7 +392,7 @@ fn iloop_with_fuel() {
fn fuel_eventually_finishes() { fn fuel_eventually_finishes() {
let engine = Engine::new(Config::new().async_support(true).consume_fuel(true)).unwrap(); let engine = Engine::new(Config::new().async_support(true).consume_fuel(true)).unwrap();
let mut store = Store::new(&engine, ()); let mut store = Store::new(&engine, ());
store.out_of_fuel_async_yield(u32::max_value(), 10); store.out_of_fuel_async_yield(u64::max_value(), 10);
let module = Module::new( let module = Module::new(
&engine, &engine,
" "