From d76657f2c7fc18dcce3b9af43842c8afaba1646b Mon Sep 17 00:00:00 2001 From: Can Celik Date: Fri, 14 Aug 2026 05:18:30 +0300 Subject: fix: speed up alternate-screen history reads (#2426) refs #2387 --- src/pane.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/pane.rs') 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>>, child_wait_completed: Option>, kitty_keyboard_flags: Arc, + content_seq: Arc, detection_content_seq: Arc, full_lifecycle_authority_active: Arc, detect_reset_notify: Arc, @@ -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()), -- cgit v1.2.3