summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2019-03-29 17:07:30 +0000
committerJim Ingham <jingham@apple.com>2019-03-29 17:07:30 +0000
commitcdd4892f12e860905565f4e4444d7726618f89bd (patch)
treec0dc087dd800b84beea1df1c2cb533bdecd83c06
parentdd0c7d88c6c52ffd7e346497cf36dc13f6ce6766 (diff)
downloadbcm5719-llvm-cdd4892f12e860905565f4e4444d7726618f89bd.tar.gz
bcm5719-llvm-cdd4892f12e860905565f4e4444d7726618f89bd.zip
Use the multi-lockable form of std::lock for operator=
For = operators for lists that have mutexes, we were either just taking the locks sequentially or hand-rolling a trick to try to avoid lock inversion. Use the std::lock mechanism for this instead. Differential Revision: https://reviews.llvm.org/D59957 llvm-svn: 357276
-rw-r--r--lldb/include/lldb/Core/ModuleSpec.h6
-rw-r--r--lldb/include/lldb/Utility/StreamTee.h7
-rw-r--r--lldb/source/Breakpoint/BreakpointLocationCollection.cpp12
-rw-r--r--lldb/source/Core/ModuleList.cpp25
-rw-r--r--lldb/source/Target/SectionLoadList.cpp5
-rw-r--r--lldb/source/Target/ThreadList.cpp6
6 files changed, 25 insertions, 36 deletions
diff --git a/lldb/include/lldb/Core/ModuleSpec.h b/lldb/include/lldb/Core/ModuleSpec.h
index 16a8cfa32b6..ab0f4e9912a 100644
--- a/lldb/include/lldb/Core/ModuleSpec.h
+++ b/lldb/include/lldb/Core/ModuleSpec.h
@@ -311,8 +311,10 @@ public:
ModuleSpecList &operator=(const ModuleSpecList &rhs) {
if (this != &rhs) {
- std::lock_guard<std::recursive_mutex> lhs_guard(m_mutex);
- std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_mutex);
+ std::lock(m_mutex, rhs.m_mutex);
+ std::lock_guard<std::recursive_mutex> lhs_guard(m_mutex, std::adopt_lock);
+ std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_mutex,
+ std::adopt_lock);
m_specs = rhs.m_specs;
}
return *this;
diff --git a/lldb/include/lldb/Utility/StreamTee.h b/lldb/include/lldb/Utility/StreamTee.h
index 43e99ac6e56..92e94d4494f 100644
--- a/lldb/include/lldb/Utility/StreamTee.h
+++ b/lldb/include/lldb/Utility/StreamTee.h
@@ -49,8 +49,11 @@ public:
StreamTee &operator=(const StreamTee &rhs) {
if (this != &rhs) {
Stream::operator=(rhs);
- std::lock_guard<std::recursive_mutex> lhs_locker(m_streams_mutex);
- std::lock_guard<std::recursive_mutex> rhs_locker(rhs.m_streams_mutex);
+ std::lock(m_streams_mutex, rhs.m_streams_mutex);
+ std::lock_guard<std::recursive_mutex> lhs_locker(m_streams_mutex,
+ std::adopt_lock);
+ std::lock_guard<std::recursive_mutex> rhs_locker(rhs.m_streams_mutex,
+ std::adopt_lock);
m_streams = rhs.m_streams;
}
return *this;
diff --git a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
index 413c12a06a6..0651ca09e8f 100644
--- a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
@@ -181,17 +181,11 @@ void BreakpointLocationCollection::GetDescription(
BreakpointLocationCollection &BreakpointLocationCollection::operator=(
const BreakpointLocationCollection &rhs) {
- // Same trick as in ModuleList to avoid lock inversion.
if (this != &rhs) {
- if (uintptr_t(this) > uintptr_t(&rhs)) {
- std::lock_guard<std::mutex> lhs_guard(m_collection_mutex);
- std::lock_guard<std::mutex> rhs_guard(rhs.m_collection_mutex);
+ std::lock(m_collection_mutex, rhs.m_collection_mutex);
+ std::lock_guard<std::mutex> lhs_guard(m_collection_mutex, std::adopt_lock);
+ std::lock_guard<std::mutex> rhs_guard(rhs.m_collection_mutex, std::adopt_lock);
m_break_loc_collection = rhs.m_break_loc_collection;
- } else {
- std::lock_guard<std::mutex> lhs_guard(m_collection_mutex);
- std::lock_guard<std::mutex> rhs_guard(rhs.m_collection_mutex);
- m_break_loc_collection = rhs.m_break_loc_collection;
- }
}
return *this;
}
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index 8740bd0f40a..d59e429ad9f 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -130,25 +130,12 @@ ModuleList::ModuleList(ModuleList::Notifier *notifier)
const ModuleList &ModuleList::operator=(const ModuleList &rhs) {
if (this != &rhs) {
- // That's probably me nit-picking, but in theoretical situation:
- //
- // * that two threads A B and
- // * two ModuleList's x y do opposite assignments ie.:
- //
- // in thread A: | in thread B:
- // x = y; | y = x;
- //
- // This establishes correct(same) lock taking order and thus avoids
- // priority inversion.
- if (uintptr_t(this) > uintptr_t(&rhs)) {
- std::lock_guard<std::recursive_mutex> lhs_guard(m_modules_mutex);
- std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_modules_mutex);
- m_modules = rhs.m_modules;
- } else {
- std::lock_guard<std::recursive_mutex> lhs_guard(m_modules_mutex);
- std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_modules_mutex);
- m_modules = rhs.m_modules;
- }
+ std::lock(m_modules_mutex, rhs.m_modules_mutex);
+ std::lock_guard<std::recursive_mutex> lhs_guard(m_modules_mutex,
+ std::adopt_lock);
+ std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_modules_mutex,
+ std::adopt_lock);
+ m_modules = rhs.m_modules;
}
return *this;
}
diff --git a/lldb/source/Target/SectionLoadList.cpp b/lldb/source/Target/SectionLoadList.cpp
index 45b6b52e184..598f49ca13d 100644
--- a/lldb/source/Target/SectionLoadList.cpp
+++ b/lldb/source/Target/SectionLoadList.cpp
@@ -27,8 +27,9 @@ SectionLoadList::SectionLoadList(const SectionLoadList &rhs)
}
void SectionLoadList::operator=(const SectionLoadList &rhs) {
- std::lock_guard<std::recursive_mutex> lhs_guard(m_mutex);
- std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_mutex);
+ std::lock(m_mutex, rhs.m_mutex);
+ std::lock_guard<std::recursive_mutex> lhs_guard(m_mutex, std::adopt_lock);
+ std::lock_guard<std::recursive_mutex> rhs_guard(rhs.m_mutex, std::adopt_lock);
m_addr_to_sect = rhs.m_addr_to_sect;
m_sect_to_addr = rhs.m_sect_to_addr;
}
diff --git a/lldb/source/Target/ThreadList.cpp b/lldb/source/Target/ThreadList.cpp
index 86248da4993..afdfda3b0ae 100644
--- a/lldb/source/Target/ThreadList.cpp
+++ b/lldb/source/Target/ThreadList.cpp
@@ -37,8 +37,10 @@ const ThreadList &ThreadList::operator=(const ThreadList &rhs) {
if (this != &rhs) {
// Lock both mutexes to make sure neither side changes anyone on us while
// the assignment occurs
- std::lock_guard<std::recursive_mutex> guard(GetMutex());
- std::lock_guard<std::recursive_mutex> rhs_guard(rhs.GetMutex());
+ std::lock(GetMutex(), rhs.GetMutex());
+ std::lock_guard<std::recursive_mutex> guard(GetMutex(), std::adopt_lock);
+ std::lock_guard<std::recursive_mutex> rhs_guard(rhs.GetMutex(),
+ std::adopt_lock);
m_process = rhs.m_process;
m_stop_id = rhs.m_stop_id;
OpenPOWER on IntegriCloud