#![allow( clippy::type_complexity, clippy::too_many_arguments, clippy::large_enum_variant )] use crossbeam_channel::{bounded, Receiver, Sender}; use std::thread::spawn; type ReceivingSendingReceiving = Receiver<SendingReceiving>; type SendingReceivingSending = Sender<ReceivingSending>; type SendingReceiving = Sender<Receiving>; type ReceivingSending = Receiver<Sending>; type Receiving = Receiver<()>; type Sending = Sender<()>; fn main() { let mut threads = Vec::new(); for _ in 0..20 { let main = spawn(move || { for _ in 0..100 { let (sender_0, receiver_0) = bounded::<ReceivingSendingReceiving>(1); let (sender_4, receiver_4) = bounded::<SendingReceivingSending>(1); let (sender_1, receiver_1) = bounded::<SendingReceiving>(1); let (sender_5, receiver_5) = bounded::<ReceivingSending>(1); let (sender_2, receiver_2) = bounded::<Receiving>(1); let (sender_6, receiver_6) = bounded::<Sending>(1); let (sender_3, receiver_3) = bounded::<()>(1); let (sender_7, receiver_7) = bounded::<()>(1); sender_0.send(receiver_1).unwrap(); sender_4.send(sender_5).unwrap(); let receiver_1_bis = receiver_0.recv().unwrap(); let sender_5_bis = receiver_4.recv().unwrap(); sender_1.send(sender_2).unwrap(); sender_5_bis.send(receiver_6).unwrap(); let sender_2_bis = receiver_1_bis.recv().unwrap(); let receiver_6_bis = receiver_5.recv().unwrap(); sender_2_bis.send(receiver_3).unwrap(); sender_6.send(sender_7).unwrap(); let receiver_2_bis = receiver_2.recv().unwrap(); let sender_7_bis = receiver_6_bis.recv().unwrap(); sender_3.send(()).unwrap(); sender_7_bis.send(()).unwrap(); receiver_2_bis.recv().unwrap(); receiver_7.recv().unwrap(); } // "Close" connection let (sender_close_1, receiver_close_1) = bounded::<()>(1); let (sender_close_2, receiver_close_2) = bounded::<()>(1); sender_close_1.send(()).unwrap_or(()); sender_close_2.send(()).unwrap_or(()); receiver_close_1.recv().unwrap_or(()); receiver_close_2.recv().unwrap_or(()); }); threads.push(main); } threads.into_iter().for_each(|elt| elt.join().unwrap()); }