From 053ba7be1a16f1211068c9c227c9021272ece0c5 Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Thu, 26 Jan 2017 20:41:06 +0100 Subject: [PATCH] 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. --- tests/signal.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/signal.rs b/tests/signal.rs index 06bcefa6e..b7bb3fb73 100644 --- a/tests/signal.rs +++ b/tests/signal.rs @@ -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(); + } + } +}