1#![warn(rust_2018_idioms)]
2#![cfg(feature = "full")]
3#![cfg(unix)]
4
5mod support {
6 pub mod signal;
7}
8use support::signal::send_signal;
9
10use tokio::runtime::Runtime;
11use tokio::signal::unix::{signal, SignalKind};
12
13use std::sync::mpsc::channel;
14use std::thread;
15
16#[test]
17fn 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 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
49fn rt() -> Runtime {
50 tokio::runtime::Builder::new_current_thread()
51 .enable_all()
52 .build()
53 .unwrap()
54}
55