1use std::collections::VecDeque;
6
7use async_task::Runnable;
8use sync::Mutex;
9
10pub struct RunnableQueue {
13 runnables: Mutex<VecDeque<Runnable>>,
14}
15
16impl RunnableQueue {
17 pub fn new() -> RunnableQueue {
19 RunnableQueue {
20 runnables: Mutex::new(VecDeque::new()),
21 }
22 }
23
24 pub fn push_back(&self, runnable: Runnable) {
26 self.runnables.lock().push_back(runnable);
27 }
28
29 pub fn pop_front(&self) -> Option<Runnable> {
31 self.runnables.lock().pop_front()
32 }
33
34 pub fn iter(&self) -> RunnableQueueIter {
37 self.into_iter()
38 }
39}
40
41impl Default for RunnableQueue {
42 fn default() -> Self {
43 Self::new()
44 }
45}
46
47impl<'q> IntoIterator for &'q RunnableQueue {
48 type Item = Runnable;
49 type IntoIter = RunnableQueueIter<'q>;
50
51 fn into_iter(self) -> Self::IntoIter {
52 RunnableQueueIter { queue: self }
53 }
54}
55
56pub struct RunnableQueueIter<'q> {
58 queue: &'q RunnableQueue,
59}
60
61impl Iterator for RunnableQueueIter<'_> {
62 type Item = Runnable;
63 fn next(&mut self) -> Option<Self::Item> {
64 self.queue.pop_front()
65 }
66}