diff --git a/lib/c-api/src/wasm_c_api/externals/function.rs b/lib/c-api/src/wasm_c_api/externals/function.rs index 7db2b533d4d..da8d851fe38 100644 --- a/lib/c-api/src/wasm_c_api/externals/function.rs +++ b/lib/c-api/src/wasm_c_api/externals/function.rs @@ -6,7 +6,7 @@ use super::CApiExternTag; use std::convert::TryInto; use std::ffi::c_void; use std::mem::MaybeUninit; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use wasmer_api::{Function, RuntimeError, Val}; #[derive(Debug, Clone)] @@ -110,7 +110,7 @@ pub unsafe extern "C" fn wasm_func_new_with_env( #[repr(C)] struct WrapperEnv { env: *mut c_void, - env_finalizer: Arc>, + env_finalizer: Arc>>, } impl wasmer_api::WasmerEnv for WrapperEnv {} @@ -122,8 +122,12 @@ pub unsafe extern "C" fn wasm_func_new_with_env( impl Drop for WrapperEnv { fn drop(&mut self) { - if let Some(env_finalizer) = *self.env_finalizer { - unsafe { (env_finalizer)(self.env as _) } + if let Ok(mut guard) = self.env_finalizer.lock() { + if Arc::strong_count(&self.env_finalizer) == 1 { + if let Some(env_finalizer) = guard.take() { + unsafe { (env_finalizer)(self.env as _) }; + } + } } } } @@ -166,7 +170,7 @@ pub unsafe extern "C" fn wasm_func_new_with_env( func_sig, WrapperEnv { env, - env_finalizer: Arc::new(env_finalizer), + env_finalizer: Arc::new(Mutex::new(env_finalizer)), }, trampoline, );