use std::future::poll_fn;
fn require_runtime() -> std::io::Result<()> {
super::RuntimeHandle::current()
.map(drop)
.map_err(|_| std::io::Error::new(std::io::ErrorKind::Unsupported, "no runtime entered"))
}
pub async fn wait_for_interrupt() -> std::io::Result<()> {
require_runtime()?;
let mut receiver = crate::platform_imp::interrupt::InterruptReceiver::new()?;
receiver.recv().await.ok_or_else(|| {
std::io::Error::new(std::io::ErrorKind::BrokenPipe, "interrupt receiver closed")
})
}
pub struct TerminationSignal {
inner: crate::platform_imp::termination::TerminationReceiver,
}
impl TerminationSignal {
pub fn new() -> std::io::Result<Self> {
require_runtime()?;
crate::platform_imp::termination::TerminationReceiver::new().map(|inner| Self { inner })
}
pub async fn recv(&mut self) -> Option<()> {
poll_fn(|context| self.inner.poll_recv(context)).await
}
}
impl std::fmt::Debug for TerminationSignal {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.debug_struct("TerminationSignal").finish_non_exhaustive()
}
}