llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: None (DrSergei)

<details>
<summary>Changes</summary>

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).

---
Full diff: https://github.com/llvm/llvm-project/pull/145231.diff


2 Files Affected:

- (modified) lldb/test/API/tools/lldb-dap/server/TestDAP_server.py (+2-1) 
- (modified) lldb/tools/lldb-dap/tool/lldb-dap.cpp (+1-3) 


``````````diff
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();
     }
   }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/145231
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to