#![cfg(not(target_family = "wasm"))]
use std::sync::{Condvar, Mutex, PoisonError};
use std::time::Duration;
pub(crate) struct AutoResetEvent {
signaled: Mutex<bool>,
condition: Condvar,
}
impl AutoResetEvent {
pub(crate) fn new(initial_state: bool) -> Self {
Self { signaled: Mutex::new(initial_state), condition: Condvar::new() }
}
pub(crate) fn set(&self) {
*self.signaled.lock().unwrap_or_else(PoisonError::into_inner) = true;
self.condition.notify_one();
}
pub(crate) fn wait_one(&self) {
let mut signaled = self.signaled.lock().unwrap_or_else(PoisonError::into_inner);
while !*signaled {
signaled = self.condition.wait(signaled).unwrap_or_else(PoisonError::into_inner);
}
*signaled = false;
}
pub(crate) fn wait_one_timeout(&self, timeout: Duration) -> bool {
let signaled = self.signaled.lock().unwrap_or_else(PoisonError::into_inner);
let (mut signaled, _) = self
.condition
.wait_timeout_while(signaled, timeout, |signaled| !*signaled)
.unwrap_or_else(PoisonError::into_inner);
std::mem::take(&mut *signaled)
}
}