[Lldb-commits] [lldb] [lldb] Fix deadlock between statusline and output mutex (PR #135956)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Wed Apr 16 05:39:44 PDT 2025


https://github.com/JDevlieghere created https://github.com/llvm/llvm-project/pull/135956

Fix a deadlock between the statusline mutex (in Debugger) and the output file mutex (in LockedStreamFile). The deadlock occurs when the main thread is calling the statusline callback while holding the output mutex in Editline, while the default event thread is trying to update the stausline.

rdar://149251156

>From 59e80e36a07922684dba14f421bca3176a6b5a13 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Wed, 16 Apr 2025 14:29:27 +0200
Subject: [PATCH] [lldb] Fix deadlock between statusline and output mutex

Fix a deadlock between the statusline mutex (in Debugger) and the output
file mutex (in LockedStreamFile). The deadlock occurs when the main
thread is calling the statusline callback while holding the output mutex
in Editline, while the default event thread is trying to update the
stausline.

rdar://149251156
---
 lldb/source/Host/common/Editline.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp
index 29abaf7c65f28..6900da9909eb8 100644
--- a/lldb/source/Host/common/Editline.cpp
+++ b/lldb/source/Host/common/Editline.cpp
@@ -567,8 +567,11 @@ int Editline::GetCharacter(EditLineGetCharType *c) {
     m_needs_prompt_repaint = false;
   }
 
-  if (m_redraw_callback)
+  if (m_redraw_callback) {
+    m_locked_output.reset();
     m_redraw_callback();
+    m_locked_output.emplace(m_output_stream_sp->Lock());
+  }
 
   if (m_multiline_enabled) {
     // Detect when the number of rows used for this input line changes due to



More information about the lldb-commits mailing list