prosa_utils/queue/
spmc.rs1use 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}