blockingqueue/
lib.rs

1use std::sync::mpsc::{channel, Receiver, Sender};
2use std::sync::{Arc, Mutex};
3
4pub struct BlockingQueue<T> {
5    sender: Sender<T>,
6    receiver: Arc<Mutex<Receiver<T>>>,
7}
8
9impl<T> BlockingQueue<T> {
10    pub fn new() -> Self {
11        let (sender, receiver) = channel();
12        Self {
13            sender: sender,
14            receiver: Arc::new(Mutex::new(receiver)),
15        }
16    }
17
18    pub fn push(&self, e: T) {
19        self.sender.send(e).unwrap();
20    }
21
22    pub fn pop(&self) -> T {
23        self.receiver.lock().unwrap().recv().unwrap()
24    }
25}
26
27impl<T> Clone for BlockingQueue<T> {
28    fn clone(&self) -> Self {
29        Self {
30            sender: self.sender.clone(),
31            receiver: self.receiver.clone(),
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use std::{thread, time};
40
41    #[test]
42    fn test_1() {
43        let bq = BlockingQueue::new();
44        bq.push(123);
45        bq.push(456);
46        bq.push(789);
47        assert_eq!(bq.pop(), 123);
48        assert_eq!(bq.pop(), 456);
49        assert_eq!(bq.pop(), 789);
50    }
51
52    #[test]
53    fn test_2() {
54        let bq = BlockingQueue::new();
55
56        let bq0 = bq.clone();
57        thread::spawn(move || {
58            thread::sleep(time::Duration::from_millis(100));
59            bq0.push(123);
60        });
61
62        let bq1 = bq.clone();
63        thread::spawn(move || {
64            thread::sleep(time::Duration::from_millis(1000));
65            bq1.push(456);
66        });
67
68        assert_eq!(bq.pop(), 123);
69        assert_eq!(bq.pop(), 456);
70    }
71}