aft/bash_background/
pty_runtime.rs1use 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}