This repository was archived by the owner on Jul 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 18
This repository was archived by the owner on Jul 10, 2025. It is now read-only.
wasmer panic when await multiple async Host function with join #194
Copy link
Copy link
Open
Labels
Description
Background
I'd like to build a service with Wasm and fp-bindgen, with both import and export function as async functions. In order to make guest functions run concurrently, I'd like to involve some function like tokio::join
or futures::future::join
to run Host's async function concurrently in guest, but run with a panic consistantly (80%)
Here is the panic message:
thread 'tokio-runtime-worker' panicked at 'Runtime error: Cannot resolve async value:
<some random error message>,
/home/linxiangdong/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fp-bindgen-support-3.0.0/src/wasmer2_host/runtime.rs:30:18
The related source code
pub fn guest_resolve_async_value(&self, async_ptr: FatPtr, result_ptr: FatPtr) {
unsafe {
self.__fp_guest_resolve_async_value
.get_unchecked()
.call(async_ptr, result_ptr)
.expect("Runtime error: Cannot resolve async value"); //panic here
}
}
Quetion
Is it possible to run host's async functions concurrently within guest's async function with join
?
Code details
My fp-bindgen protocol:
// function from host
fp_import! {
async fn read_func1();
async fn read_func2();
}
// function exported from WASM to host
fp_export! {
async fn get_feature_str();
}
Guest code:
use sample_bindings::*;
use futures::future;
#[fp_bindgen_macros::fp_export_impl(sample_bindings)]
async fn get_feature_str() {
let p = future::join(read_func1(), read_func2());
p.await;
}
Host code:
implementation of exported functions: just two empty async functions
async fn read_func1() {
}
async fn read_func2() {
}
main function:
mod spec;
use std::fs;
use crate::spec::bindings::Runtime;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();
let wasm_buf = fs::read(&args[1])?;
let rt = Runtime::new(wasm_buf)?;
println!("get_feature_str");
rt.get_feature_str().await?;
println!("get_feature_str done");
Ok(())
}