[Lldb-commits] [lldb] [lldb-dap] Only mark disconnecting when we are actually disconnecting (PR #216356)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 14 09:57:27 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Ebuka Ezike (da-viper)
<details>
<summary>Changes</summary>
Threads
```
TransportHandler | Request Handler | State
=====================================================
new request | free | disconnecting = false |
| | queue = 1 |
disconnect request | handled new request | disconnecting = true |
| | queue = 0
```
In the transport handler we have set m_disconnecting to true. In the window before we push the disconnect request into the queue, the request handler thread finished handling the previous request and is in the while loop. It waits on the m_queue_cv and sees. m_disconnecting = true and queue is empty.
DAP shuts down because it assumes there is nothing else to do. The client then times out waiting for the disconnect response.
Detach the thread if we cannot join it and let the OS deal with the thread cleanup.
---
Full diff: https://github.com/llvm/llvm-project/pull/216356.diff
1 Files Affected:
- (modified) lldb/tools/lldb-dap/DAP.cpp (+6-6)
``````````diff
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index bb7921317c6d3..f6695b029cd53 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -943,11 +943,6 @@ void DAP::Received(const protocol::Event &event) {
}
void DAP::Received(const protocol::Request &request) {
- if (request.command == "disconnect") {
- std::lock_guard<std::mutex> guard(m_queue_mutex);
- m_disconnecting = true;
- }
-
const std::optional<CancelArguments> cancel_args =
getArgumentsIfRequest<CancelArguments>(request, "cancel");
if (cancel_args) {
@@ -1065,8 +1060,13 @@ llvm::Error DAP::Loop() {
// Don't wait to join the mainloop thread if our callback wasn't added
// successfully, or we'll wait forever.
if (m_loop.AddPendingCallback(
- [](MainLoopBase &loop) { loop.RequestTermination(); }))
+ [](MainLoopBase &loop) { loop.RequestTermination(); })) {
thread.join();
+ } else {
+ DAP_LOG(log, "failed to terminate stop the main loop. Detaching the "
+ "Transport Handler thread.");
+ thread.detach();
+ }
if (m_error_occurred)
return llvm::createStringError(llvm::inconvertibleErrorCode(),
``````````
</details>
https://github.com/llvm/llvm-project/pull/216356
More information about the lldb-commits
mailing list