Remove global state for trap registration (#909)
* 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
This commit is contained in:
@@ -181,7 +181,7 @@ impl Global {
|
||||
if val.ty() != *ty.content() {
|
||||
bail!("value provided does not match the type of this global");
|
||||
}
|
||||
let (wasmtime_export, wasmtime_state) = generate_global_export(&ty, val)?;
|
||||
let (wasmtime_export, wasmtime_state) = generate_global_export(store, &ty, val)?;
|
||||
Ok(Global {
|
||||
inner: Rc::new(GlobalInner {
|
||||
_store: store.clone(),
|
||||
@@ -321,7 +321,7 @@ impl Table {
|
||||
/// Returns an error if `init` does not match the element type of the table.
|
||||
pub fn new(store: &Store, ty: TableType, init: Val) -> Result<Table> {
|
||||
let item = into_checked_anyfunc(init, store)?;
|
||||
let (mut wasmtime_handle, wasmtime_export) = generate_table_export(&ty)?;
|
||||
let (mut wasmtime_handle, wasmtime_export) = generate_table_export(store, &ty)?;
|
||||
|
||||
// Initialize entries with the init value.
|
||||
match wasmtime_export {
|
||||
@@ -473,7 +473,7 @@ impl Memory {
|
||||
/// type's configuration. All WebAssembly memory is initialized to zero.
|
||||
pub fn new(store: &Store, ty: MemoryType) -> Memory {
|
||||
let (wasmtime_handle, wasmtime_export) =
|
||||
generate_memory_export(&ty).expect("generated memory");
|
||||
generate_memory_export(store, &ty).expect("generated memory");
|
||||
Memory {
|
||||
_store: store.clone(),
|
||||
ty,
|
||||
|
||||
Reference in New Issue
Block a user