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