[Lldb-commits] [lldb] [lldb] Synchronize access to m_statusline in the Debugger (PR #134759)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Thu Apr 10 11:14:13 PDT 2025
https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/134759
>From 9fcc1c89ff0361d9262abefe951b43dd37555fea Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Thu, 10 Apr 2025 11:13:12 -0700
Subject: [PATCH] [lldb] Synchronize access to m_statusline in the Debugger
Eliminate the potential for a race between the main thread, the default
event handler thread and the signal handling thread, when accessing the
m_statusline member.
---
lldb/include/lldb/Core/Debugger.h | 2 ++
lldb/source/Core/Debugger.cpp | 46 +++++++++++++++++++++++--------
2 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index c79a75ab61564..5932454f366b8 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -751,6 +751,8 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
IOHandlerStack m_io_handler_stack;
std::recursive_mutex m_io_handler_synchronous_mutex;
+ /// Mutex protecting the m_statusline member.
+ std::mutex m_statusline_mutex;
std::optional<Statusline> m_statusline;
llvm::StringMap<std::weak_ptr<LogHandler>> m_stream_handlers;
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 51029f91eb12d..5e5918a6091d9 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -251,6 +251,7 @@ Status Debugger::SetPropertyValue(const ExecutionContext *exe_ctx,
g_debugger_properties[ePropertyShowStatusline].name) {
// Statusline setting changed. If we have a statusline instance, update it
// now. Otherwise it will get created in the default event handler.
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
if (StatuslineSupported())
m_statusline.emplace(*this);
else
@@ -391,8 +392,12 @@ bool Debugger::SetTerminalWidth(uint64_t term_width) {
if (auto handler_sp = m_io_handler_stack.Top())
handler_sp->TerminalSizeChanged();
- if (m_statusline)
- m_statusline->TerminalSizeChanged();
+
+ {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (m_statusline)
+ m_statusline->TerminalSizeChanged();
+ }
return success;
}
@@ -409,8 +414,12 @@ bool Debugger::SetTerminalHeight(uint64_t term_height) {
if (auto handler_sp = m_io_handler_stack.Top())
handler_sp->TerminalSizeChanged();
- if (m_statusline)
- m_statusline->TerminalSizeChanged();
+
+ {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (m_statusline)
+ m_statusline->TerminalSizeChanged();
+ }
return success;
}
@@ -1141,8 +1150,11 @@ void Debugger::SetErrorFile(FileSP file_sp) {
}
void Debugger::SaveInputTerminalState() {
- if (m_statusline)
- m_statusline->Disable();
+ {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (m_statusline)
+ m_statusline->Disable();
+ }
int fd = GetInputFile().GetDescriptor();
if (fd != File::kInvalidDescriptor)
m_terminal_state.Save(fd, true);
@@ -1150,11 +1162,15 @@ void Debugger::SaveInputTerminalState() {
void Debugger::RestoreInputTerminalState() {
m_terminal_state.Restore();
- if (m_statusline)
- m_statusline->Enable();
+ {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (m_statusline)
+ m_statusline->Enable();
+ }
}
void Debugger::RedrawStatusline(bool update) {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
if (m_statusline)
m_statusline->Redraw(update);
}
@@ -2032,8 +2048,11 @@ lldb::thread_result_t Debugger::DefaultEventHandler() {
// are now listening to all required events so no events get missed
m_sync_broadcaster.BroadcastEvent(eBroadcastBitEventThreadIsListening);
- if (!m_statusline && StatuslineSupported())
- m_statusline.emplace(*this);
+ if (StatuslineSupported()) {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (!m_statusline)
+ m_statusline.emplace(*this);
+ }
bool done = false;
while (!done) {
@@ -2094,8 +2113,11 @@ lldb::thread_result_t Debugger::DefaultEventHandler() {
}
}
- if (m_statusline)
- m_statusline.reset();
+ {
+ std::lock_guard<std::mutex> guard(m_statusline_mutex);
+ if (m_statusline)
+ m_statusline.reset();
+ }
return {};
}
More information about the lldb-commits
mailing list