24 lines
546 B
Rust
24 lines
546 B
Rust
|
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
|
||
|
}
|