[2/7] Reimplement DAP delayed events

Message ID 20241121-dap-launch-v3-v1-2-c1fa046b3285@adacore.com
State New
Headers
Series Rewrite DAP launch and attach implementations |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_gdb_build--master-arm fail Patch failed to apply

Commit Message

Tom Tromey Nov. 21, 2024, 8:35 p.m. UTC
  This patch changes how delayed events are implemented in DAP.  The new
implementation makes it simpler to add a delayed function call, which
will be needed by the final patch in this series.
---
 gdb/python/lib/gdb/dap/server.py | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)
  

Patch

diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py
index 8c6d90822f301e9948a413592d75be65988af222..ceffefc81dc1c42d695008a0fe67454deab71ee5 100644
--- a/gdb/python/lib/gdb/dap/server.py
+++ b/gdb/python/lib/gdb/dap/server.py
@@ -124,9 +124,9 @@  class Server:
         self.in_stream = in_stream
         self.out_stream = out_stream
         self.child_stream = child_stream
-        self.delayed_events_lock = threading.Lock()
+        self.delayed_fns_lock = threading.Lock()
         self.defer_stop_events = False
-        self.delayed_events = []
+        self.delayed_fns = []
         # This queue accepts JSON objects that are then sent to the
         # DAP client.  Writing is done in a separate thread to avoid
         # blocking the read loop.
@@ -246,13 +246,13 @@  class Server:
             result = self._handle_command(cmd)
             self._send_json(result)
             self._handle_command_finish(cmd)
-            events = None
-            with self.delayed_events_lock:
-                events = self.delayed_events
-                self.delayed_events = []
+            fns = None
+            with self.delayed_fns_lock:
+                fns = self.delayed_fns
+                self.delayed_fns = []
                 self.defer_stop_events = False
-            for event, body in events:
-                self.send_event(event, body)
+            for fn in fns:
+                fn()
         # Got the terminate request.  This is handled by the
         # JSON-writing thread, so that we can ensure that all
         # responses are flushed to the client before exiting.
@@ -264,8 +264,8 @@  class Server:
     def send_event_later(self, event, body=None):
         """Send a DAP event back to the client, but only after the
         current request has completed."""
-        with self.delayed_events_lock:
-            self.delayed_events.append((event, body))
+        with self.delayed_fns_lock:
+            self.delayed_fns.append(lambda: self.send_event(event, body))
 
     @in_gdb_thread
     def send_event_maybe_later(self, event, body=None):
@@ -275,9 +275,9 @@  class Server:
         the client."""
         with self.canceller.lock:
             if self.canceller.in_flight_dap_thread:
-                with self.delayed_events_lock:
+                with self.delayed_fns_lock:
                     if self.defer_stop_events:
-                        self.delayed_events.append((event, body))
+                        self.delayed_fns.append(lambda: self.send_event(event, body))
                         return
         self.send_event(event, body)