extern crate alloc;
use alloc::sync::Arc;
use std::sync::{Condvar, Mutex};
#[derive(Default, Clone)]
pub struct SyncFlag {
mutex: Arc<Mutex<bool>>,
condvar: Arc<Condvar>,
}
impl SyncFlag {
#[allow(clippy::mutex_atomic)]
pub fn new() -> SyncFlag {
SyncFlag {
mutex: Arc::new(Mutex::new(false)),
condvar: Arc::new(Condvar::new()),
}
}
pub fn set_flag(&self) {
if let Ok(mut guard) = self.mutex.lock() {
*guard = true;
}
self.condvar.notify_all();
}
pub fn clear_flag(&self) {
if let Ok(mut guard) = self.mutex.lock() {
*guard = false;
}
self.condvar.notify_all();
}
pub fn await_flag_notified(&self) -> bool {
if let Ok(guard) = self.mutex.lock() {
if let Ok(guard) = self.condvar.wait(guard) {
return *guard;
}
};
false
}
pub fn await_flag_set(&self) {
loop {
let Ok(guard) = self.mutex.lock() else {
break;
};
if *guard {
return;
}
let Ok(guard) = self.condvar.wait_while(guard, |v| !*v) else {
break;
};
if *guard {
return;
}
}
}
pub fn await_flag_unset(&self) {
loop {
let Ok(guard) = self.mutex.lock() else {
break;
};
if !*guard {
return;
}
let Ok(guard) = self.condvar.wait_while(guard, |v| *v) else {
break;
};
if !*guard {
return;
}
}
}
}