* Remove global state for trap registration There's a number of changes brought about in this commit, motivated by a few things. One motivation was to remove an instance of using `lazy_static!` in an effort to remove global state and encapsulate it wherever possible. A second motivation came when investigating a slowly-compiling wasm module (a bit too slowly) where a good chunk of time was spent in managing trap registrations. The specific change made here is that `TrapRegistry` is now stored inside of a `Compiler` instead of inside a global. Additionally traps are "bulk registered" for a module rather than one-by-one. This form of bulk-registration allows optimizing the locks used here, where a lock is only held for a module at-a-time instead of once-per-function. With these changes the "unregister" logic has also been tweaked a bit here and there to continue to work. As a nice side effect the `Compiler` type now has one fewer field that requires actual mutability and has been updated for multi-threaded compilation, nudging us closer to a world where we can support multi-threaded compilation. Yay! In terms of performance improvements, a local wasm test file that previously took 3 seconds to compile is now 10% faster to compile, taking ~2.7 seconds now. * Perform trap resolution after unwinding This avoids taking locks in signal handlers which feels a bit iffy... * Remove `TrapRegistration::dummy()` Avoid an case where you're trying to lookup trap information from a dummy module for something that happened in a different module. * Tweak some comments
31 lines
1.0 KiB
Rust
31 lines
1.0 KiB
Rust
use super::create_handle::create_handle;
|
|
use crate::Store;
|
|
use crate::{TableType, ValType};
|
|
use anyhow::{bail, Result};
|
|
use wasmtime_environ::entity::PrimaryMap;
|
|
use wasmtime_environ::{wasm, Module};
|
|
use wasmtime_runtime::InstanceHandle;
|
|
|
|
pub fn create_handle_with_table(store: &Store, table: &TableType) -> Result<InstanceHandle> {
|
|
let mut module = Module::new();
|
|
|
|
let table = wasm::Table {
|
|
minimum: table.limits().min(),
|
|
maximum: table.limits().max(),
|
|
ty: match table.element() {
|
|
ValType::FuncRef => wasm::TableElementType::Func,
|
|
_ => bail!("cannot support {:?} as a table element", table.element()),
|
|
},
|
|
};
|
|
let tunable = Default::default();
|
|
|
|
let table_plan = wasmtime_environ::TablePlan::for_table(table, &tunable);
|
|
let table_id = module.table_plans.push(table_plan);
|
|
module.exports.insert(
|
|
"table".to_string(),
|
|
wasmtime_environ::Export::Table(table_id),
|
|
);
|
|
|
|
create_handle(module, store, PrimaryMap::new(), Box::new(()))
|
|
}
|