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 queues = vec![
21            VecDeque::new(), // High
22            VecDeque::new(), // Normal
23            VecDeque::new(), // Low
24        ];
25        PrioritySendQueue { queues }
26    }
27}
28
29impl<T> PrioritySendQueue<T> {
30    fn queue(&self, priority: SendQueuePriority) -> &VecDeque<T> {
31        &self.queues[priority as usize]
32    }
33
34    fn queue_mut(&mut self, priority: SendQueuePriority) -> &mut VecDeque<T> {
35        &mut self.queues[priority as usize]
36    }
37
38    pub fn pop_front(&mut self) -> Option<(T, SendQueuePriority)> {
39        if let Some(data) = self.queue_mut(SendQueuePriority::High).pop_front()
40        {
41            return Some((data, SendQueuePriority::High));
42        }
43
44        if let Some(data) =
45            self.queue_mut(SendQueuePriority::Normal).pop_front()
46        {
47            return Some((data, SendQueuePriority::Normal));
48        }
49
50        if let Some(data) = self.queue_mut(SendQueuePriority::Low).pop_front() {
51            return Some((data, SendQueuePriority::Low));
52        }
53
54        None
55    }
56
57    pub fn is_empty(&self) -> bool {
58        self.queue(SendQueuePriority::High).is_empty()
59            && self.queue(SendQueuePriority::Normal).is_empty()
60            && self.queue(SendQueuePriority::Low).is_empty()
61    }
62
63    pub fn is_send_queue_empty(&self, priority: SendQueuePriority) -> bool {
64        self.queue(priority).is_empty()
65    }
66
67    pub fn push_back(&mut self, value: T, priority: SendQueuePriority) {
68        self.queue_mut(priority).push_back(value);
69    }
70
71    pub fn len(&self) -> usize {
72        self.queue(SendQueuePriority::High).len()
73            + self.queue(SendQueuePriority::Normal).len()
74            + self.queue(SendQueuePriority::Low).len()
75    }
76
77    pub fn len_by_priority(&self, priority: SendQueuePriority) -> usize {
78        self.queue(priority).len()
79    }
80}