From c16c70605249d6fc3a8f7cdaea49cd0cf8620818 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Tue, 27 Feb 2018 13:28:48 -0800 Subject: [PATCH] wait for daemon threads to di --- ptvsd/ipcjson.py | 8 ++++++-- ptvsd/wrapper.py | 21 ++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ptvsd/ipcjson.py b/ptvsd/ipcjson.py index 51de90b4..8ee55ba5 100644 --- a/ptvsd/ipcjson.py +++ b/ptvsd/ipcjson.py @@ -286,8 +286,12 @@ class IpcChannel(object): try: self._wait_for_message() except OSError as exc: - if exc.errno == errno.EBADF: # socket closed - return self.__exit + if exc.errno == errno.EBADF or self.__exit: # socket closed + return self.__exit + raise + except Exception: + if self.__exit: + return True raise try: msg = self.__message.pop(0) diff --git a/ptvsd/wrapper.py b/ptvsd/wrapper.py index 4ab8b252..ead28576 100644 --- a/ptvsd/wrapper.py +++ b/ptvsd/wrapper.py @@ -393,10 +393,10 @@ class VSCodeMessageProcessor(ipcjson.SocketIO, ipcjson.IpcChannel): pydevd._vscprocessor = self self._closed = False - t = threading.Thread(target=self.loop.run_forever, + self.event_loop_thread = threading.Thread(target=self.loop.run_forever, name='ptvsd.EventLoop') - t.daemon = True - t.start() + self.event_loop_thread.daemon = True + self.event_loop_thread.start() def close(self): """Stop the message processor and release its resources.""" @@ -413,7 +413,9 @@ class VSCodeMessageProcessor(ipcjson.SocketIO, ipcjson.IpcChannel): self.send_event('exited', exitCode=ptvsd_sys_exit_code) self.send_event('terminated') + self.set_exit() self.loop.stop() + self.event_loop_thread.join(0.1) if self.socket: self.socket.shutdown(socket.SHUT_RDWR) @@ -931,6 +933,11 @@ def _start(client, server): ######################## # pydevd hooks +def exit_handler(proc, server_thread): + proc.close() + if server_thread.is_alive(): + server_thread.join(0.1) + def start_server(port): """Return a socket to a (new) local pydevd-handling daemon. @@ -941,8 +948,8 @@ def start_server(port): """ server = _create_server(port) client, _ = server.accept() - pydevd, proc, _ = _start(client, server) - atexit.register(proc.close) + pydevd, proc, server_thread = _start(client, server) + atexit.register(lambda: exit_handler(proc, server_thread)) return pydevd @@ -956,8 +963,8 @@ def start_client(host, port): """ client = _create_client() client.connect((host, port)) - pydevd, proc, _ = _start(client, None) - atexit.register(proc.close) + pydevd, proc, server_thread = _start(client, None) + atexit.register(lambda: exit_handler(proc, server_thread)) return pydevd