diff --git a/tractor/_spawn.py b/tractor/_spawn.py index 55ac9a3..a6edfec 100644 --- a/tractor/_spawn.py +++ b/tractor/_spawn.py @@ -21,6 +21,7 @@ from multiprocessing import forkserver # type: ignore from typing import Tuple from . import _forkserver_override +from ._debug import maybe_wait_for_debugger from ._state import ( current_actor, is_main_process, @@ -275,13 +276,15 @@ async def new_proc( nursery.cancel_scope.cancel() finally: + # The "hard" reap since no actor zombies are allowed! + # XXX: do this **after** cancellation/tearfown to avoid + # killing the process too early. if proc.poll() is None: - log.cancel(f"Attempting to hard kill {proc}") - - # The "hard" reap since no actor zombies are allowed! - # XXX: do this **after** cancellation/tearfown to avoid - # killing the process too early. with trio.CancelScope(shield=True): + # don't clobber an ongoing pdb + await maybe_wait_for_debugger() + + log.cancel(f"Attempting to hard kill {proc}") await do_hard_kill(proc) log.debug(f"Joined {proc}") diff --git a/tractor/_trionics.py b/tractor/_trionics.py index e29bf5e..1259be6 100644 --- a/tractor/_trionics.py +++ b/tractor/_trionics.py @@ -12,6 +12,7 @@ import trio from async_generator import asynccontextmanager from . import _debug +from ._debug import maybe_wait_for_debugger from ._state import current_actor, is_main_process, is_root_process from .log import get_logger, get_loglevel from ._actor import Actor @@ -280,26 +281,7 @@ async def _open_and_supervise_one_cancels_all_nursery( # will make the pdb repl unusable. # Instead try to wait for pdb to be released before # tearing down. - if is_root_process(): - - # TODO: could this make things more deterministic? - # wait to see if a sub-actor task will be - # scheduled and grab the tty lock on the next - # tick? - # await trio.testing.wait_all_tasks_blocked() - - debug_complete = _debug._no_remote_has_tty - if ( - debug_complete and - not debug_complete.is_set() - ): - log.warning( - 'Root has errored but pdb is in use by ' - f'child {_debug._global_actor_in_debug}\n' - 'Waiting on tty lock to release..') - - # with trio.CancelScope(shield=True): - await debug_complete.wait() + await maybe_wait_for_debugger() # if the caller's scope errored then we activate our # one-cancels-all supervisor strategy (don't