rust_rcs_core/ffi/
async.rs

1use std::{
2    sync::{Arc, Mutex},
3    task::Waker,
4};
5
6pub struct WakerHandle {
7    pub(crate) waker: Arc<Mutex<Option<Waker>>>,
8}
9
10impl WakerHandle {
11    pub(crate) fn new(waker: &Waker) -> WakerHandle {
12        let waker = waker.clone();
13        WakerHandle {
14            waker: Arc::new(Mutex::new(Some(waker))),
15        }
16    }
17}
18
19#[no_mangle]
20pub unsafe extern "C" fn rust_async_wake_up(handle: *mut WakerHandle) {
21    if let Some(handle) = handle.as_mut() {
22        let mut guard = handle.waker.lock().unwrap();
23        if let Some(waker) = guard.take() {
24            waker.wake();
25        }
26    }
27}
28
29#[no_mangle]
30pub unsafe extern "C" fn rust_async_destroy_waker(handle: *mut WakerHandle) {
31    let _ = Box::from_raw(handle);
32}