]>
git.proxmox.com Git - rustc.git/blob - vendor/crossbeam-queue/tests/array_queue.rs
1 extern crate crossbeam_queue
;
2 extern crate crossbeam_utils
;
5 use std
::sync
::atomic
::{AtomicUsize, Ordering}
;
7 use crossbeam_queue
::ArrayQueue
;
8 use crossbeam_utils
::thread
::scope
;
9 use rand
::{thread_rng, Rng}
;
13 let q
= ArrayQueue
::new(1);
16 assert_eq
!(q
.pop(), Ok(7));
19 assert_eq
!(q
.pop(), Ok(8));
20 assert
!(q
.pop().is_err());
26 let q
= ArrayQueue
::<i32>::new(i
);
27 assert_eq
!(q
.capacity(), i
);
32 #[should_panic(expected = "capacity must be non-zero")]
34 let _
= ArrayQueue
::<i32>::new(0);
39 let q
= ArrayQueue
::new(2);
41 assert_eq
!(q
.len(), 0);
42 assert_eq
!(q
.is_empty(), true);
43 assert_eq
!(q
.is_full(), false);
47 assert_eq
!(q
.len(), 1);
48 assert_eq
!(q
.is_empty(), false);
49 assert_eq
!(q
.is_full(), false);
53 assert_eq
!(q
.len(), 2);
54 assert_eq
!(q
.is_empty(), false);
55 assert_eq
!(q
.is_full(), true);
59 assert_eq
!(q
.len(), 1);
60 assert_eq
!(q
.is_empty(), false);
61 assert_eq
!(q
.is_full(), false);
66 const COUNT
: usize = 25_000;
67 const CAP
: usize = 1000;
69 let q
= ArrayQueue
::new(CAP
);
70 assert_eq
!(q
.len(), 0);
72 for _
in 0..CAP
/ 10 {
75 assert_eq
!(q
.len(), i
+ 1);
80 assert_eq
!(q
.len(), 50 - i
- 1);
83 assert_eq
!(q
.len(), 0);
87 assert_eq
!(q
.len(), i
+ 1);
93 assert_eq
!(q
.len(), 0);
99 if let Ok(x
) = q
.pop() {
111 while q
.push(i
).is_err() {}
118 assert_eq
!(q
.len(), 0);
123 const COUNT
: usize = 100_000;
125 let q
= ArrayQueue
::new(3);
131 if let Ok(x
) = q
.pop() {
137 assert
!(q
.pop().is_err());
142 while q
.push(i
).is_err() {}
151 const COUNT
: usize = 25_000;
152 const THREADS
: usize = 4;
154 let q
= ArrayQueue
::<usize>::new(3);
155 let v
= (0..COUNT
).map(|_
| AtomicUsize
::new(0)).collect
::<Vec
<_
>>();
158 for _
in 0..THREADS
{
162 if let Ok(x
) = q
.pop() {
166 v
[n
].fetch_add(1, Ordering
::SeqCst
);
170 for _
in 0..THREADS
{
173 while q
.push(i
).is_err() {}
181 assert_eq
!(c
.load(Ordering
::SeqCst
), THREADS
);
187 const RUNS
: usize = 100;
189 static DROPS
: AtomicUsize
= AtomicUsize
::new(0);
191 #[derive(Debug, PartialEq)]
194 impl Drop
for DropCounter
{
196 DROPS
.fetch_add(1, Ordering
::SeqCst
);
200 let mut rng
= thread_rng();
203 let steps
= rng
.gen_range(0, 10_000);
204 let additional
= rng
.gen_range(0, 50);
206 DROPS
.store(0, Ordering
::SeqCst
);
207 let q
= ArrayQueue
::new(50);
212 while q
.pop().is_err() {}
218 while q
.push(DropCounter
).is_err() {
219 DROPS
.fetch_sub(1, Ordering
::SeqCst
);
226 for _
in 0..additional
{
227 q
.push(DropCounter
).unwrap();
230 assert_eq
!(DROPS
.load(Ordering
::SeqCst
), steps
);
232 assert_eq
!(DROPS
.load(Ordering
::SeqCst
), steps
+ additional
);
238 const COUNT
: usize = 25_000;
239 const THREADS
: usize = 4;
241 let q
= ArrayQueue
::new(THREADS
);
244 for _
in 0..THREADS
{
247 while q
.push(0).is_err() {}