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
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();
|
|
}
|
|
} |