[lldb] Implement bidirectional access for backing<->backed thread relationship (#125300)

This enables finding the backed thread from the backing thread without
going through the thread list, and it will be useful for subsequent
commits.
This commit is contained in:
Felipe de Azevedo Piovezan
2025-02-03 13:40:57 -08:00
committed by GitHub
parent 622ee03e26
commit 90a51a443a
5 changed files with 30 additions and 18 deletions

View File

@@ -470,6 +470,26 @@ public:
virtual void ClearStackFrames();
/// Sets the thread that is backed by this thread.
/// If backed_thread.GetBackedThread() is null, this method also calls
/// backed_thread.SetBackingThread(this).
/// If backed_thread.GetBackedThread() is non-null, asserts that it is equal
/// to `this`.
void SetBackedThread(Thread &backed_thread) {
m_backed_thread = backed_thread.shared_from_this();
// Ensure the bidrectional relationship is preserved.
Thread *backing_thread = backed_thread.GetBackingThread().get();
assert(backing_thread == nullptr || backing_thread == this);
if (backing_thread == nullptr)
backed_thread.SetBackingThread(shared_from_this());
}
void ClearBackedThread() { m_backed_thread.reset(); }
/// Returns the thread that is backed by this thread, if any.
lldb::ThreadSP GetBackedThread() const { return m_backed_thread.lock(); }
virtual bool SetBackingThread(const lldb::ThreadSP &thread_sp) {
return false;
}
@@ -1349,6 +1369,9 @@ protected:
LazyBool m_override_should_notify;
mutable std::unique_ptr<ThreadPlanStack> m_null_plan_stack_up;
/// The Thread backed by this thread, if any.
lldb::ThreadWP m_backed_thread;
private:
bool m_extended_info_fetched; // Have we tried to retrieve the m_extended_info
// for this thread?

View File

@@ -101,8 +101,6 @@ public:
lldb::ThreadSP GetThreadSPForThreadPtr(Thread *thread_ptr);
lldb::ThreadSP GetBackingThread(const lldb::ThreadSP &real_thread);
bool ShouldStop(Event *event_ptr);
Vote ShouldReportStop(Event *event_ptr);

View File

@@ -72,12 +72,17 @@ public:
void ClearStackFrames() override;
void ClearBackingThread() override { m_backing_thread_sp.reset(); }
void ClearBackingThread() override {
if (m_backing_thread_sp)
m_backing_thread_sp->ClearBackedThread();
m_backing_thread_sp.reset();
}
bool SetBackingThread(const lldb::ThreadSP &thread_sp) override {
// printf ("Thread 0x%llx is being backed by thread 0x%llx\n", GetID(),
// thread_sp->GetID());
m_backing_thread_sp = thread_sp;
thread_sp->SetBackedThread(*this);
return (bool)thread_sp;
}

View File

@@ -1728,7 +1728,7 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
thread_sp->SetStopInfo(StopInfoSP());
// If there's a memory thread backed by this thread, we need to use it to
// calculate StopInfo.
if (ThreadSP memory_thread_sp = m_thread_list.GetBackingThread(thread_sp))
if (ThreadSP memory_thread_sp = thread_sp->GetBackedThread())
thread_sp = memory_thread_sp;
if (exc_type != 0) {

View File

@@ -191,20 +191,6 @@ ThreadSP ThreadList::GetThreadSPForThreadPtr(Thread *thread_ptr) {
return thread_sp;
}
ThreadSP ThreadList::GetBackingThread(const ThreadSP &real_thread) {
std::lock_guard<std::recursive_mutex> guard(GetMutex());
ThreadSP thread_sp;
const uint32_t num_threads = m_threads.size();
for (uint32_t idx = 0; idx < num_threads; ++idx) {
if (m_threads[idx]->GetBackingThread() == real_thread) {
thread_sp = m_threads[idx];
break;
}
}
return thread_sp;
}
ThreadSP ThreadList::FindThreadByIndexID(uint32_t index_id, bool can_update) {
std::lock_guard<std::recursive_mutex> guard(GetMutex());