Skip to main content

aft/bash_background/
pty_runtime.rs

1use std::io::Write;
2use std::sync::atomic::{AtomicBool, AtomicU8, Ordering};
3use std::sync::{Arc, Mutex};
4
5#[allow(dead_code)]
6pub(crate) struct PtyRuntime {
7    pub(crate) master: Option<Box<dyn portable_pty::MasterPty + Send>>,
8    pub(crate) writer: Arc<Mutex<Box<dyn Write + Send>>>,
9    pub(crate) killer: Box<dyn portable_pty::ChildKiller + Send + Sync>,
10    pub(crate) child_pid: Option<u32>,
11    pub(crate) reader_done: Arc<AtomicBool>,
12    pub(crate) exit_observed: Arc<AtomicBool>,
13    pub(crate) was_killed: Arc<AtomicBool>,
14    pub(crate) coordinator: Arc<CompletionCoordinator>,
15}
16
17pub struct CompletionCoordinator {
18    pub task_id: String,
19    pub session_id: String,
20    pub(crate) remaining: AtomicU8,
21    pub(crate) wake_tx: crossbeam_channel::Sender<()>,
22}
23
24impl CompletionCoordinator {
25    pub fn new(
26        task_id: String,
27        session_id: String,
28        wake_tx: crossbeam_channel::Sender<()>,
29    ) -> Self {
30        Self {
31            task_id,
32            session_id,
33            remaining: AtomicU8::new(2),
34            wake_tx,
35        }
36    }
37
38    pub fn signal_one_done(&self) {
39        if self.remaining.fetch_sub(1, Ordering::SeqCst) == 1 {
40            let _ = self.wake_tx.try_send(());
41        }
42    }
43}