use std::sync::Arc;
use std::task::Wake;
use super::Shared;
use crate::rt::handoff::target::Target;
use crate::sync::internal::{AtomicBool, Ordering};
pub(crate) struct Signal {
pub(super) woken: AtomicBool,
pub(super) target: Target,
}
impl Signal {
pub(super) fn new(shared: &Arc<Shared>) -> Self {
Self {
woken: AtomicBool::new(true),
target: Target::new(Arc::clone(shared)),
}
}
}
impl Wake for Signal {
fn wake(self: Arc<Self>) {
self.wake_by_ref();
}
fn wake_by_ref(self: &Arc<Self>) {
self.woken.store(true, Ordering::SeqCst);
self.target.get().unpark();
}
}