Fix busy loop in `tart exec -i` after piped stdin reaches EOF

Unregister the stdin readabilityHandler when availableData returns empty:
a closed pipe fd stays permanently readable, so Foundation re-invokes the
handler in a tight loop (fstat + zero-byte read) at 100% of one core for
the rest of the command's lifetime.

Fixes #1280

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Nikolai Tillmann 2026-07-10 22:39:13 -07:00
parent 32d084e9ed
commit d983e1d9ed
1 changed files with 5 additions and 0 deletions

View File

@ -129,6 +129,11 @@ struct Exec: AsyncParsableCommand {
let data = handle.availableData
if data.isEmpty {
// EOF: unregister the handler, otherwise the fd stays permanently
// "readable" and Foundation re-invokes us in a tight loop, burning
// 100% of a core for the rest of the command's lifetime
handle.readabilityHandler = nil
continuation.finish()
} else {
continuation.yield(data)