use std::cell::Cell; use tokio::sync::oneshot; pub fn init () -> oneshot::Receiver <()> { let (tx, rx) = oneshot::channel::<()> (); // I have to put the tx into a Cell here so that if Ctrl-C gets // called multiple times, we won't send multiple shutdowns to the // oneshot channel. (Which would be a compile error) let tx = Some (tx); let tx = Cell::new (tx); ctrlc::set_handler (move ||{ let tx = tx.replace (None); if let Some (tx) = tx { tx.send (()).unwrap (); } }).expect ("Error setting Ctrl-C handler"); rx }