54 lines
1.5 KiB
Rust
54 lines
1.5 KiB
Rust
|
// //! Tests that make sure accessing thread-locals while exiting the thread doesn't cause panics.
|
||
|
|
||
|
// extern crate crossbeam_utils;
|
||
|
|
||
|
// use std::thread;
|
||
|
// use std::time::Duration;
|
||
|
|
||
|
// use flume::unbounded;
|
||
|
// use crossbeam_utils::thread::scope;
|
||
|
|
||
|
// fn ms(ms: u64) -> Duration {
|
||
|
// Duration::from_millis(ms)
|
||
|
// }
|
||
|
|
||
|
// #[test]
|
||
|
// #[cfg_attr(target_os = "macos", ignore = "TLS is destroyed too early on macOS")]
|
||
|
// fn use_while_exiting() {
|
||
|
// struct Foo;
|
||
|
|
||
|
// impl Drop for Foo {
|
||
|
// fn drop(&mut self) {
|
||
|
// // A blocking operation after the thread-locals have been dropped. This will attempt to
|
||
|
// // use the thread-locals and must not panic.
|
||
|
// let (_s, r) = unbounded::<()>();
|
||
|
// select! {
|
||
|
// recv(r) -> _ => {}
|
||
|
// default(ms(100)) => {}
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// thread_local! {
|
||
|
// static FOO: Foo = Foo;
|
||
|
// }
|
||
|
|
||
|
// let (s, r) = unbounded::<()>();
|
||
|
|
||
|
// scope(|scope| {
|
||
|
// scope.spawn(|_| {
|
||
|
// // First initialize `FOO`, then the thread-locals related to crossbeam-channel.
|
||
|
// FOO.with(|_| ());
|
||
|
// r.recv().unwrap();
|
||
|
// // At thread exit, thread-locals related to crossbeam-channel get dropped first and
|
||
|
// // `FOO` is dropped last.
|
||
|
// });
|
||
|
|
||
|
// scope.spawn(|_| {
|
||
|
// thread::sleep(ms(100));
|
||
|
// s.send(()).unwrap();
|
||
|
// });
|
||
|
// })
|
||
|
// .unwrap();
|
||
|
// }
|