use std::{ sync::{LazyLock, Mutex}, task::Waker, }; use flume::Sender; use fxhash::FxHashMap; use crate::driver::UnparkHandle; static UNPARK: LazyLock>> = LazyLock::new(|| Mutex::new(FxHashMap::default())); static WAKER_SENDER: LazyLock>>> = LazyLock::new(|| Mutex::new(FxHashMap::default())); macro_rules! lock { ($x: ident) => { $x.lock() .expect("Unable to lock global map, which is unexpected") }; } pub(crate) fn register_unpark_handle(id: usize, unpark: UnparkHandle) { lock!(UNPARK).insert(id, unpark); } pub(crate) fn unregister_unpark_handle(id: usize) { lock!(UNPARK).remove(&id); } pub(crate) fn get_unpark_handle(id: usize) -> Option { lock!(UNPARK).get(&id).cloned() } pub(crate) fn register_waker_sender(id: usize, sender: Sender) { lock!(WAKER_SENDER).insert(id, sender); } pub(crate) fn unregister_waker_sender(id: usize) { lock!(WAKER_SENDER).remove(&id); } pub(crate) fn get_waker_sender(id: usize) -> Option> { lock!(WAKER_SENDER).get(&id).cloned() }