forked from lavina/lavina
29 lines
797 B
Rust
29 lines
797 B
Rust
|
use crate::prelude::*;
|
||
|
|
||
|
pub struct Terminator {
|
||
|
signal: Promise<()>,
|
||
|
completion: JoinHandle<Result<()>>,
|
||
|
}
|
||
|
impl Terminator {
|
||
|
pub async fn terminate(self) -> Result<()> {
|
||
|
match self.signal.send(()) {
|
||
|
Ok(()) => {}
|
||
|
Err(_) => log::warn!("Termination channel is dropped"),
|
||
|
}
|
||
|
self.completion.await??;
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
/// Used to spawn managed tasks with support for graceful shutdown
|
||
|
pub fn spawn<Fun, Fut>(launcher: Fun) -> Terminator
|
||
|
where
|
||
|
Fun: FnOnce(Deferred<()>) -> Fut,
|
||
|
Fut: Future<Output = Result<()>> + Send + 'static,
|
||
|
{
|
||
|
let (signal, rx) = oneshot();
|
||
|
let future = launcher(rx);
|
||
|
let completion = tokio::task::spawn(future);
|
||
|
Terminator { signal, completion }
|
||
|
}
|
||
|
}
|