[4/7] Refactor CancellationHandler in DAP

Message ID 20241121-dap-launch-v3-v1-4-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 refactors the DAP CancellationHandler to be a context manager,
and reorganizes the caller to use this.  This is a bit more robust and
also simplifies a subsequent patch in this series.
---
 gdb/python/lib/gdb/dap/server.py | 33 +++++++++++++++------------------
 1 file changed, 15 insertions(+), 18 deletions(-)
  

Patch

diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py
index 09190452edff174cc913dc52d524739e1478ca86..0f3991da77fb3180e5a15a4460b402b9bc7590d0 100644
--- a/gdb/python/lib/gdb/dap/server.py
+++ b/gdb/python/lib/gdb/dap/server.py
@@ -65,15 +65,17 @@  class CancellationHandler:
         self.in_flight_gdb_thread = None
         self.reqs = []
 
-    def starting(self, req):
-        """Call at the start of the given request."""
-        with self.lock:
-            self.in_flight_dap_thread = req
-
-    def done(self, req):
-        """Indicate that the request is done."""
-        with self.lock:
-            self.in_flight_dap_thread = None
+    @contextmanager
+    def current_request(self, req):
+        """Return a new context manager that registers that request
+        REQ has started."""
+        try:
+            with self.lock:
+                self.in_flight_dap_thread = req
+            yield
+        finally:
+            with self.lock:
+                self.in_flight_dap_thread = None
 
     def cancel(self, req):
         """Call to cancel a request.
@@ -150,7 +152,6 @@  class Server:
             "command": params["command"],
         }
         try:
-            self.canceller.starting(req)
             if "arguments" in params:
                 args = params["arguments"]
             else:
@@ -181,11 +182,6 @@  class Server:
             result["message"] = str(e)
         return result
 
-    @in_dap_thread
-    def _handle_command_finish(self, params):
-        req = params["seq"]
-        self.canceller.done(req)
-
     # Read inferior output and sends OutputEvents to the client.  It
     # is run in its own thread.
     def _read_inferior_output(self):
@@ -243,9 +239,10 @@  class Server:
             # A None value here means the reader hit EOF.
             if cmd is None:
                 break
-            result = self._handle_command(cmd)
-            self._send_json(result)
-            self._handle_command_finish(cmd)
+            req = cmd["seq"]
+            with self.canceller.current_request(req):
+                result = self._handle_command(cmd)
+                self._send_json(result)
             fns = None
             with self.delayed_fns_lock:
                 fns = self.delayed_fns