Explorar el Código

Force shutdown on second ^C

Paul Lietar hace 7 años
padre
commit
2853e2230b
Se han modificado 1 ficheros con 16 adiciones y 7 borrados
  1. 16 7
      src/main.rs

+ 16 - 7
src/main.rs

@@ -1,18 +1,19 @@
 #[macro_use] extern crate log;
-extern crate getopts;
-extern crate librespot;
 extern crate ctrlc;
 extern crate env_logger;
 extern crate futures;
+extern crate getopts;
+extern crate librespot;
 extern crate tokio_core;
 
 use env_logger::LogBuilder;
-use std::io::{stderr, Write};
-use std::process::exit;
+use futures::Future;
+use std::cell::{RefCell, Cell};
 use std::env;
+use std::io::{stderr, Write};
 use std::path::PathBuf;
+use std::process::exit;
 use std::str::FromStr;
-use futures::Future;
 use tokio_core::reactor::Core;
 
 use librespot::spirc::Spirc;
@@ -173,10 +174,18 @@ fn main() {
         });
 
         let (spirc, task) = Spirc::new(session.clone(), player, mixer);
-        let spirc = ::std::cell::RefCell::new(spirc);
+        let spirc = RefCell::new(spirc);
 
+        let shutting_down = Cell::new(false);
         ctrlc::set_handler(move || {
-            spirc.borrow_mut().shutdown();
+            if shutting_down.get() {
+                warn!("Forced shutdown");
+                exit(1);
+            } else {
+                info!("Shutting down");
+                spirc.borrow_mut().shutdown();
+                shutting_down.set(true);
+            }
         });
 
         task.map_err(|()| panic!("spirc error"))