diff options
author | Tom Tromey <tromey@adacore.com> | 2023-11-07 09:23:47 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-12-11 11:44:19 -0700 |
commit | f895e1592d5f4e58776e6a2d7ccdcc028cc5df80 (patch) | |
tree | 715b010abd067eca88491138a0acd3ac3b19e360 /gdb/python | |
parent | 080530d8b6c3be802c53c0bb8a84032f355c2380 (diff) | |
download | gdb-f895e1592d5f4e58776e6a2d7ccdcc028cc5df80.zip gdb-f895e1592d5f4e58776e6a2d7ccdcc028cc5df80.tar.gz gdb-f895e1592d5f4e58776e6a2d7ccdcc028cc5df80.tar.bz2 |
Move DAP JSON reader to its own thread
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 <legouguec@adacore.com>
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/lib/gdb/dap/server.py | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py index d865dee..53a0ca7 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 |