use std::sync::Arc;
use std::task::Waker;
use tokio::sync::Mutex;
pub struct GenericWaker {
waker: Arc<Mutex<Option<Waker>>>,
}
impl GenericWaker {
pub fn new() -> Self {
Self {
waker: Arc::new(Mutex::new(None)),
}
}
pub async fn register(&self, waker: Waker) {
let mut guard = self.waker.lock().await;
*guard = Some(waker);
}
pub fn wake(&self) {
if let Ok(guard) = self.waker.try_lock() {
if let Some(waker) = guard.as_ref() {
waker.wake_by_ref();
}
}
}
}