forest/shim/machine/
mod.rs

1// Copyright 2019-2025 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4mod manifest;
5pub use manifest::{BuiltinActor, BuiltinActorManifest};
6
7use fvm2::machine::MultiEngine as MultiEngine_v2;
8use fvm3::engine::MultiEngine as MultiEngine_v3;
9use fvm4::engine::MultiEngine as MultiEngine_v4;
10use std::sync::{Arc, LazyLock};
11
12pub static GLOBAL_MULTI_ENGINE: LazyLock<Arc<MultiEngine>> = LazyLock::new(Default::default);
13
14pub struct MultiEngine {
15    pub v2: MultiEngine_v2,
16    pub v3: MultiEngine_v3,
17    pub v4: MultiEngine_v4,
18}
19
20impl Default for MultiEngine {
21    fn default() -> MultiEngine {
22        MultiEngine::new(std::thread::available_parallelism().map(|x| x.get() as u32))
23    }
24}
25
26impl MultiEngine {
27    pub fn new(concurrency: Result<u32, std::io::Error>) -> MultiEngine {
28        let concurrency = concurrency.ok();
29        MultiEngine {
30            v2: Default::default(),
31            v3: concurrency.map_or_else(Default::default, MultiEngine_v3::new),
32            v4: concurrency.map_or_else(Default::default, MultiEngine_v4::new),
33        }
34    }
35}