wasmtime_fuzzing/generators/
async_config.rs

1use arbitrary::{Arbitrary, Unstructured};
2use std::time::Duration;
3
4/// Configuration for async support within a store.
5///
6/// Note that the `Arbitrary` implementation for this type always returns
7/// `Disabled` because this is something that is statically chosen if the fuzzer
8/// has support for async.
9#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10pub enum AsyncConfig {
11    /// No async support enabled.
12    Disabled,
13    /// Async support is enabled and cooperative yielding is done with fuel.
14    YieldWithFuel(u64),
15    /// Async support is enabled and cooperative yielding is done with epochs.
16    YieldWithEpochs {
17        /// Duration between epoch ticks.
18        dur: Duration,
19        /// Number of ticks between yields.
20        ticks: u64,
21    },
22}
23
24impl AsyncConfig {
25    /// Applies this async configuration to the `wasmtime::Config` provided to
26    /// ensure it's ready to execute with the resulting modules.
27    pub fn configure(&self, config: &mut wasmtime::Config) {
28        match self {
29            AsyncConfig::Disabled => {}
30            AsyncConfig::YieldWithFuel(_) => {
31                config.async_support(true).consume_fuel(true);
32            }
33            AsyncConfig::YieldWithEpochs { .. } => {
34                config.async_support(true).epoch_interruption(true);
35            }
36        }
37    }
38}
39
40impl<'a> Arbitrary<'a> for AsyncConfig {
41    fn arbitrary(_: &mut Unstructured<'a>) -> arbitrary::Result<AsyncConfig> {
42        Ok(AsyncConfig::Disabled)
43    }
44}