From 92565a259fb396e1af223d558711a6cec4e61baa Mon Sep 17 00:00:00 2001 From: Frantisek Hrbata Date: Tue, 17 Jan 2023 13:13:54 +0100 Subject: [PATCH] tools: allow to interrupt port detection The main idf.py process has a handler for SIGINT, which actually just ignores it. The get_default_serial_port() function is called within the idf.py context to detect port for several tools(monitor,flash) and it's not possible to terminate it because of this. Let's ignore SIGINT only while running idf_monitor, which uses it to spawn gdb. Fixes: c6e3eb092273 ("idf.py.exe changes to handle Ctrl+C in correct way. H..") Signed-off-by: Frantisek Hrbata --- tools/idf.py | 10 ---------- tools/idf_py_actions/serial_ext.py | 10 +++++++++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/tools/idf.py b/tools/idf.py index bfaf57b940..3284b98ed7 100755 --- a/tools/idf.py +++ b/tools/idf.py @@ -20,13 +20,11 @@ import json import locale import os import os.path -import signal import subprocess import sys from collections import Counter, OrderedDict, _OrderedDictKeysView from importlib import import_module from pkgutil import iter_modules -from types import FrameType from typing import Any, Callable, Dict, List, Optional, Union # pyc files remain in the filesystem when switching between branches which might raise errors for incompatible @@ -689,15 +687,7 @@ def init_cli(verbose_output: List=None) -> Any: return CLI(help=cli_help, verbose_output=verbose_output, all_actions=all_actions) -def signal_handler(_signal: int, _frame: Optional[FrameType]) -> None: - # The Ctrl+C processed by other threads inside - pass - - def main() -> None: - # Processing of Ctrl+C event for all threads made by main() - signal.signal(signal.SIGINT, signal_handler) - # Check the environment only when idf.py is invoked regularly from command line. checks_output = None if SHELL_COMPLETE_RUN else check_environment() diff --git a/tools/idf_py_actions/serial_ext.py b/tools/idf_py_actions/serial_ext.py index d7c5e71c7f..24d4d5a261 100644 --- a/tools/idf_py_actions/serial_ext.py +++ b/tools/idf_py_actions/serial_ext.py @@ -3,6 +3,7 @@ import json import os +import signal import sys from typing import Any, Dict, List @@ -151,7 +152,14 @@ def action_extensions(base_actions: Dict, project_path: str) -> Dict: monitor_args += ['-m', ' '.join("'%s'" % a for a in idf_py)] hints = False # Temporarily disabled because of https://github.com/espressif/esp-idf/issues/9610 - RunTool('idf_monitor', monitor_args, args.project_dir, build_dir=args.build_dir, hints=hints, interactive=True)() + # Temporally ignore SIGINT, which is used in idf_monitor to spawn gdb. + old_handler = signal.getsignal(signal.SIGINT) + signal.signal(signal.SIGINT, signal.SIG_IGN) + + try: + RunTool('idf_monitor', monitor_args, args.project_dir, build_dir=args.build_dir, hints=hints, interactive=True)() + finally: + signal.signal(signal.SIGINT, old_handler) def flash(action: str, ctx: click.core.Context, args: PropertyDict) -> None: """