zed/crates/dap/src
Miguel Raz Guzmán Macedo c642b422de
util: Use job objects to reap spawned process trees on Windows (#58885)
On Windows, `util::process::Child::kill()` only terminated the direct
child process, and nothing tied the lifetime of spawned process trees to
Zed. External agent servers launched through ACP (e.g. `claude-code-acp`
via `npx`) spawn node workers and MCP servers as grandchildren, which
were orphaned on every session teardown and accumulated indefinitely —
hundreds of idle `node.exe` processes and GBs of RAM over days.

This PR assigns spawned processes to a Win32 job object configured with
`JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE`:

- `kill()` now calls `TerminateJobObject`, killing the entire tree
instead of just the (shell wrapper) child.
- Dropping `Child` closes the job handle, which makes the OS reap the
tree — including when Zed exits for any reason (even crashes), since the
OS closes its handles.
- Unix behavior (process groups via `killpg`) is unchanged.

Added two Windows tests that spawn a real `powershell -> ping` process
tree and assert the grandchild is terminated on `kill()` and on drop.
Both fail without the fix and pass with it. Verified with `cargo test -p
util`, `script/clippy -p util`, and `cargo check -p agent_servers -p
dap` on Windows 11.

Closes #58873

Release Notes:

- Fixed external agent servers and debug adapters leaking helper
processes (e.g. node workers and MCP servers) on Windows.

---------

Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
2026-06-15 10:55:39 +00:00
..
adapters.rs dap: Support IPv6 addresses in TCP transport (#52244) 2026-04-27 08:42:45 +00:00
client.rs Bump Rust version to 1.94 (#51086) 2026-03-30 09:06:59 +00:00
dap.rs dap: Support IPv6 addresses in TCP transport (#52244) 2026-04-27 08:42:45 +00:00
debugger_settings.rs Automate settings registration (#42238) 2025-11-07 22:27:14 +00:00
inline_value.rs debugger: Generate inline values based on debugger.scm file (#33081) 2025-06-24 18:24:43 +00:00
proto_conversions.rs dap: Make ProtoConversion::to_proto consume self (#47871) 2026-01-28 16:00:52 +00:00
registry.rs Revert "Revert scheduler update (#46659)" (#46671) 2026-01-14 07:19:13 +00:00
transport.rs util: Use job objects to reap spawned process trees on Windows (#58885) 2026-06-15 10:55:39 +00:00