1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3 #![cfg(unix)]
4 
5 mod support {
6     pub mod signal;
7 }
8 use support::signal::send_signal;
9 
10 use tokio::runtime::Runtime;
11 use tokio::signal::unix::{signal, SignalKind};
12 
13 use std::sync::mpsc::channel;
14 use std::thread;
15 
16 #[test]
multi_loop()17 fn multi_loop() {
18     // An "ordinary" (non-future) channel
19     let (sender, receiver) = channel();
20     // Run multiple times, to make sure there are no race conditions
21     for _ in 0..10 {
22         // Run multiple event loops, each one in its own thread
23         let threads: Vec<_> = (0..4)
24             .map(|_| {
25                 let sender = sender.clone();
26                 thread::spawn(move || {
27                     let mut rt = rt();
28                     let _ = rt.block_on(async {
29                         let mut signal = signal(SignalKind::hangup()).unwrap();
30                         sender.send(()).unwrap();
31                         signal.recv().await
32                     });
33                 })
34             })
35             .collect();
36         // Wait for them to declare they're ready
37         for &_ in threads.iter() {
38             receiver.recv().unwrap();
39         }
40         // Send a signal
41         send_signal(libc::SIGHUP);
42         // Make sure the threads terminated correctly
43         for t in threads {
44             t.join().unwrap();
45         }
46     }
47 }
48 
rt() -> Runtime49 fn rt() -> Runtime {
50     tokio::runtime::Builder::new()
51         .basic_scheduler()
52         .enable_all()
53         .build()
54         .unwrap()
55 }
56