use futures_util::FutureExt; use tokio::sync::oneshot::{channel, Sender}; use crate::prelude::*; pub mod table; pub struct Terminator { signal: Sender<()>, completion: JoinHandle>, } impl Terminator { pub fn from_raw(signal: Sender<()>, completion: JoinHandle>) -> Terminator { Terminator { signal, completion } } pub fn new(completion: JoinHandle>) -> (Terminator, impl Future) { let (signal, rx) = channel(); (Terminator { signal, completion }, rx.map(|_| ())) } pub async fn terminate(self) -> Result<()> { match self.signal.send(()) { Ok(()) => {} Err(_) => log::error!("Termination channel is dropped"), } self.completion.await??; Ok(()) } }