Restore fn-arg `_runtime_vars` in `trio_proc` teardown

During the Phase A extraction of `trio_proc()` out of
`spawn._spawn` into its own submod, the
`debug.maybe_wait_for_debugger(child_in_debug=...)` call site in
the hard-reap `finally` got refactored from the original
`_runtime_vars.get('_debug_mode', ...)` (the fn parameter — the
dict that was constructed by the *parent* for the *child*'s
`SpawnSpec`) to `get_runtime_vars().get(...)` (a global getter that
returns the *parent's* live `_state`). Those are semantically
different — the first asks "is the child we just spawned in debug
mode?", the second asks "are *we* in debug mode?". Under
mixed-debug-mode trees the swap can incorrectly skip (or
unnecessarily delay) the debugger-lock wait during teardown.

Revert to the fn-parameter lookup and add an inline `NOTE` comment
calling out the distinction so it's harder to regress again.

Deats,
- `spawn/_trio.py`: `child_in_debug=get_runtime_vars().get(...)` →
  `child_in_debug=_runtime_vars.get(...)` at the
  `debug.maybe_wait_for_debugger(...)` call in the hard-reap block;
  add 4-line `NOTE` explaining the parent-vs-child distinction.
- `spawn/__init__.py`: drop trailing whitespace after the
  `'mp_forkserver'` docstring bullet.
- `ai/prompt-io/prompts/subints_spawner.md`: drop duplicated `with`
  in `"as with with subprocs"` prose (copilot grammar catch).

Review: PR #444 (Copilot)
https://github.com/goodboy/tractor/pull/444#pullrequestreview-4165928469

(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
subint_forkserver_backend
Gud Boi 2026-04-23 18:30:11 -04:00
parent ae5b63c0bc
commit a7b1ee34ef
3 changed files with 7 additions and 3 deletions

View File

@ -24,7 +24,7 @@ Part of this work should include,
is happening under the hood with how cpython implements subints. is happening under the hood with how cpython implements subints.
* default configuration should encourage state isolation as with * default configuration should encourage state isolation as with
with subprocs, but explicit public escape hatches to enable rigorously subprocs, but explicit public escape hatches to enable rigorously
managed shm channels for high performance apps. managed shm channels for high performance apps.
- all tests should be (able to be) parameterized to use the new - all tests should be (able to be) parameterized to use the new

View File

@ -246,7 +246,11 @@ async def trio_proc(
await proc.wait() await proc.wait()
await debug.maybe_wait_for_debugger( await debug.maybe_wait_for_debugger(
child_in_debug=get_runtime_vars().get( # NOTE: use the child's `_runtime_vars`
# (the fn-arg dict shipped via `SpawnSpec`)
# — NOT `get_runtime_vars()` which returns
# the *parent's* live runtime state.
child_in_debug=_runtime_vars.get(
'_debug_mode', False '_debug_mode', False
), ),
header_msg=( header_msg=(