]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/dap] Join JSON writer thread with DAP thread
authorTom de Vries <tdevries@suse.de>
Wed, 21 Feb 2024 09:46:08 +0000 (10:46 +0100)
committerTom de Vries <tdevries@suse.de>
Wed, 21 Feb 2024 09:46:08 +0000 (10:46 +0100)
The DAP interpreter runs in its own thread, and starts a few threads:
- the JSON reader thread,
- the JSON writer thread, and
- the inferior output reader thread.

As part of the DAP shutdown, both the JSON reader thread and the JSON writer
thread, as well as the DAP main thread run to exit, but these exits are not
ordered in any way.

Wait in the main DAP thread for the exit of the JSON writer thread.

This makes sure that the responses are flushed to the DAP client before DAP
shutdown.

An earlier version of this patch used Queue.task_done() to accomplish the
same, but that didn't guarantee writing the "<thread name>: terminating"
log entry from thread_wrapper before DAP shutdown.

Tested on aarch64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
PR dap/31380
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31380

gdb/python/lib/gdb/dap/io.py
gdb/python/lib/gdb/dap/server.py
gdb/python/lib/gdb/dap/startup.py

index 4edd504c7272d20051204e451832661b2a3eddec..81e835c7527a2a735fccfd06a1602fb2521270a9 100644 (file)
@@ -79,4 +79,4 @@ def start_json_writer(stream, queue):
             stream.write(body_bytes)
             stream.flush()
 
-    start_thread("JSON writer", _json_writer)
+    return start_thread("JSON writer", _json_writer)
index 7cc5a4681ee0cc2b46df42eda649973fe4480826..e711066074131116edcf5e6b0ad3088bddeada0c 100644 (file)
@@ -212,7 +212,7 @@ class Server:
         # Before looping, start the thread that writes JSON to the
         # 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)
+        json_writer = start_json_writer(self.out_stream, self.write_queue)
         start_thread("JSON reader", self._reader_thread)
         while not self.done:
             cmd = self.read_queue.get()
@@ -229,6 +229,7 @@ class Server:
         # JSON-writing thread, so that we can ensure that all
         # responses are flushed to the client before exiting.
         self.write_queue.put(None)
+        json_writer.join()
 
     @in_dap_thread
     def send_event_later(self, event, body=None):
index 60491212c6744afea684e9d5ef4a309417befbb0..0a42c91e8f48a888e1c46bb9116e5e1704d836d6 100644 (file)
@@ -80,6 +80,7 @@ def start_thread(name, target, args=()):
 
     result = gdb.Thread(name=name, target=thread_wrapper, args=args, daemon=True)
     result.start()
+    return result
 
 
 def start_dap(target):