Fix #1008: Re-attaching continuously creates 'accept_worker' threads in debugpy

Don't recreate the server socket needlessly.
This commit is contained in:
Pavel Minaev 2022-08-11 11:03:15 -07:00 committed by Pavel Minaev
parent 71d42ed63f
commit 8b5eeee7e0
4 changed files with 24 additions and 4 deletions

View file

@ -1,5 +1,5 @@
[metadata] [metadata]
license_file = LICENSE license_files = LICENSE
[versioneer] [versioneer]
VCS = git VCS = git
@ -10,4 +10,4 @@ tag_prefix = v
parentdir_prefix = debugpy- parentdir_prefix = debugpy-
[aliases] [aliases]
test=pytest test = pytest

View file

@ -470,12 +470,16 @@ class Client(components.Component):
) )
if listen != (): if listen != ():
if servers.is_serving():
raise request.isnt_valid('Multiple concurrent "listen" sessions are not supported')
host = listen("host", "127.0.0.1") host = listen("host", "127.0.0.1")
port = listen("port", int) port = listen("port", int)
adapter.access_token = None adapter.access_token = None
host, port = servers.serve(host, port) host, port = servers.serve(host, port)
else: else:
host, port = servers.serve() if not servers.is_serving():
servers.serve()
host, port = servers.listener.getsockname()
# There are four distinct possibilities here. # There are four distinct possibilities here.
# #

View file

@ -19,6 +19,9 @@ from debugpy.adapter import components
access_token = None access_token = None
"""Access token used to authenticate with the servers.""" """Access token used to authenticate with the servers."""
listener = None
"""Listener socket that accepts server connections."""
_lock = threading.RLock() _lock = threading.RLock()
_connections = [] _connections = []
@ -433,9 +436,16 @@ def serve(host="127.0.0.1", port=0):
return listener.getsockname() return listener.getsockname()
def is_serving():
return listener is not None
def stop_serving(): def stop_serving():
global listener
try: try:
listener.close() if listener is not None:
listener.close()
listener = None
except Exception: except Exception:
log.swallow_exception(level="warning") log.swallow_exception(level="warning")

View file

@ -339,6 +339,7 @@ def describe_environment(header):
report_paths("os.__file__") report_paths("os.__file__")
report_paths("threading.__file__") report_paths("threading.__file__")
report_paths("debugpy.__file__")
result = "".join(result).rstrip("\n") result = "".join(result).rstrip("\n")
info("{0}", result) info("{0}", result)
@ -376,3 +377,8 @@ def _vars(*names): # pragma: no cover
def _stack(): # pragma: no cover def _stack(): # pragma: no cover
stack = "\n".join(traceback.format_stack()) stack = "\n".join(traceback.format_stack())
warning("$STACK:\n\n{0}", stack) warning("$STACK:\n\n{0}", stack)
def _threads(): # pragma: no cover
output = "\n".join([str(t) for t in threading.enumerate()])
warning("$THREADS:\n\n{0}", output)