From d983e1d9eddb8098e29d189dd32baf8737a3c8ba Mon Sep 17 00:00:00 2001 From: Nikolai Tillmann Date: Fri, 10 Jul 2026 22:39:13 -0700 Subject: [PATCH] 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 --- Sources/tart/Commands/Exec.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/tart/Commands/Exec.swift b/Sources/tart/Commands/Exec.swift index daa9504..61b1613 100644 --- a/Sources/tart/Commands/Exec.swift +++ b/Sources/tart/Commands/Exec.swift @@ -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)