use tokio::sync::watch;
#[derive(Debug, Clone)]
pub(crate) struct WorkerHandle {
_receiver: watch::Receiver<()>,
}
impl WorkerHandle {
#[cfg(test)]
pub(crate) fn new_mocked() -> Self {
let (s, _) = WorkerHandleListener::channel();
s
}
}
#[derive(Debug)]
pub(crate) struct WorkerHandleListener {
sender: watch::Sender<()>,
}
impl WorkerHandleListener {
pub(crate) async fn wait_for_all_handle_drops(&self) {
self.sender.closed().await
}
pub(crate) fn is_alive(&self) -> bool {
!self.sender.is_closed()
}
pub(crate) fn channel() -> (WorkerHandle, WorkerHandleListener) {
let (sender, receiver) = watch::channel(());
(
WorkerHandle {
_receiver: receiver,
},
WorkerHandleListener { sender },
)
}
}