https://github.com/DrSergei created 
https://github.com/llvm/llvm-project/pull/145231

This patch fixes a possible data race between main and event handler threads. 
Terminated event can be sent from `Disconnect` function or event handler. 
Consequently, there are some possible sequences of events. We must check events 
twice, because without getting an exited event, `exit_status` will be None. 
But, we don't know the order of events (for example, we can get terminated 
event before exited event), so we check events by filter. It is correct, 
because terminated event will be sent only once (guarded by `llvm::call_once`).

This patch moved from 
[145010](https://github.com/llvm/llvm-project/pull/145010) and based on idea 
from this 
[comment](https://github.com/llvm/llvm-project/pull/145010#discussion_r2159637210).

>From f83073c80a72eb3c913c5101993f4208f0a94aae Mon Sep 17 00:00:00 2001
From: Druzhkov Sergei <serzhdruz...@gmail.com>
Date: Thu, 19 Jun 2025 15:50:27 +0300
Subject: [PATCH] [lldb-dap] Fix flaky test

---
 lldb/test/API/tools/lldb-dap/server/TestDAP_server.py | 3 ++-
 lldb/tools/lldb-dap/tool/lldb-dap.cpp                 | 4 +---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/lldb/test/API/tools/lldb-dap/server/TestDAP_server.py 
b/lldb/test/API/tools/lldb-dap/server/TestDAP_server.py
index ed17044a220d4..116bc53a2dde0 100644
--- a/lldb/test/API/tools/lldb-dap/server/TestDAP_server.py
+++ b/lldb/test/API/tools/lldb-dap/server/TestDAP_server.py
@@ -101,7 +101,8 @@ def test_server_interrupt(self):
         # Interrupt the server which should disconnect all clients.
         process.send_signal(signal.SIGINT)
 
-        self.dap_server.wait_for_terminated()
+        self.dap_server.wait_for_event(["terminated", "exited"])
+        self.dap_server.wait_for_event(["terminated", "exited"])
         self.assertIsNotNone(
             self.dap_server.exit_status,
             "Process exited before interrupting lldb-dap server",
diff --git a/lldb/tools/lldb-dap/tool/lldb-dap.cpp 
b/lldb/tools/lldb-dap/tool/lldb-dap.cpp
index 9b9de5e21a742..9de6283319bb6 100644
--- a/lldb/tools/lldb-dap/tool/lldb-dap.cpp
+++ b/lldb/tools/lldb-dap/tool/lldb-dap.cpp
@@ -310,7 +310,7 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
                                     "DAP session (" + client_name +
                                         ") error: ");
       }
-
+      io->Close();
       DAP_LOG(log, "({0}) client disconnected", client_name);
       std::unique_lock<std::mutex> lock(dap_sessions_mutex);
       dap_sessions.erase(io.get());
@@ -342,8 +342,6 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
                      << " disconnected failed: "
                      << llvm::toString(std::move(error)) << "\n";
       }
-      // Close the socket to ensure the DAP::Loop read finishes.
-      sock->Close();
     }
   }
 

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to