You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
928 B

use alloc::collections::VecDeque;
use super::*;
use crate::thread;
#[derive(Default)]
pub struct Condvar {
wait_queue: SpinNoIrqLock<VecDeque<thread::Thread>>,
}
impl Condvar {
pub fn new() -> Self {
Condvar::default()
}
pub fn _wait(&self) {
self.wait_queue.lock().push_back(thread::current());
thread::park();
}
pub fn wait<'a, T, S>(&self, guard: MutexGuard<'a, T, S>) -> MutexGuard<'a, T, S>
where S: MutexSupport
{
let mutex = guard.mutex;
drop(guard);
self._wait();
mutex.lock()
}
pub fn notify_one(&self) {
if let Some(t) = self.wait_queue.lock().pop_front() {
t.unpark();
}
}
pub fn notify_all(&self) {
while let Some(t) = self.wait_queue.lock().pop_front() {
t.unpark();
}
}
pub fn _clear(&self) {
self.wait_queue.lock().clear();
}
}