use parking_lot::Condvar;
use parking_lot::Mutex;
use std::time::Duration;
pub struct ManualResetEvent {
is_set: (Mutex<bool>, Condvar),
}
impl ManualResetEvent {
pub fn new(initial_state: bool) -> ManualResetEvent {
ManualResetEvent {
is_set: (Mutex::new(initial_state), Condvar::new()),
}
}
pub fn wait_with_timeout(&self, timeout: Duration) -> bool {
let &(ref lock, ref cvar) = &self.is_set;
let mut is_set = lock.lock();
if !*is_set {
cvar.wait_for(&mut is_set, timeout);
}
*is_set
}
pub fn set(&self) {
let &(ref lock, ref cvar) = &self.is_set;
let mut is_set = lock.lock();
*is_set = true;
cvar.notify_all();
}
#[allow(dead_code)]
pub fn reset(&self) {
let &(ref lock, _) = &self.is_set;
let mut is_set = lock.lock();
*is_set = false;
}
}