]>
git.proxmox.com Git - rustc.git/blob - vendor/crossbeam-queue-0.1.2/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() {}
117 assert_eq
!(q
.len(), 0);
122 const COUNT
: usize = 100_000;
124 let q
= ArrayQueue
::new(3);
130 if let Ok(x
) = q
.pop() {
136 assert
!(q
.pop().is_err());
141 while q
.push(i
).is_err() {}
149 const COUNT
: usize = 25_000;
150 const THREADS
: usize = 4;
152 let q
= ArrayQueue
::<usize>::new(3);
153 let v
= (0..COUNT
).map(|_
| AtomicUsize
::new(0)).collect
::<Vec
<_
>>();
156 for _
in 0..THREADS
{
160 if let Ok(x
) = q
.pop() {
164 v
[n
].fetch_add(1, Ordering
::SeqCst
);
168 for _
in 0..THREADS
{
171 while q
.push(i
).is_err() {}
178 assert_eq
!(c
.load(Ordering
::SeqCst
), THREADS
);
184 const RUNS
: usize = 100;
186 static DROPS
: AtomicUsize
= AtomicUsize
::new(0);
188 #[derive(Debug, PartialEq)]
191 impl Drop
for DropCounter
{
193 DROPS
.fetch_add(1, Ordering
::SeqCst
);
197 let mut rng
= thread_rng();
200 let steps
= rng
.gen_range(0, 10_000);
201 let additional
= rng
.gen_range(0, 50);
203 DROPS
.store(0, Ordering
::SeqCst
);
204 let q
= ArrayQueue
::new(50);
209 while q
.pop().is_err() {}
215 while q
.push(DropCounter
).is_err() {
216 DROPS
.fetch_sub(1, Ordering
::SeqCst
);
222 for _
in 0..additional
{
223 q
.push(DropCounter
).unwrap();
226 assert_eq
!(DROPS
.load(Ordering
::SeqCst
), steps
);
228 assert_eq
!(DROPS
.load(Ordering
::SeqCst
), steps
+ additional
);
234 const COUNT
: usize = 25_000;
235 const THREADS
: usize = 4;
237 let q
= ArrayQueue
::new(THREADS
);
240 for _
in 0..THREADS
{
243 while q
.push(0).is_err() {}