From: Tom Tromey Date: Wed, 20 Nov 2024 19:46:53 +0000 (-0700) Subject: Refactor CancellationHandler in DAP X-Git-Tag: gdb-16-branchpoint~152 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d8e96210c0c214626cb33221bf39108c626cc2ba;p=thirdparty%2Fbinutils-gdb.git Refactor CancellationHandler in DAP 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 --- diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py index 09190452edf..0f3991da77f 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