]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Refactor CancellationHandler in DAP
authorTom Tromey <tromey@adacore.com>
Wed, 20 Nov 2024 19:46:53 +0000 (12:46 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 9 Dec 2024 20:52:54 +0000 (13:52 -0700)
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.

Reviewed-by: Kévin Le Gouguec <legouguec@adacore.com>
gdb/python/lib/gdb/dap/server.py

index 09190452edff174cc913dc52d524739e1478ca86..0f3991da77fb3180e5a15a4460b402b9bc7590d0 100644 (file)
@@ -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