[Lldb-commits] [lldb] e8f1623 - [lldb-dap] Addressing the order of events during disconnect to flush output. (#128583)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Feb 24 14:41:22 PST 2025
Author: John Harrison
Date: 2025-02-24T14:41:19-08:00
New Revision: e8f1623a223adf5446e9999403aa6ce827a9b6dc
URL: https://github.com/llvm/llvm-project/commit/e8f1623a223adf5446e9999403aa6ce827a9b6dc
DIFF: https://github.com/llvm/llvm-project/commit/e8f1623a223adf5446e9999403aa6ce827a9b6dc.diff
LOG: [lldb-dap] Addressing the order of events during disconnect to flush output. (#128583)
The TestDAP_ouput test is flaky due to the order of events during
shutdown. We were stopping the output and error handle redirection after
we finished the disconnect request, which can cause us to miss output
events due to timing. Moving when we stop the redirection to ensure we
have consistent output prior to disconnect responding.
Fixes #128567
Added:
Modified:
lldb/test/API/tools/lldb-dap/output/TestDAP_output.py
lldb/tools/lldb-dap/DAP.cpp
lldb/tools/lldb-dap/DAP.h
Removed:
################################################################################
diff --git a/lldb/test/API/tools/lldb-dap/output/TestDAP_output.py b/lldb/test/API/tools/lldb-dap/output/TestDAP_output.py
index eae7629409844..fe54511d1e21f 100644
--- a/lldb/test/API/tools/lldb-dap/output/TestDAP_output.py
+++ b/lldb/test/API/tools/lldb-dap/output/TestDAP_output.py
@@ -16,6 +16,7 @@ def test_output(self):
program = self.getBuildArtifact("a.out")
self.build_and_launch(
program,
+ disconnectAutomatically=False,
exitCommands=[
# Ensure that output produced by lldb itself is not consumed by the OutputRedirector.
"?script print('out\\0\\0', end='\\r\\n', file=sys.stdout)",
@@ -33,6 +34,9 @@ def test_output(self):
self.continue_to_exit()
+ # Disconnecting from the server to ensure any pending IO is flushed.
+ self.dap_server.request_disconnect()
+
output += self.get_stdout(timeout=lldbdap_testcase.DAPTestCaseBase.timeoutval)
self.assertTrue(output and len(output) > 0, "expect program stdout")
self.assertIn(
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index c9487dd89b5dc..c966f4cfae027 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -223,10 +223,7 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
return llvm::Error::success();
}
-void DAP::StopIO() {
- out.Stop();
- err.Stop();
-
+void DAP::StopEventHandlers() {
if (event_thread.joinable()) {
broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread);
event_thread.join();
@@ -853,13 +850,17 @@ lldb::SBError DAP::Disconnect(bool terminateDebuggee) {
SendTerminatedEvent();
+ // Stop forwarding the debugger output and error handles.
+ out.Stop();
+ err.Stop();
+
disconnecting = true;
return error;
}
llvm::Error DAP::Loop() {
- auto stop_io = llvm::make_scope_exit([this]() { StopIO(); });
+ auto cleanup = llvm::make_scope_exit([this]() { StopEventHandlers(); });
while (!disconnecting) {
llvm::json::Object object;
lldb_dap::PacketStatus status = GetNextObject(object);
diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
index ca26ea1b9a5de..1cc0170637c15 100644
--- a/lldb/tools/lldb-dap/DAP.h
+++ b/lldb/tools/lldb-dap/DAP.h
@@ -228,8 +228,8 @@ struct DAP {
llvm::Error ConfigureIO(std::FILE *overrideOut = nullptr,
std::FILE *overrideErr = nullptr);
- /// Stop the redirected IO threads and associated pipes.
- void StopIO();
+ /// Stop event handler threads.
+ void StopEventHandlers();
// Serialize the JSON value into a string and send the JSON packet to
// the "out" stream.
More information about the lldb-commits
mailing list