summaryrefslogtreecommitdiffstats
path: root/third_party/rust/crossbeam-channel/examples/stopwatch.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/rust/crossbeam-channel/examples/stopwatch.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/third_party/rust/crossbeam-channel/examples/stopwatch.rs b/third_party/rust/crossbeam-channel/examples/stopwatch.rs
new file mode 100644
index 0000000000..3a7578e00d
--- /dev/null
+++ b/third_party/rust/crossbeam-channel/examples/stopwatch.rs
@@ -0,0 +1,56 @@
+//! Prints the elapsed time every 1 second and quits on Ctrl+C.
+
+#[cfg(windows)] // signal_hook::iterator does not work on windows
+fn main() {
+ println!("This example does not work on Windows");
+}
+
+#[cfg(not(windows))]
+fn main() {
+ use std::io;
+ use std::thread;
+ use std::time::{Duration, Instant};
+
+ use crossbeam_channel::{bounded, select, tick, Receiver};
+ use signal_hook::consts::SIGINT;
+ use signal_hook::iterator::Signals;
+
+ // Creates a channel that gets a message every time `SIGINT` is signalled.
+ fn sigint_notifier() -> io::Result<Receiver<()>> {
+ let (s, r) = bounded(100);
+ let mut signals = Signals::new(&[SIGINT])?;
+
+ thread::spawn(move || {
+ for _ in signals.forever() {
+ if s.send(()).is_err() {
+ break;
+ }
+ }
+ });
+
+ Ok(r)
+ }
+
+ // Prints the elapsed time.
+ fn show(dur: Duration) {
+ println!("Elapsed: {}.{:03} sec", dur.as_secs(), dur.subsec_millis());
+ }
+
+ let start = Instant::now();
+ let update = tick(Duration::from_secs(1));
+ let ctrl_c = sigint_notifier().unwrap();
+
+ loop {
+ select! {
+ recv(update) -> _ => {
+ show(start.elapsed());
+ }
+ recv(ctrl_c) -> _ => {
+ println!();
+ println!("Goodbye!");
+ show(start.elapsed());
+ break;
+ }
+ }
+ }
+}