Skip to content

Commit 8b5eeee

Browse files
Pavel Minaevint19h
Pavel Minaev
authored andcommitted
Fix #1008: Re-attaching continuously creates 'accept_worker' threads in debugpy
Don't recreate the server socket needlessly.
1 parent 71d42ed commit 8b5eeee

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

setup.cfg

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[metadata]
2-
license_file = LICENSE
2+
license_files = LICENSE
33

44
[versioneer]
55
VCS = git
@@ -10,4 +10,4 @@ tag_prefix = v
1010
parentdir_prefix = debugpy-
1111

1212
[aliases]
13-
test=pytest
13+
test = pytest

src/debugpy/adapter/clients.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -470,12 +470,16 @@ def attach_request(self, request):
470470
)
471471

472472
if listen != ():
473+
if servers.is_serving():
474+
raise request.isnt_valid('Multiple concurrent "listen" sessions are not supported')
473475
host = listen("host", "127.0.0.1")
474476
port = listen("port", int)
475477
adapter.access_token = None
476478
host, port = servers.serve(host, port)
477479
else:
478-
host, port = servers.serve()
480+
if not servers.is_serving():
481+
servers.serve()
482+
host, port = servers.listener.getsockname()
479483

480484
# There are four distinct possibilities here.
481485
#

src/debugpy/adapter/servers.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
access_token = None
2020
"""Access token used to authenticate with the servers."""
2121

22+
listener = None
23+
"""Listener socket that accepts server connections."""
24+
2225
_lock = threading.RLock()
2326

2427
_connections = []
@@ -433,9 +436,16 @@ def serve(host="127.0.0.1", port=0):
433436
return listener.getsockname()
434437

435438

439+
def is_serving():
440+
return listener is not None
441+
442+
436443
def stop_serving():
444+
global listener
437445
try:
438-
listener.close()
446+
if listener is not None:
447+
listener.close()
448+
listener = None
439449
except Exception:
440450
log.swallow_exception(level="warning")
441451

src/debugpy/common/log.py

+6
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ def report_paths(get_paths, label=None):
339339

340340
report_paths("os.__file__")
341341
report_paths("threading.__file__")
342+
report_paths("debugpy.__file__")
342343

343344
result = "".join(result).rstrip("\n")
344345
info("{0}", result)
@@ -376,3 +377,8 @@ def _vars(*names): # pragma: no cover
376377
def _stack(): # pragma: no cover
377378
stack = "\n".join(traceback.format_stack())
378379
warning("$STACK:\n\n{0}", stack)
380+
381+
382+
def _threads(): # pragma: no cover
383+
output = "\n".join([str(t) for t in threading.enumerate()])
384+
warning("$THREADS:\n\n{0}", output)

0 commit comments

Comments
 (0)