diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-08-14 05:18:30 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-14 05:18:30 +0300 |
| commit | d76657f2c7fc18dcce3b9af43842c8afaba1646b (patch) | |
| tree | d8643d39aaa1aff3193e178760f21d52150c6f7c /src/pane.rs | |
| parent | d2c317adc4b5fd73a7054d74f92d633a31069391 (diff) | |
fix: speed up alternate-screen history reads (#2426)
refs #2387
Diffstat (limited to 'src/pane.rs')
| -rw-r--r-- | src/pane.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/pane.rs b/src/pane.rs index 44f3fea9..a47e62eb 100644 --- a/src/pane.rs +++ b/src/pane.rs @@ -1039,6 +1039,7 @@ pub struct PaneRuntime { reported_cwd: Arc<Mutex<Option<std::path::PathBuf>>>, child_wait_completed: Option<Arc<AtomicBool>>, kitty_keyboard_flags: Arc<AtomicU16>, + content_seq: Arc<AtomicU64>, detection_content_seq: Arc<AtomicU64>, full_lifecycle_authority_active: Arc<AtomicBool>, detect_reset_notify: Arc<Notify>, @@ -1915,6 +1916,7 @@ impl PaneRuntime { let child_pid = Arc::new(AtomicU32::new(child_pid)); let reported_cwd = Arc::new(Mutex::new(None)); let kitty_keyboard_flags = Arc::new(AtomicU16::new(keyboard_protocol_flags)); + let content_seq = Arc::new(AtomicU64::new(0)); let detection_content_seq = Arc::new(AtomicU64::new(0)); let io = { @@ -1922,6 +1924,7 @@ impl PaneRuntime { let response_writer = response_tx.clone(); let render_notify = render_notify.clone(); let render_dirty = render_dirty.clone(); + let content_seq = content_seq.clone(); let detection_content_seq = detection_content_seq.clone(); let child_pid = child_pid.clone(); let read_events = events.clone(); @@ -1929,9 +1932,11 @@ impl PaneRuntime { let rt = tokio::runtime::Handle::current(); let delay_rt = rt.clone(); let on_read = Box::new(move |bytes: &[u8]| { + content_seq.fetch_add(1, Ordering::AcqRel); let shell_pid = child_pid.load(Ordering::Acquire); let result = terminal.process_pty_bytes(pane_id, shell_pid, bytes, &response_writer); + content_seq.fetch_add(1, Ordering::Release); publish_terminal_bells(pane_id, result.terminal_bells, &read_events); observe_detection_content_change(bytes, &detection_content_seq); let title_requested = @@ -1999,6 +2004,7 @@ impl PaneRuntime { reported_cwd, child_wait_completed: None, kitty_keyboard_flags, + content_seq, detection_content_seq, full_lifecycle_authority_active, detect_reset_notify, @@ -2054,6 +2060,7 @@ impl PaneRuntime { let child_pid = Arc::new(AtomicU32::new(0)); let reported_cwd = Arc::new(Mutex::new(None)); let child_wait_completed = Arc::new(AtomicBool::new(false)); + let content_seq = Arc::new(AtomicU64::new(0)); let detection_content_seq = Arc::new(AtomicU64::new(0)); let full_lifecycle_authority_active = Arc::new(AtomicBool::new(false)); { @@ -2087,15 +2094,18 @@ impl PaneRuntime { let response_writer = response_tx.clone(); let render_notify = render_notify.clone(); let render_dirty = render_dirty.clone(); + let content_seq = content_seq.clone(); let detection_content_seq = detection_content_seq.clone(); let child_pid = child_pid.clone(); let events = events.clone(); let reported_cwd = reported_cwd.clone(); let rt = tokio::runtime::Handle::current(); let on_read = Box::new(move |bytes: &[u8]| { + content_seq.fetch_add(1, Ordering::AcqRel); let shell_pid = child_pid.load(Ordering::Acquire); let result = terminal.process_pty_bytes(pane_id, shell_pid, bytes, &response_writer); + content_seq.fetch_add(1, Ordering::Release); publish_terminal_bells(pane_id, result.terminal_bells, &events); if agent_detection == AgentDetection::Enabled { observe_detection_content_change(bytes, &detection_content_seq); @@ -2545,6 +2555,7 @@ impl PaneRuntime { reported_cwd, child_wait_completed: Some(child_wait_completed), kitty_keyboard_flags, + content_seq, detection_content_seq, full_lifecycle_authority_active, detect_reset_notify, @@ -2592,6 +2603,10 @@ impl PaneRuntime { (rows, cols) } + pub(crate) fn content_seq(&self) -> u64 { + self.content_seq.load(Ordering::Acquire) + } + /// Resize if the dimensions actually changed. pub fn resize(&self, rows: u16, cols: u16, cell_width_px: u32, cell_height_px: u32) { let rows = rows.max(2); @@ -3001,8 +3016,10 @@ impl PaneRuntime { } pub(crate) fn test_process_pty_bytes(&self, bytes: &[u8]) { + self.content_seq.fetch_add(1, Ordering::AcqRel); let (tx, _rx) = mpsc::channel(1); let _ = self.terminal.process_pty_bytes(self.pane_id, 0, bytes, &tx); + self.content_seq.fetch_add(1, Ordering::Release); } pub(crate) fn test_with_scrollback_bytes( @@ -3042,6 +3059,7 @@ impl PaneRuntime { reported_cwd: Arc::new(Mutex::new(None)), child_wait_completed: None, kitty_keyboard_flags: Arc::new(AtomicU16::new(0)), + content_seq: Arc::new(AtomicU64::new(0)), detection_content_seq: Arc::new(AtomicU64::new(0)), full_lifecycle_authority_active: Arc::new(AtomicBool::new(false)), detect_reset_notify: Arc::new(Notify::new()), @@ -3596,6 +3614,7 @@ mod tests { reported_cwd: Arc::new(Mutex::new(None)), child_wait_completed: None, kitty_keyboard_flags: Arc::new(AtomicU16::new(0)), + content_seq: Arc::new(AtomicU64::new(0)), detection_content_seq: Arc::new(AtomicU64::new(0)), full_lifecycle_authority_active: Arc::new(AtomicBool::new(false)), detect_reset_notify: Arc::new(Notify::new()), @@ -3627,6 +3646,7 @@ mod tests { reported_cwd: Arc::new(Mutex::new(None)), child_wait_completed: None, kitty_keyboard_flags: Arc::new(AtomicU16::new(0)), + content_seq: Arc::new(AtomicU64::new(0)), detection_content_seq: Arc::new(AtomicU64::new(0)), full_lifecycle_authority_active: Arc::new(AtomicBool::new(false)), detect_reset_notify: Arc::new(Notify::new()), |
