prosa_utils/queue/
mpsc.rs

1use super::{QueueChecker, QueueError};
2
3crate::queue::lockfree::impl_lockfree_queue!(
4    LockFreeQueueU16,
5    u16,
6    std::sync::atomic::AtomicU16,
7    T,
8    "multi-producers",
9    "single-consumer",
10    "non-optional"
11);
12
13crate::queue::lockfree::impl_lockfree_queue!(
14    LockFreeQueueU32,
15    u32,
16    std::sync::atomic::AtomicU32,
17    T,
18    "multi-producers",
19    "single-consumer",
20    "non-optional"
21);
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[derive(Debug, Clone, PartialEq)]
28    struct Data {
29        val: String,
30    }
31
32    impl Data {
33        fn new(val: String) -> Data {
34            Data { val }
35        }
36    }
37
38    macro_rules! queue_atomic_test {
39        ( $queue:ident ) => {
40            let queue = $queue::<Data, 4096>::default();
41            assert!(queue.is_empty());
42            assert_eq!(0, queue.len());
43            assert_eq!(Ok(()), queue.push(Data::new("test".into())));
44            assert_eq!(1, queue.len());
45            unsafe {
46                assert_eq!(Ok(Data::new("test".into())), queue.pull());
47            }
48            assert!(queue.is_empty());
49            assert_eq!(0, queue.len());
50        };
51    }
52
53    #[tokio::test]
54    async fn queue_atomic_u16_test() {
55        queue_atomic_test!(LockFreeQueueU16);
56    }
57
58    #[tokio::test]
59    async fn queue_atomic_u32_test() {
60        queue_atomic_test!(LockFreeQueueU32);
61    }
62}