parent
5891613b22
commit
cb4f82b2a9
@ -0,0 +1,27 @@
|
|||||||
|
use thread;
|
||||||
|
use alloc::VecDeque;
|
||||||
|
use super::SpinNoIrqLock;
|
||||||
|
|
||||||
|
pub struct Condvar {
|
||||||
|
wait_queue: SpinNoIrqLock<VecDeque<thread::Thread>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Condvar {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Condvar { wait_queue: SpinNoIrqLock::new(VecDeque::new()) }
|
||||||
|
}
|
||||||
|
pub fn wait(&self) {
|
||||||
|
self.wait_queue.lock().push_back(thread::current());
|
||||||
|
thread::park();
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
mod mutex;
|
mod mutex;
|
||||||
mod semaphore;
|
mod condvar;
|
||||||
|
//mod semaphore;
|
||||||
pub mod test;
|
pub mod test;
|
||||||
|
|
||||||
pub use self::mutex::*;
|
pub use self::mutex::*;
|
||||||
|
pub use self::condvar::*;
|
Loading…
Reference in new issue