[Lldb-commits] [lldb] [lldb-dap] Adding support for cancelling a request. (PR #130169)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Wed Apr 2 04:37:51 PDT 2025
================
@@ -778,28 +817,121 @@ llvm::Error DAP::Disconnect(bool terminateDebuggee) {
return ToError(error);
}
+bool DAP::IsCancelled(const protocol::Request &req) {
+ std::lock_guard<std::mutex> lock(m_cancelled_requests_mutex);
+ return m_cancelled_requests.contains(req.seq);
+}
+
+void DAP::ClearCancelRequest(const CancelArguments &args) {
+ std::lock_guard<std::mutex> cancalled_requests_lock(
+ m_cancelled_requests_mutex);
+ if (args.requestId)
+ m_cancelled_requests.erase(*args.requestId);
+}
+
+template <typename T>
+static std::optional<T> getArgumentsIfRequest(const Message &pm,
+ llvm::StringLiteral command) {
+ auto *const req = std::get_if<Request>(&pm);
+ if (!req || req->command != command)
+ return std::nullopt;
+
+ T args;
+ llvm::json::Path::Root root;
+ if (!fromJSON(req->arguments, args, root)) {
+ return std::nullopt;
+ }
+
+ return std::move(args);
+}
+
llvm::Error DAP::Loop() {
- auto cleanup = llvm::make_scope_exit([this]() {
+ std::future<llvm::Error> queue_reader = std::async([&]() -> llvm::Error {
+ llvm::set_thread_name(transport.GetClientName() + ".transport_handler");
+ auto cleanup = llvm::make_scope_exit([&]() {
+ // Ensure we're marked as disconnecting when the reader exits.
+ disconnecting = true;
+ m_queue_cv.notify_all();
+ });
+
+ while (!disconnecting) {
+ llvm::Expected<Message> next = transport.Read(std::chrono::seconds(1));
+ bool timeout = false;
+ bool eof = false;
+ if (llvm::Error Err = llvm::handleErrors(
+ next.takeError(),
+ [&](const EndOfFileError &E) -> llvm::Error {
+ eof = true;
+ return llvm::Error::success();
+ },
+ [&](const TimeoutError &) -> llvm::Error {
+ timeout = true;
+ return llvm::Error::success();
+ }))
+ return Err;
+
+ if (eof)
+ break;
----------------
labath wrote:
Something like this would probably look better
```suggestion
if (next.errorIsA<EndOfFileError>) {
consumeError(next.takeError());
break;
}
// same for TimeoutError
if (!next)
return next.takeError();
```
https://github.com/llvm/llvm-project/pull/130169
More information about the lldb-commits
mailing list