From dc17e51bc52c9557200c0b67628174cdf8d4cdc3 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Sun, 30 May 2021 11:33:08 -0400 Subject: [PATCH] Catch and delay errors in the root if debugger is active --- tractor/_trionics.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/tractor/_trionics.py b/tractor/_trionics.py index 894ab7d..e4d1b9a 100644 --- a/tractor/_trionics.py +++ b/tractor/_trionics.py @@ -11,6 +11,7 @@ import warnings import trio from async_generator import asynccontextmanager +from . import _debug from ._state import current_actor, is_main_process from .log import get_logger, get_loglevel from ._actor import Actor @@ -367,10 +368,26 @@ async def open_nursery( async with open_root_actor(**kwargs) as actor: assert actor is current_actor() - async with _open_and_supervise_one_cancels_all_nursery( - actor - ) as anursery: - yield anursery + try: + async with _open_and_supervise_one_cancels_all_nursery( + actor + ) as anursery: + yield anursery + + except (Exception, trio.MultiError, trio.Cancelled): + # if we error in the root but the debugger is + # engaged we don't want to prematurely kill (and + # thus clobber access to) the local tty streams. + # instead try to wait for pdb to be released before + # tearing down. + if not _debug._pdb_complete.is_set(): + log.warning( + "Root has errored but pdb is active..waiting " + "on debug lock") + with trio.CancelScope(shield=True): + await _debug._pdb_complete.wait() + + raise else: # sub-nursery case