summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-12-03 08:53:42 +0100
committerRaphael Isemann <teemperor@gmail.com>2019-12-03 09:18:44 +0100
commit315600f480055f5143aaa245f25bd25221edfa91 (patch)
tree7c9232d82934df44f2606fd055d10829d58a6aa0 /lldb/source/Core
parentb5f295ffcec2fa7402e39eb1262acbd55a7d39f5 (diff)
downloadbcm5719-llvm-315600f480055f5143aaa245f25bd25221edfa91.tar.gz
bcm5719-llvm-315600f480055f5143aaa245f25bd25221edfa91.zip
[lldb][NFC] Remove ThreadSafeSTLVector and ThreadSafeSTLMap and their use in ValueObjectSynthetic
Summary: ThreadSafeSTLVector and ThreadSafeSTLMap are not useful for achieving any degree of thread safety in LLDB and should be removed before they are used in more places. They are only used (unsurprisingly incorrectly) in `ValueObjectSynthetic::GetChildAtIndex`, so this patch replaces their use there with a simple mutex with which we guard the related data structures. This doesn't make ValueObjectSynthetic::GetChildAtIndex any more thread-safe, but on the other hand it at least allows us to get rid of the ThreadSafeSTL* data structures without changing the observable behaviour of ValueObjectSynthetic (beside that it is now a few bytes smaller). Reviewers: labath, JDevlieghere, jingham Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D70845
Diffstat (limited to 'lldb/source/Core')
-rw-r--r--lldb/source/Core/ValueObjectSyntheticFilter.cpp49
1 files changed, 38 insertions, 11 deletions
diff --git a/lldb/source/Core/ValueObjectSyntheticFilter.cpp b/lldb/source/Core/ValueObjectSyntheticFilter.cpp
index a6bf35eac70..a30be1b0833 100644
--- a/lldb/source/Core/ValueObjectSyntheticFilter.cpp
+++ b/lldb/source/Core/ValueObjectSyntheticFilter.cpp
@@ -48,8 +48,9 @@ public:
ValueObjectSynthetic::ValueObjectSynthetic(ValueObject &parent,
lldb::SyntheticChildrenSP filter)
: ValueObject(parent), m_synth_sp(filter), m_children_byindex(),
- m_name_toindex(), m_synthetic_children_count(UINT32_MAX),
- m_synthetic_children_cache(), m_parent_type_name(parent.GetTypeName()),
+ m_name_toindex(), m_synthetic_children_cache(),
+ m_synthetic_children_count(UINT32_MAX),
+ m_parent_type_name(parent.GetTypeName()),
m_might_have_children(eLazyBoolCalculate),
m_provides_value(eLazyBoolCalculate) {
SetName(parent.GetName());
@@ -177,14 +178,20 @@ bool ValueObjectSynthetic::UpdateValue() {
"filter said caches are stale - clearing",
GetName().AsCString());
// filter said that cached values are stale
- m_children_byindex.Clear();
- m_name_toindex.Clear();
+ {
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ m_children_byindex.clear();
+ m_name_toindex.clear();
+ }
// usually, an object's value can change but this does not alter its
// children count for a synthetic VO that might indeed happen, so we need
// to tell the upper echelons that they need to come back to us asking for
// children
m_children_count_valid = false;
- m_synthetic_children_cache.Clear();
+ {
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ m_synthetic_children_cache.clear();
+ }
m_synthetic_children_count = UINT32_MAX;
m_might_have_children = eLazyBoolCalculate;
} else {
@@ -232,7 +239,16 @@ lldb::ValueObjectSP ValueObjectSynthetic::GetChildAtIndex(size_t idx,
UpdateValueIfNeeded();
ValueObject *valobj;
- if (!m_children_byindex.GetValueForKey(idx, valobj)) {
+ bool child_is_cached;
+ {
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ auto cached_child_it = m_children_byindex.find(idx);
+ child_is_cached = cached_child_it != m_children_byindex.end();
+ if (child_is_cached)
+ valobj = cached_child_it->second;
+ }
+
+ if (!child_is_cached) {
if (can_create && m_synth_filter_up != nullptr) {
LLDB_LOGF(log,
"[ValueObjectSynthetic::GetChildAtIndex] name=%s, child at "
@@ -254,9 +270,12 @@ lldb::ValueObjectSP ValueObjectSynthetic::GetChildAtIndex(size_t idx,
if (!synth_guy)
return synth_guy;
- if (synth_guy->IsSyntheticChildrenGenerated())
- m_synthetic_children_cache.AppendObject(synth_guy);
- m_children_byindex.SetValueForKey(idx, synth_guy.get());
+ {
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ if (synth_guy->IsSyntheticChildrenGenerated())
+ m_synthetic_children_cache.push_back(synth_guy);
+ m_children_byindex[idx] = synth_guy.get();
+ }
synth_guy->SetPreferredDisplayLanguageIfNeeded(
GetPreferredDisplayLanguage());
return synth_guy;
@@ -297,13 +316,21 @@ size_t ValueObjectSynthetic::GetIndexOfChildWithName(ConstString name) {
UpdateValueIfNeeded();
uint32_t found_index = UINT32_MAX;
- bool did_find = m_name_toindex.GetValueForKey(name.GetCString(), found_index);
+ bool did_find;
+ {
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ auto name_to_index = m_name_toindex.find(name.GetCString());
+ did_find = name_to_index != m_name_toindex.end();
+ if (did_find)
+ found_index = name_to_index->second;
+ }
if (!did_find && m_synth_filter_up != nullptr) {
uint32_t index = m_synth_filter_up->GetIndexOfChildWithName(name);
if (index == UINT32_MAX)
return index;
- m_name_toindex.SetValueForKey(name.GetCString(), index);
+ std::lock_guard<std::mutex> guard(m_child_mutex);
+ m_name_toindex[name.GetCString()] = index;
return index;
} else if (!did_find && m_synth_filter_up == nullptr)
return UINT32_MAX;
OpenPOWER on IntegriCloud