use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use tokio::io::{AsyncBufReadExt, AsyncRead, BufReader};
use tokio::task::JoinHandle;
#[derive(Debug)]
pub(super) struct TurnInProgressGuard {
flag: Arc<AtomicBool>,
armed: bool,
}
impl TurnInProgressGuard {
pub(super) fn new(flag: Arc<AtomicBool>) -> Self {
Self { flag, armed: true }
}
pub(super) fn disarm(&mut self) {
self.armed = false;
}
}
impl Drop for TurnInProgressGuard {
fn drop(&mut self) {
if self.armed {
self.flag.store(false, Ordering::SeqCst);
}
}
}
pub(super) fn spawn_stderr_logger<R>(stderr: R, target: &'static str) -> JoinHandle<()>
where
R: AsyncRead + Unpin + Send + 'static,
{
tokio::spawn(async move {
let reader = BufReader::new(stderr);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
if !line.trim().is_empty() {
tracing::debug!(stderr_target = target, "{line}");
}
}
})
}