| β¦ | β¦ | @@ -0,0 +1,303 @@ | |
| 227 | + | child.exited = true; | |
| 228 | + | child.emit("error", error); | |
| 229 | + | } else { | |
| 230 | + | child.exit(null, "SIGKILL"); | |
π High process/SpawnHost.ts:230
When the launcher fails, stdout, stderr, and additional output streams can remain open, so a read started before awaiting the childβs exit hangs indefinitely if a surviving descendant still holds a socket open. fail() calls child.exit(), which destroys only stdin; destroy the childβs output streams when abandoning the host.
No longer relevant as of a9549c185d2db19cba8b857f001dbffbb007cf87
Note
Written by Claude Opus 5.5 on behalf of Dara
Not changing this here. SpawnHost.ts is #30209's Linux launcher; this PR stacks on it and only adds SpawnWorker.ts plus the taskkill line in the patch. A fix belongs in #30209 so the two branches don't diverge.
On the suggestion itself: a bare destroy() would not end the reader. Effect pipes these streams into its own PassThroughs, and pipe() forwards end and error but not close, so the read still hangs. I hit exactly this in the Windows launcher and verified it: ending the readable side (push(null)) lets readers finish with the output so far, and destroy(error) crashes the server when nobody reads stderr, because that pipe has no error listener. The Windows path now ends output streams when its worker dies (commit b1f00f33e39).
Sorry, I'm unable to act on this request because you do not have permissions within this repository.