]>
git.proxmox.com Git - rustc.git/blob - vendor/crossbeam-utils-0.6.6/tests/thread.rs
1 extern crate crossbeam_utils
;
4 use std
::sync
::atomic
::{AtomicUsize, Ordering}
;
5 use std
::thread
::sleep
;
6 use std
::time
::Duration
;
8 use crossbeam_utils
::thread
;
10 const THREADS
: usize = 10;
11 const SMALL_STACK_SIZE
: usize = 20;
15 let counter
= AtomicUsize
::new(0);
16 thread
::scope(|scope
| {
17 let handle
= scope
.spawn(|_
| {
18 counter
.store(1, Ordering
::Relaxed
);
20 assert
!(handle
.join().is_ok());
22 let panic_handle
= scope
.spawn(|_
| {
23 panic
!("\"My honey is running out!\", said Pooh.");
25 assert
!(panic_handle
.join().is_err());
29 // There should be sufficient synchronization.
30 assert_eq
!(1, counter
.load(Ordering
::Relaxed
));
35 let counter
= AtomicUsize
::new(0);
36 thread
::scope(|scope
| {
39 counter
.fetch_add(1, Ordering
::Relaxed
);
45 assert_eq
!(THREADS
, counter
.load(Ordering
::Relaxed
));
49 fn counter_builder() {
50 let counter
= AtomicUsize
::new(0);
51 thread
::scope(|scope
| {
55 .name(format
!("child-{}", i
))
56 .stack_size(SMALL_STACK_SIZE
)
58 counter
.fetch_add(1, Ordering
::Relaxed
);
65 assert_eq
!(THREADS
, counter
.load(Ordering
::Relaxed
));
70 let counter
= AtomicUsize
::new(0);
71 let result
= thread
::scope(|scope
| {
73 panic
!("\"My honey is running out!\", said Pooh.");
75 sleep(Duration
::from_millis(100));
79 counter
.fetch_add(1, Ordering
::Relaxed
);
84 assert_eq
!(THREADS
, counter
.load(Ordering
::Relaxed
));
85 assert
!(result
.is_err());
90 let result
= thread
::scope(|scope
| {
92 sleep(Duration
::from_millis(500));
100 let err
= result
.unwrap_err();
102 .downcast_ref
::<Vec
<Box
<Any
+ Send
+ '
static>>>()
104 assert_eq
!(2, vec
.len());
106 let first
= vec
[0].downcast_ref
::<&str>().unwrap();
107 let second
= vec
[1].downcast_ref
::<&str>().unwrap();
108 assert_eq
!("thread #1", *first
);
109 assert_eq
!("thread #2", *second
)
114 let result
= thread
::scope(|scope
| {
115 scope
.spawn(|_
| panic
!("deliberate panic #1"));
116 scope
.spawn(|_
| panic
!("deliberate panic #2"));
117 scope
.spawn(|_
| panic
!("deliberate panic #3"));
120 let err
= result
.unwrap_err();
122 .downcast_ref
::<Vec
<Box
<Any
+ Send
+ '
static>>>()
124 assert_eq
!(3, vec
.len());
126 for panic
in vec
.iter() {
127 let panic
= panic
.downcast_ref
::<&str>().unwrap();
129 *panic
== "deliberate panic #1"
130 || *panic
== "deliberate panic #2"
131 || *panic
== "deliberate panic #3"
138 let var
= "foo".to_string();
144 impl<'a
> Wrapper
<'a
> {
145 fn recurse(&'a
self, scope
: &thread
::Scope
<'a
>, depth
: usize) {
146 assert_eq
!(self.var
, "foo");
149 scope
.spawn(move |scope
| {
150 self.recurse(scope
, depth
- 1);
156 let wrapper
= Wrapper { var: &var }
;
158 thread
::scope(|scope
| {
159 scope
.spawn(|scope
| {
160 scope
.spawn(|scope
| {
161 wrapper
.recurse(scope
, 5);
170 thread
::scope(|scope
| {
171 scope
.spawn(|scope
| {
172 let handle
= scope
.spawn(|_
| 7);
174 sleep(Duration
::from_millis(200));
175 handle
.join().unwrap();
178 sleep(Duration
::from_millis(100));