Skip to content

Commit 3732df7

Browse files
committed
fix(wasix): Linker must retain the Engine
1 parent 0d93bc4 commit 3732df7

File tree

9 files changed

+63
-41
lines changed

9 files changed

+63
-41
lines changed

examples/wasi.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
4343

4444
println!("Compiling module...");
4545
// Let's compile the Wasm module.
46-
let data =
47-
wasmer_wasix::runtime::module_cache::HashedModuleData::new_sha256(wasm_bytes.clone());
46+
let data = wasmer_wasix::runtime::module_cache::HashedModuleData::new(wasm_bytes.clone());
4847
let module = runtime.load_hashed_module_sync(data)?;
4948

5049
// Create a pipe for the module's stdout.

lib/cli/src/commands/run/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ use wasmer_wasix::{
5050
MappedCommand, MappedDirectory, Runner,
5151
},
5252
runtime::{
53-
module_cache::CacheError, package_loader::PackageLoader, resolver::QueryError,
53+
module_cache::{CacheError, HashedModuleData},
54+
package_loader::PackageLoader,
55+
resolver::QueryError,
5456
task_manager::VirtualTaskManagerExt,
5557
},
5658
Runtime, WasiError,
@@ -843,15 +845,17 @@ impl ExecutableTarget {
843845
match TargetOnDisk::from_file(path)? {
844846
TargetOnDisk::WebAssemblyBinary | TargetOnDisk::Wat => {
845847
let wasm = std::fs::read(path)?;
848+
let module_data = HashedModuleData::new(wasm);
849+
let module_hash = module_data.hash().clone();
846850

847851
pb.set_message("Compiling to WebAssembly");
848852
let module = runtime
849-
.load_module_sync(&wasm)
853+
.load_hashed_module_sync(module_data, None)
850854
.with_context(|| format!("Unable to compile \"{}\"", path.display()))?;
851855

852856
Ok(ExecutableTarget::WebAssembly {
853857
module,
854-
module_hash: ModuleHash::xxhash(&wasm),
858+
module_hash,
855859
path: path.to_path_buf(),
856860
})
857861
}

lib/wasix/src/bin_factory/exec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub async fn spawn_load_module(
8989
wasm: HashedModuleData,
9090
runtime: &Arc<dyn Runtime + Send + Sync + 'static>,
9191
) -> Result<Module, SpawnError> {
92-
match runtime.load_hashed_module(wasm).await {
92+
match runtime.load_hashed_module(wasm, None).await {
9393
Ok(module) => Ok(module),
9494
Err(err) => {
9595
tracing::error!(

lib/wasix/src/bin_factory/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl BinFactory {
8686
// Execute
8787
match executable {
8888
Executable::Wasm(bytes) => {
89-
let data = HashedModuleData::new_xxhash(bytes.clone());
89+
let data = HashedModuleData::new(bytes.clone());
9090
spawn_exec_wasm(data, name.as_str(), env, &self.runtime).await
9191
}
9292
Executable::BinaryPackage(pkg) => {

lib/wasix/src/os/command/builtins/cmd_wasmer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl CmdWasmer {
139139
spawn_exec(binary, name, env, &self.runtime).await
140140
}
141141
Executable::Wasm(bytes) => {
142-
let data = HashedModuleData::new_xxhash(bytes);
142+
let data = HashedModuleData::new(bytes);
143143
spawn_exec_wasm(data, name, env, &self.runtime).await
144144
}
145145
}

lib/wasix/src/runtime/mod.rs

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::{
1717

1818
use futures::future::BoxFuture;
1919
use virtual_net::{DynVirtualNetworking, VirtualNetworking};
20-
use wasmer::{CompileError, Module, RuntimeError};
20+
use wasmer::{CompileError, Engine, Module, RuntimeError};
2121
use wasmer_wasix_types::wasi::ExitCode;
2222

2323
#[cfg(feature = "journal")]
@@ -76,14 +76,14 @@ where
7676
fn source(&self) -> Arc<dyn Source + Send + Sync>;
7777

7878
/// Get a [`wasmer::Engine`] for module compilation.
79-
fn engine(&self) -> wasmer::Engine {
80-
wasmer::Engine::default()
79+
fn engine(&self) -> Engine {
80+
Engine::default()
8181
}
8282

8383
fn engine_with_suggested_opts(
8484
&self,
8585
suggested_opts: &SuggestedCompilerOptimizations,
86-
) -> Result<wasmer::Engine, CompileError> {
86+
) -> Result<Engine, CompileError> {
8787
let mut engine = self.engine();
8888
engine.with_opts(&WasmerSuggestedCompilerOptimizations {
8989
pass_params: suggested_opts.pass_params,
@@ -157,7 +157,7 @@ where
157157
fn load_module<'a>(&'a self, wasm: &'a [u8]) -> BoxFuture<'a, Result<Module, SpawnError>> {
158158
let engine = self.engine();
159159
let module_cache = self.module_cache();
160-
let data = HashedModuleData::new_xxhash(wasm.to_vec());
160+
let data = HashedModuleData::new(wasm.to_vec());
161161
let task = async move { load_module(&engine, &module_cache, &data).await };
162162
Box::pin(task)
163163
}
@@ -178,16 +178,21 @@ where
178178
fn load_hashed_module(
179179
&self,
180180
module: HashedModuleData,
181+
engine: Option<&Engine>,
181182
) -> BoxFuture<'_, Result<Module, SpawnError>> {
182-
let engine = self.engine();
183+
let engine = engine.cloned().unwrap_or_else(|| self.engine());
183184
let module_cache = self.module_cache();
184185
let task = async move { load_module(&engine, &module_cache, &module).await };
185186
Box::pin(task)
186187
}
187188

188189
/// Synchronous version of [`Self::load_hashed_module`].
189-
fn load_hashed_module_sync(&self, wasm: HashedModuleData) -> Result<Module, SpawnError> {
190-
InlineWaker::block_on(self.load_hashed_module(wasm))
190+
fn load_hashed_module_sync(
191+
&self,
192+
wasm: HashedModuleData,
193+
engine: Option<&Engine>,
194+
) -> Result<Module, SpawnError> {
195+
InlineWaker::block_on(self.load_hashed_module(wasm, engine))
191196
}
192197

193198
/// Callback thats invokes whenever the instance is tainted, tainting can occur
@@ -223,7 +228,7 @@ pub type DynRuntime = dyn Runtime + Send + Sync;
223228
// implementing [`Runtime::load_module`], so custom logic can be added on top.
224229
#[tracing::instrument(level = "debug", skip_all)]
225230
pub async fn load_module(
226-
engine: &wasmer::Engine,
231+
engine: &Engine,
227232
module_cache: &(dyn ModuleCache + Send + Sync),
228233
module: &HashedModuleData,
229234
) -> Result<Module, crate::SpawnError> {
@@ -291,7 +296,7 @@ pub struct PluggableRuntime {
291296
pub http_client: Option<DynHttpClient>,
292297
pub package_loader: Arc<dyn PackageLoader + Send + Sync>,
293298
pub source: Arc<dyn Source + Send + Sync>,
294-
pub engine: wasmer::Engine,
299+
pub engine: Engine,
295300
pub module_cache: Arc<dyn ModuleCache + Send + Sync>,
296301
pub tty: Option<Arc<dyn TtyBridge + Send + Sync>>,
297302
#[cfg(feature = "journal")]
@@ -347,7 +352,7 @@ impl PluggableRuntime {
347352
self
348353
}
349354

350-
pub fn set_engine(&mut self, engine: wasmer::Engine) -> &mut Self {
355+
pub fn set_engine(&mut self, engine: Engine) -> &mut Self {
351356
self.engine = engine;
352357
self
353358
}
@@ -416,7 +421,7 @@ impl Runtime for PluggableRuntime {
416421
Arc::clone(&self.source)
417422
}
418423

419-
fn engine(&self) -> wasmer::Engine {
424+
fn engine(&self) -> Engine {
420425
self.engine.clone()
421426
}
422427

@@ -462,7 +467,7 @@ pub struct OverriddenRuntime {
462467
http_client: Option<DynHttpClient>,
463468
package_loader: Option<Arc<dyn PackageLoader + Send + Sync>>,
464469
source: Option<Arc<dyn Source + Send + Sync>>,
465-
engine: Option<wasmer::Engine>,
470+
engine: Option<Engine>,
466471
module_cache: Option<Arc<dyn ModuleCache + Send + Sync>>,
467472
tty: Option<Arc<dyn TtyBridge + Send + Sync>>,
468473
#[cfg(feature = "journal")]
@@ -518,7 +523,7 @@ impl OverriddenRuntime {
518523
self
519524
}
520525

521-
pub fn with_engine(mut self, engine: wasmer::Engine) -> Self {
526+
pub fn with_engine(mut self, engine: Engine) -> Self {
522527
self.engine.replace(engine);
523528
self
524529
}
@@ -587,7 +592,7 @@ impl Runtime for OverriddenRuntime {
587592
}
588593
}
589594

590-
fn engine(&self) -> wasmer::Engine {
595+
fn engine(&self) -> Engine {
591596
if let Some(engine) = self.engine.clone() {
592597
engine
593598
} else {
@@ -646,17 +651,16 @@ impl Runtime for OverriddenRuntime {
646651
}
647652
}
648653

649-
fn load_module<'a>(&'a self, wasm: &'a [u8]) -> BoxFuture<'a, Result<Module, SpawnError>> {
650-
if self.engine.is_some() || self.module_cache.is_some() {
651-
let engine = self.engine();
652-
let module_cache = self.module_cache();
653-
654-
let data = HashedModuleData::new_xxhash(wasm.to_vec());
655-
let task = async move { load_module(&engine, &module_cache, &data).await };
654+
fn load_module<'a>(&'a self, data: &[u8]) -> BoxFuture<'a, Result<Module, SpawnError>> {
655+
#[allow(deprecated)]
656+
if let (Some(engine), Some(module_cache)) = (&self.engine, self.module_cache.clone()) {
657+
let engine = engine.clone();
658+
let hashed_data = HashedModuleData::new(data.to_vec());
659+
let task = async move { load_module(&engine, &module_cache, &hashed_data).await };
656660
Box::pin(task)
657661
} else {
658-
#[allow(deprecated)]
659-
self.inner.load_module(wasm)
662+
let data = data.to_vec();
663+
Box::pin(async move { self.inner.load_module(&data).await })
660664
}
661665
}
662666

@@ -672,22 +676,27 @@ impl Runtime for OverriddenRuntime {
672676
fn load_hashed_module(
673677
&self,
674678
data: HashedModuleData,
679+
engine: Option<&Engine>,
675680
) -> BoxFuture<'_, Result<Module, SpawnError>> {
676681
if self.engine.is_some() || self.module_cache.is_some() {
677682
let engine = self.engine();
678683
let module_cache = self.module_cache();
679684
let task = async move { load_module(&engine, &module_cache, &data).await };
680685
Box::pin(task)
681686
} else {
682-
self.inner.load_hashed_module(data)
687+
self.inner.load_hashed_module(data, engine)
683688
}
684689
}
685690

686-
fn load_hashed_module_sync(&self, wasm: HashedModuleData) -> Result<Module, SpawnError> {
691+
fn load_hashed_module_sync(
692+
&self,
693+
wasm: HashedModuleData,
694+
engine: Option<&Engine>,
695+
) -> Result<Module, SpawnError> {
687696
if self.engine.is_some() || self.module_cache.is_some() {
688-
InlineWaker::block_on(self.load_hashed_module(wasm))
697+
InlineWaker::block_on(self.load_hashed_module(wasm, engine))
689698
} else {
690-
self.inner.load_hashed_module_sync(wasm)
699+
self.inner.load_hashed_module_sync(wasm, engine)
691700
}
692701
}
693702
}

lib/wasix/src/runtime/module_cache/hashed_module.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ pub struct HashedModuleData {
2020
}
2121

2222
impl HashedModuleData {
23+
pub fn new(bytes: impl Into<OwnedBuffer>) -> Self {
24+
Self::new_sha256(bytes)
25+
}
26+
2327
pub fn new_sha256(bytes: impl Into<OwnedBuffer>) -> Self {
2428
let wasm = bytes.into();
2529
let hash = ModuleHash::sha256(&wasm);

lib/wasix/src/state/env.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ impl WasiEnv {
421421
let pid = self.process.pid();
422422

423423
let mut store = store.as_store_mut();
424+
let engine = self.runtime().engine();
424425
let mut func_env = WasiFunctionEnv::new(&mut store, self);
425426

426427
let is_dl = super::linker::is_dynamically_linked(&module);
@@ -451,6 +452,7 @@ impl WasiEnv {
451452

452453
// TODO: make stack size configurable
453454
Linker::new(
455+
engine,
454456
&module,
455457
&mut store,
456458
memory,

lib/wasix/src/state/linker.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,8 @@ use tracing::trace;
277277
use virtual_fs::{AsyncReadExt, FileSystem, FsError};
278278
use virtual_mio::InlineWaker;
279279
use wasmer::{
280-
AsStoreMut, AsStoreRef, ExportError, Exportable, Extern, ExternType, Function, FunctionEnv,
281-
FunctionEnvMut, FunctionType, Global, GlobalType, ImportType, Imports, Instance,
280+
AsStoreMut, AsStoreRef, Engine, ExportError, Exportable, Extern, ExternType, Function,
281+
FunctionEnv, FunctionEnvMut, FunctionType, Global, GlobalType, ImportType, Imports, Instance,
282282
InstantiationError, Memory, MemoryError, Module, RuntimeError, StoreMut, Table, Tag, Type,
283283
Value, WasmTypeList, WASM_PAGE_SIZE,
284284
};
@@ -817,6 +817,8 @@ struct InstanceGroupState {
817817

818818
// There is only one LinkerState for all instance groups
819819
struct LinkerState {
820+
engine: Engine,
821+
820822
main_module: Module,
821823
main_module_dylink_info: DylinkInfo,
822824

@@ -947,6 +949,7 @@ impl Linker {
947949
/// running, and a Linker instance is returned which can then be used for the
948950
/// loading/linking of further side modules.
949951
pub fn new(
952+
engine: Engine,
950953
main_module: &Module,
951954
store: &mut StoreMut<'_>,
952955
memory: Option<Memory>,
@@ -1082,6 +1085,7 @@ impl Linker {
10821085
};
10831086

10841087
let mut linker_state = LinkerState {
1088+
engine,
10851089
main_module: main_module.clone(),
10861090
main_module_dylink_info: dylink_section,
10871091
side_modules: BTreeMap::new(),
@@ -2310,14 +2314,14 @@ impl LinkerState {
23102314
}
23112315

23122316
(
2313-
HashedModuleData::new_sha256(bytes),
2317+
HashedModuleData::new(bytes),
23142318
Some((full_path, ld_library_path)),
23152319
)
23162320
}
2317-
DlModuleSpec::Memory { bytes, .. } => (HashedModuleData::new_sha256(bytes), None),
2321+
DlModuleSpec::Memory { bytes, .. } => (HashedModuleData::new(bytes), None),
23182322
};
23192323

2320-
let module = runtime.load_hashed_module_sync(module_data)?;
2324+
let module = runtime.load_hashed_module_sync(module_data, Some(&self.engine))?;
23212325

23222326
let dylink_info = parse_dylink0_section(&module)?;
23232327

0 commit comments

Comments
 (0)