uni_plugin_wasm/
buffer.rs1use std::sync::Arc;
10
11pub struct WasmIpcBuffer {
17 pub ptr: u32,
19 pub len: u32,
21 free: Arc<dyn Fn(u32, u32) + Send + Sync>,
24}
25
26impl std::fmt::Debug for WasmIpcBuffer {
27 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28 f.debug_struct("WasmIpcBuffer")
29 .field("ptr", &self.ptr)
30 .field("len", &self.len)
31 .finish_non_exhaustive()
32 }
33}
34
35impl WasmIpcBuffer {
36 #[must_use]
38 pub fn new(ptr: u32, len: u32, free: Arc<dyn Fn(u32, u32) + Send + Sync>) -> Self {
39 Self { ptr, len, free }
40 }
41}
42
43impl Drop for WasmIpcBuffer {
44 fn drop(&mut self) {
45 (self.free)(self.ptr, self.len);
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn wasm_ipc_buffer_calls_free_on_drop() {
55 let counter = Arc::new(std::sync::atomic::AtomicU32::new(0));
56 let c2 = Arc::clone(&counter);
57 let free: Arc<dyn Fn(u32, u32) + Send + Sync> = Arc::new(move |_p, _l| {
58 c2.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
59 });
60 {
61 let _b = WasmIpcBuffer::new(0x1000, 64, free);
62 }
63 assert_eq!(counter.load(std::sync::atomic::Ordering::SeqCst), 1);
64 }
65}