浏览代码

Force shutdown on second ^C

Paul Lietar 7 年之前
父节点
当前提交
2853e2230b
共有 1 个文件被更改,包括 16 次插入7 次删除
  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"))