mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 02:00:03 +08:00
[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:
committed by
GitHub
parent
622ee03e26
commit
90a51a443a
@@ -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?
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user