mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-17 00:00:11 +02:00
signal: A test running multiple event loops
Run multiple loops (both in parallel and sequentially) to make sure broadcasting to multiple of them works and we work even after the initial loop has gone away.
This commit is contained in:
committed by
Carl Lerche
parent
cf1afd2d90
commit
edba77e8df
@@ -6,6 +6,8 @@ extern crate tokio_core;
|
||||
extern crate tokio_signal;
|
||||
|
||||
use std::time::Duration;
|
||||
use std::thread;
|
||||
use std::sync::mpsc::channel;
|
||||
|
||||
use futures::Future;
|
||||
use futures::stream::Stream;
|
||||
@@ -63,3 +65,37 @@ fn twice() {
|
||||
}
|
||||
lp.run(signal.into_future()).ok().unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multi_loop() {
|
||||
// An "ordinary" (non-future) channel
|
||||
let (sender, receiver) = channel();
|
||||
// Run multiple times, to make sure there are no race conditions
|
||||
for _ in 0..10 {
|
||||
// Run multiple event loops, each one in its own thread
|
||||
let threads: Vec<_> = (0..4)
|
||||
.map(|_| {
|
||||
let sender = sender.clone();
|
||||
thread::spawn(move || {
|
||||
let mut lp = Core::new().unwrap();
|
||||
let handle = lp.handle();
|
||||
let signal = lp.run(Signal::new(libc::SIGHUP, &handle)).unwrap();
|
||||
sender.send(()).unwrap();
|
||||
lp.run(signal.into_future()).ok().unwrap();
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
// Wait for them to declare they're ready
|
||||
for &_ in threads.iter() {
|
||||
receiver.recv().unwrap();
|
||||
}
|
||||
// Send a signal
|
||||
unsafe {
|
||||
assert_eq!(libc::kill(libc::getpid(), libc::SIGHUP), 0);
|
||||
}
|
||||
// Make sure the threads terminated correctly
|
||||
for t in threads {
|
||||
t.join().unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user