Przeglądaj źródła

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 <frantisek.hrbata@espressif.com>
Frantisek Hrbata 3 lat temu
rodzic
commit
92565a259f
2 zmienionych plików z 9 dodań i 11 usunięć
  1. 0 10
      tools/idf.py
  2. 9 1
      tools/idf_py_actions/serial_ext.py

+ 0 - 10
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()
 

+ 9 - 1
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:
         """