prosa_utils/queue/
spmc.rs

1use super::{QueueChecker, QueueError};
2
3crate::queue::lockfree::impl_lockfree_queue!(
4    LockFreeOptQueueU16,
5    u16,
6    std::sync::atomic::AtomicU16,
7    Option<T>,
8    "single-producer",
9    "multi-consumers",
10    "optional"
11);
12
13crate::queue::lockfree::impl_lockfree_queue!(
14    LockFreeOptQueueU32,
15    u32,
16    std::sync::atomic::AtomicU32,
17    Option<T>,
18    "single-producer",
19    "multi-consumers",
20    "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            unsafe { assert_eq!(Ok((0, 0)), queue.push(Data::new("test".into()))) };
44            assert_eq!(1, queue.len());
45            assert_eq!(Ok(Data::new("test".into())), queue.pull());
46            assert!(queue.is_empty());
47            assert_eq!(0, queue.len());
48        };
49    }
50
51    #[tokio::test]
52    async fn queue_atomic_u16_test() {
53        queue_atomic_test!(LockFreeOptQueueU16);
54    }
55
56    #[tokio::test]
57    async fn queue_atomic_u32_test() {
58        queue_atomic_test!(LockFreeOptQueueU32);
59    }
60}