priority_send_queue/
lib.rs

1// Copyright 2019 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5use std::collections::VecDeque;
6
7#[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)]
8pub enum SendQueuePriority {
9    High = 0,
10    Normal = 1,
11    Low = 2,
12}
13
14pub struct PrioritySendQueue<T> {
15    queues: Vec<VecDeque<T>>,
16}
17
18impl<T> Default for PrioritySendQueue<T> {
19    fn default() -> PrioritySendQueue<T> {
20        let mut queues = Vec::new();
21        queues.push(VecDeque::new()); // High
22        queues.push(VecDeque::new()); // Normal
23        queues.push(VecDeque::new()); // Low
24        PrioritySendQueue { queues }
25    }
26}
27
28impl<T> PrioritySendQueue<T> {
29    fn queue(&self, priority: SendQueuePriority) -> &VecDeque<T> {
30        &self.queues[priority as usize]
31    }
32
33    fn queue_mut(&mut self, priority: SendQueuePriority) -> &mut VecDeque<T> {
34        &mut self.queues[priority as usize]
35    }
36
37    pub fn pop_front(&mut self) -> Option<(T, SendQueuePriority)> {
38        if let Some(data) = self.queue_mut(SendQueuePriority::High).pop_front()
39        {
40            return Some((data, SendQueuePriority::High));
41        }
42
43        if let Some(data) =
44            self.queue_mut(SendQueuePriority::Normal).pop_front()
45        {
46            return Some((data, SendQueuePriority::Normal));
47        }
48
49        if let Some(data) = self.queue_mut(SendQueuePriority::Low).pop_front() {
50            return Some((data, SendQueuePriority::Low));
51        }
52
53        None
54    }
55
56    pub fn is_empty(&self) -> bool {
57        self.queue(SendQueuePriority::High).is_empty()
58            && self.queue(SendQueuePriority::Normal).is_empty()
59            && self.queue(SendQueuePriority::Low).is_empty()
60    }
61
62    pub fn is_send_queue_empty(&self, priority: SendQueuePriority) -> bool {
63        self.queue(priority).is_empty()
64    }
65
66    pub fn push_back(&mut self, value: T, priority: SendQueuePriority) {
67        self.queue_mut(priority).push_back(value);
68    }
69
70    pub fn len(&self) -> usize {
71        self.queue(SendQueuePriority::High).len()
72            + self.queue(SendQueuePriority::Normal).len()
73            + self.queue(SendQueuePriority::Low).len()
74    }
75
76    pub fn len_by_priority(&self, priority: SendQueuePriority) -> usize {
77        self.queue(priority).len()
78    }
79}