use std::sync::Arc;
pub struct WasmIpcBuffer {
pub ptr: u32,
pub len: u32,
free: Arc<dyn Fn(u32, u32) + Send + Sync>,
}
impl std::fmt::Debug for WasmIpcBuffer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WasmIpcBuffer")
.field("ptr", &self.ptr)
.field("len", &self.len)
.finish_non_exhaustive()
}
}
impl WasmIpcBuffer {
#[must_use]
pub fn new(ptr: u32, len: u32, free: Arc<dyn Fn(u32, u32) + Send + Sync>) -> Self {
Self { ptr, len, free }
}
}
impl Drop for WasmIpcBuffer {
fn drop(&mut self) {
(self.free)(self.ptr, self.len);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wasm_ipc_buffer_calls_free_on_drop() {
let counter = Arc::new(std::sync::atomic::AtomicU32::new(0));
let c2 = Arc::clone(&counter);
let free: Arc<dyn Fn(u32, u32) + Send + Sync> = Arc::new(move |_p, _l| {
c2.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
});
{
let _b = WasmIpcBuffer::new(0x1000, 64, free);
}
assert_eq!(counter.load(std::sync::atomic::Ordering::SeqCst), 1);
}
}