From f895e1592d5f4e58776e6a2d7ccdcc028cc5df80 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 7 Nov 2023 09:23:47 -0700 Subject: [PATCH] Move DAP JSON reader to its own thread MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes the DAP server to move the JSON reader to a new thread. This is key to implementing request cancellation, as now requests can be read while an earlier one is being serviced. Reviewed-By: Kévin Le Gouguec --- gdb/python/lib/gdb/dap/server.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py index d865dee31a8..53a0ca7f448 100644 --- a/gdb/python/lib/gdb/dap/server.py +++ b/gdb/python/lib/gdb/dap/server.py @@ -60,6 +60,9 @@ class Server: # DAP client. Writing is done in a separate thread to avoid # blocking the read loop. self.write_queue = DAPQueue() + # Reading is also done in a separate thread, and a queue of + # requests is kept. + self.read_queue = DAPQueue() self.done = False global _server _server = self @@ -111,6 +114,14 @@ class Server: log("WROTE: <<<" + json.dumps(obj) + ">>>") self.write_queue.put(obj) + # This is run in a separate thread and simply reads requests from + # the client and puts them into a queue. + def _reader_thread(self): + while True: + cmd = read_json(self.in_stream) + log("READ: <<<" + json.dumps(cmd) + ">>>") + self.read_queue.put(cmd) + @in_dap_thread def main_loop(self): """The main loop of the DAP server.""" @@ -118,9 +129,9 @@ class Server: # client, and the thread that reads output from the inferior. start_thread("output reader", self._read_inferior_output) start_json_writer(self.out_stream, self.write_queue) + start_thread("JSON reader", self._reader_thread) while not self.done: - cmd = read_json(self.in_stream) - log("READ: <<<" + json.dumps(cmd) + ">>>") + cmd = self.read_queue.get() result = self._handle_command(cmd) self._send_json(result) events = self.delayed_events