From 461a5abd4eeee164c87157c8aa83c52017c9a89c Mon Sep 17 00:00:00 2001 From: John Sharratt's Shared Account Date: Sat, 12 Nov 2022 14:04:28 +1100 Subject: [PATCH] Fixed the asyncify call loop which was lost in the merge --- lib/api/src/sys/native.rs | 34 +++++++++++++++++++++++++--------- lib/wasi/src/syscalls/mod.rs | 8 +++++++- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/api/src/sys/native.rs b/lib/api/src/sys/native.rs index 6042e12d7..d40a6153f 100644 --- a/lib/api/src/sys/native.rs +++ b/lib/api/src/sys/native.rs @@ -93,15 +93,31 @@ macro_rules! impl_native_traits { } rets_list.as_mut() }; - unsafe { - wasmer_vm::wasmer_call_trampoline( - store.as_store_ref().signal_handler(), - anyfunc.vmctx, - anyfunc.call_trampoline, - anyfunc.func_ptr, - args_rets.as_mut_ptr() as *mut u8, - ) - }?; + + let mut r; + loop { + r = unsafe { + wasmer_vm::wasmer_call_trampoline( + store.as_store_ref().signal_handler(), + anyfunc.vmctx, + anyfunc.call_trampoline, + anyfunc.func_ptr, + args_rets.as_mut_ptr() as *mut u8, + ) + }; + let store_mut = store.as_store_mut(); + if let Some(callback) = store_mut.inner.on_called.take() { + match callback(store_mut) { + Ok(wasmer_types::OnCalledAction::InvokeAgain) => { continue; } + Ok(wasmer_types::OnCalledAction::Finish) => { break; } + Ok(wasmer_types::OnCalledAction::Trap(trap)) => { return Err(RuntimeError::user(trap)) }, + Err(trap) => { return Err(RuntimeError::user(trap)) }, + } + } + break; + } + r?; + let num_rets = rets_list.len(); if !using_rets_array && num_rets > 0 { let src_pointer = params_list.as_ptr(); diff --git a/lib/wasi/src/syscalls/mod.rs b/lib/wasi/src/syscalls/mod.rs index 32b1da0e5..8ac89316b 100644 --- a/lib/wasi/src/syscalls/mod.rs +++ b/lib/wasi/src/syscalls/mod.rs @@ -1389,7 +1389,13 @@ pub fn fd_pwrite( offset: Filesize, nwritten: WasmPtr, ) -> Result { - trace!("wasi[{}:{}]::fd_pwrite", ctx.data().pid(), ctx.data().tid()); + trace!( + "wasi[{}:{}]::fd_pwrite (fd={}, offset={})", + ctx.data().pid(), + ctx.data().tid(), + fd, + offset, + ); // TODO: refactor, this is just copied from `fd_write`... let mut env = ctx.data(); let state = env.state.clone();