flume 0.10.13

A blazingly fast multi-producer channel
Documentation
// //! 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();
// }