[Lldb-commits] [lldb] [lldb] Make PrivateStateThread::m_is_running atomic (PR #231458)
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 13 04:11:18 PDT 2026
https://github.com/Teemperor created https://github.com/llvm/llvm-project/pull/231458
The flag is written by the thread starting the private state thread (e.g. in Process::Attach) and read from other threads via PrivateStateThreadIsRunning(), e.g. in Process::SendAsyncInterrupt.
This patch makes the variable atomic as it's just used as a global toggle to indicate whether the thread is running.
Original TSan report:
```
Read of size 1 at 0x00010bf46a20 by main thread:
#0 lldb_private::Process::PrivateStateThread::IsRunning() Process.h:3340
#1 lldb_private::Process::PrivateStateThreadIsRunning() const Process.h:3177
#2 lldb_private::Process::SendAsyncInterrupt(lldb_private::Thread*) Process.cpp:4268
#3 lldb::SBProcess::SendAsyncInterrupt() SBProcess.cpp:701 (liblldb.24.0.0git.dylib:arm64+0xf7474)
Previous write of size 1 at 0x00010bf46a20 by thread T1 (mutexes: write M0):
#0 lldb_private::Process::PrivateStateThread::StartupThread() Process.cpp:4124
#1 lldb_private::Process::StartPrivateStateThread(lldb::StateType, bool, std::__1::shared_ptr<lldb_private::Process::PrivateStateThread>*) Process.cpp:4190
#2 lldb_private::Process::Attach(lldb_private::ProcessAttachInfo&) Process.cpp:3290
#3 PlatformPOSIX::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Debugger&, lldb_private::Target*, lldb_private::Status&) PlatformPOSIX.cpp:415
#4 lldb_private::Target::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Stream*) Target.cpp:3859
#5 AttachToProcess(lldb_private::ProcessAttachInfo&, lldb_private::Target&) SBTarget.cpp:102
#6 lldb::SBTarget::AttachToProcessWithName(lldb::SBListener&, char const*, bool, lldb::SBError&) SBTarget.cpp:534
```
assisted-by: claude
>From 2d1ca697ab084375ab717cefc1eb3b34274a7d93 Mon Sep 17 00:00:00 2001
From: Raphael Isemann <rise at apple.com>
Date: Tue, 13 Oct 2026 12:02:16 +0100
Subject: [PATCH] [lldb] Make PrivateStateThread::m_is_running atomic
The flag is written by the thread starting the private state thread
(e.g. in Process::Attach) and read from other threads via
PrivateStateThreadIsRunning(), e.g. in Process::SendAsyncInterrupt.
This patch makes the variable atomic as it's just used as a global
toggle to indicate whether the thread is running.
Original TSan report:
```
Read of size 1 at 0x00010bf46a20 by main thread:
#0 lldb_private::Process::PrivateStateThread::IsRunning() Process.h:3340
#1 lldb_private::Process::PrivateStateThreadIsRunning() const Process.h:3177
#2 lldb_private::Process::SendAsyncInterrupt(lldb_private::Thread*) Process.cpp:4268
#3 lldb::SBProcess::SendAsyncInterrupt() SBProcess.cpp:701 (liblldb.24.0.0git.dylib:arm64+0xf7474)
Previous write of size 1 at 0x00010bf46a20 by thread T1 (mutexes: write M0):
#0 lldb_private::Process::PrivateStateThread::StartupThread() Process.cpp:4124
#1 lldb_private::Process::StartPrivateStateThread(lldb::StateType, bool, std::__1::shared_ptr<lldb_private::Process::PrivateStateThread>*) Process.cpp:4190
#2 lldb_private::Process::Attach(lldb_private::ProcessAttachInfo&) Process.cpp:3290
#3 PlatformPOSIX::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Debugger&, lldb_private::Target*, lldb_private::Status&) PlatformPOSIX.cpp:415
#4 lldb_private::Target::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Stream*) Target.cpp:3859
#5 AttachToProcess(lldb_private::ProcessAttachInfo&, lldb_private::Target&) SBTarget.cpp:102
#6 lldb::SBTarget::AttachToProcessWithName(lldb::SBListener&, char const*, bool, lldb::SBError&) SBTarget.cpp:534
```
assisted-by: claude
---
lldb/include/lldb/Target/Process.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index 226c58034dd65..7106d5e4e3638 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -11,6 +11,7 @@
#include "lldb/Host/Config.h"
+#include <atomic>
#include <climits>
#include <chrono>
@@ -3404,7 +3405,7 @@ void PruneThreadPlans();
//the < private state management.
ProcessRunLock m_public_run_lock;
ProcessRunLock m_private_run_lock;
- bool m_is_running = false;
+ std::atomic<bool> m_is_running = false;
Purpose m_purpose;
///< This will be the thread name given to the Private State HostThread when
///< it gets spun up.
More information about the lldb-commits
mailing list