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}