mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 00:02:23 +00:00
run_stream polled pane.controls(epoch) every 200ms behind a read timeout, so every attached pane woke its thread five times a second just to notice a handover that may never come. The writer already learns of the handover the instant it happens — its channel closes — so it now shuts the connection's read side down on its way out, and the reader goes back to a plain blocking read. SshManager::routes() reported a link as disconnected whenever its slot's try_lock failed, which is precisely when the link is in use. The CLI's -m <machine> refuses to route over a link it is told is down, so an actively used connection would intermittently fail. Busy now reads as connected, matching how SshConnection::is_alive resolves the same contention. Also: the exit-code probe takes the child lock with try_lock, since Drop holds it across a blocking wait(), and its window drops from 2s to 500ms — it only needs to cover the race between pty EOF and the child becoming reapable, and everything past that is a pane that looks frozen to every client. Observer budget now covers status traffic and the initial replay, not just output. Uptime is anchored where the control listener opens so a GUI-hosted server does not report itself as freshly started.