================
@@ -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
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to