Fixed a crasher that has been borking out heap for a long time.
ThreadList had an assignment operator that didn't lock the "rhs" thread list object. This means a thread list can be mutated while it is being copied. The copy constructor calls the assignment operator as well. So this fixes the unsafe threaded access to ThreadList which we believe is responsible for a lot of crashes. <rdar://problem/28075793> llvm-svn: 289100
This commit is contained in:
parent
77a45576ef
commit
b5cd6e7b7e
|
@ -48,11 +48,11 @@ public:
|
||||||
return ThreadIterable(m_threads, GetMutex());
|
return ThreadIterable(m_threads, GetMutex());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::recursive_mutex &GetMutex() { return m_mutex; }
|
virtual std::recursive_mutex &GetMutex() const { return m_mutex; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
collection m_threads;
|
collection m_threads;
|
||||||
std::recursive_mutex m_mutex;
|
mutable std::recursive_mutex m_mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lldb_private
|
} // namespace lldb_private
|
||||||
|
|
|
@ -135,7 +135,7 @@ public:
|
||||||
|
|
||||||
void SetStopID(uint32_t stop_id);
|
void SetStopID(uint32_t stop_id);
|
||||||
|
|
||||||
std::recursive_mutex &GetMutex() override;
|
std::recursive_mutex &GetMutex() const override;
|
||||||
|
|
||||||
void Update(ThreadList &rhs);
|
void Update(ThreadList &rhs);
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ const ThreadList &ThreadList::operator=(const ThreadList &rhs) {
|
||||||
// Lock both mutexes to make sure neither side changes anyone on us
|
// Lock both mutexes to make sure neither side changes anyone on us
|
||||||
// while the assignment occurs
|
// while the assignment occurs
|
||||||
std::lock_guard<std::recursive_mutex> guard(GetMutex());
|
std::lock_guard<std::recursive_mutex> guard(GetMutex());
|
||||||
|
std::lock_guard<std::recursive_mutex> rhs_guard(rhs.GetMutex());
|
||||||
|
|
||||||
m_process = rhs.m_process;
|
m_process = rhs.m_process;
|
||||||
m_stop_id = rhs.m_stop_id;
|
m_stop_id = rhs.m_stop_id;
|
||||||
|
@ -749,7 +750,7 @@ void ThreadList::Flush() {
|
||||||
(*pos)->Flush();
|
(*pos)->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::recursive_mutex &ThreadList::GetMutex() {
|
std::recursive_mutex &ThreadList::GetMutex() const {
|
||||||
return m_process->m_thread_mutex;
|
return m_process->m_thread_mutex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue