https://github.com/da-viper updated https://github.com/llvm/llvm-project/pull/148878
>From 5087ed54b6f1e81493524cca00500f615b1d8754 Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <yerimy...@gmail.com> Date: Tue, 15 Jul 2025 16:56:03 +0100 Subject: [PATCH] [lldb-dap] fix crash if disconnect request is not sent. It crashes because the event_thread and progress_event_thread not joined before calling DAP struct deconstructor. It now joins when we leave the main loop. --- lldb/tools/lldb-dap/DAP.cpp | 12 ++++++++++++ lldb/tools/lldb-dap/lldb-dap.cpp | 9 --------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index a67abe582abd4..134ddaa4c8f59 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -22,6 +22,7 @@ #include "lldb/lldb-defines.h" #include "lldb/lldb-enumerations.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/Error.h" @@ -224,6 +225,16 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) { void DAP::StopIO() { out.Stop(); err.Stop(); + + if (event_thread.joinable()) { + broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); + event_thread.join(); + } + + if (progress_event_thread.joinable()) { + broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); + progress_event_thread.join(); + } } // Send the JSON in "json_str" to the "out" stream. Correctly send the @@ -794,6 +805,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) { } llvm::Error DAP::Loop() { + auto stop_io = llvm::make_scope_exit([this]() { StopIO(); }); while (!disconnecting) { llvm::json::Object object; lldb_dap::PacketStatus status = GetNextObject(object); diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp index 9e0e7f21ce4fc..02688fc858f6b 100644 --- a/lldb/tools/lldb-dap/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/lldb-dap.cpp @@ -1096,15 +1096,6 @@ void request_disconnect(DAP &dap, const llvm::json::Object &request) { } SendTerminatedEvent(dap); dap.SendJSON(llvm::json::Value(std::move(response))); - if (dap.event_thread.joinable()) { - dap.broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); - dap.event_thread.join(); - } - if (dap.progress_event_thread.joinable()) { - dap.broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); - dap.progress_event_thread.join(); - } - dap.StopIO(); dap.disconnecting = true; } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits