| //@ run-pass | |
| //@ needs-unwind | |
| #![allow(stable_features)] | |
| #![allow(unused_must_use)] | |
| //@ ignore-emscripten no threads support | |
| #![feature(std_panic)] | |
| use std::panic; | |
| use std::thread; | |
| fn a() { | |
| panic::set_hook(Box::new(|_| println!("hello yes this is a"))); | |
| panic::take_hook(); | |
| panic::set_hook(Box::new(|_| println!("hello yes this is a part 2"))); | |
| panic::take_hook(); | |
| } | |
| fn b() { | |
| panic::take_hook(); | |
| panic::take_hook(); | |
| panic::take_hook(); | |
| panic::take_hook(); | |
| panic::take_hook(); | |
| panic!(); | |
| } | |
| fn c() { | |
| panic::set_hook(Box::new(|_| ())); | |
| panic::set_hook(Box::new(|_| ())); | |
| panic::set_hook(Box::new(|_| ())); | |
| panic::set_hook(Box::new(|_| ())); | |
| panic::set_hook(Box::new(|_| ())); | |
| panic::set_hook(Box::new(|_| ())); | |
| panic!(); | |
| } | |
| fn main() { | |
| for _ in 0..10 { | |
| let mut handles = vec![]; | |
| for _ in 0..10 { | |
| handles.push(thread::spawn(a)); | |
| } | |
| for _ in 0..10 { | |
| handles.push(thread::spawn(b)); | |
| } | |
| for _ in 0..10 { | |
| handles.push(thread::spawn(c)); | |
| } | |
| for handle in handles { | |
| let _ = handle.join(); | |
| } | |
| } | |
| } |