summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2015-01-09 19:47:45 +0000
committerEnrico Granata <egranata@apple.com>2015-01-09 19:47:45 +0000
commit3f7f2077c372e5c827c0c6ae7b2f8025402331a0 (patch)
tree75314e8e7d6681ad1766951e23a53f8238ea51ec
parent131d1770f6e00ed07f418f21d4b9b4fd2955a3e0 (diff)
downloadbcm5719-llvm-3f7f2077c372e5c827c0c6ae7b2f8025402331a0.tar.gz
bcm5719-llvm-3f7f2077c372e5c827c0c6ae7b2f8025402331a0.zip
Make the list of synthetic children thread safe
I have been seeing a few crashes where LLDB tries to acquire a cached synthetic child by index, and crashes in the ClusterManager obtaining a shared_ptr for that ValueObject That kind of crash most often means that I am holding on to a raw pointer to a ValueObject that was let go from the cluster The main way that could happen is that the synthetic provider is being updated at the same time that some child is being accessed from the previous provider state This fixes the problem by making the children be stored in a thread-safe map Fixes rdar://18627964 llvm-svn: 225538
-rw-r--r--lldb/include/lldb/Core/ThreadSafeSTLMap.h1
-rw-r--r--lldb/include/lldb/Core/ValueObjectSyntheticFilter.h6
-rw-r--r--lldb/source/Core/ValueObjectSyntheticFilter.cpp24
3 files changed, 16 insertions, 15 deletions
diff --git a/lldb/include/lldb/Core/ThreadSafeSTLMap.h b/lldb/include/lldb/Core/ThreadSafeSTLMap.h
index 703ce481f63..4235edc92ad 100644
--- a/lldb/include/lldb/Core/ThreadSafeSTLMap.h
+++ b/lldb/include/lldb/Core/ThreadSafeSTLMap.h
@@ -16,6 +16,7 @@
// Other libraries and framework includes
// Project includes
+#include "lldb/lldb-defines.h"
#include "lldb/Host/Mutex.h"
namespace lldb_private {
diff --git a/lldb/include/lldb/Core/ValueObjectSyntheticFilter.h b/lldb/include/lldb/Core/ValueObjectSyntheticFilter.h
index 9846ae6e247..49c5601dc0e 100644
--- a/lldb/include/lldb/Core/ValueObjectSyntheticFilter.h
+++ b/lldb/include/lldb/Core/ValueObjectSyntheticFilter.h
@@ -12,10 +12,10 @@
// C Includes
// C++ Includes
-#include <map>
#include <vector>
// Other libraries and framework includes
// Project includes
+#include "lldb/Core/ThreadSafeSTLMap.h"
#include "lldb/Core/ValueObject.h"
namespace lldb_private {
@@ -154,8 +154,8 @@ protected:
lldb::SyntheticChildrenSP m_synth_sp;
std::unique_ptr<SyntheticChildrenFrontEnd> m_synth_filter_ap;
- typedef std::map<uint32_t, ValueObject*> ByIndexMap;
- typedef std::map<const char*, uint32_t> NameToIndexMap;
+ typedef ThreadSafeSTLMap<uint32_t, ValueObject*> ByIndexMap;
+ typedef ThreadSafeSTLMap<const char*, uint32_t> NameToIndexMap;
typedef ByIndexMap::iterator ByIndexIterator;
typedef NameToIndexMap::iterator NameToIndexIterator;
diff --git a/lldb/source/Core/ValueObjectSyntheticFilter.cpp b/lldb/source/Core/ValueObjectSyntheticFilter.cpp
index 9bdf68963db..dafe73a5e57 100644
--- a/lldb/source/Core/ValueObjectSyntheticFilter.cpp
+++ b/lldb/source/Core/ValueObjectSyntheticFilter.cpp
@@ -182,8 +182,8 @@ ValueObjectSynthetic::UpdateValue ()
if (m_synth_filter_ap->Update() == false)
{
// filter said that cached values are stale
- m_children_byindex.clear();
- m_name_toindex.clear();
+ 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
@@ -216,23 +216,22 @@ ValueObjectSynthetic::GetChildAtIndex (size_t idx, bool can_create)
{
UpdateValueIfNeeded();
- ByIndexIterator iter = m_children_byindex.find(idx);
-
- if (iter == m_children_byindex.end())
+ ValueObject *valobj;
+ if (m_children_byindex.GetValueForKey(idx, valobj) == false)
{
if (can_create && m_synth_filter_ap.get() != NULL)
{
lldb::ValueObjectSP synth_guy = m_synth_filter_ap->GetChildAtIndex (idx);
if (!synth_guy)
return synth_guy;
- m_children_byindex[idx]= synth_guy.get();
+ m_children_byindex.SetValueForKey(idx, synth_guy.get());
return synth_guy;
}
else
return lldb::ValueObjectSP();
}
else
- return iter->second->GetSP();
+ return valobj->GetSP();
}
lldb::ValueObjectSP
@@ -253,20 +252,21 @@ ValueObjectSynthetic::GetIndexOfChildWithName (const ConstString &name)
{
UpdateValueIfNeeded();
- NameToIndexIterator iter = m_name_toindex.find(name.GetCString());
+ uint32_t found_index = UINT32_MAX;
+ bool did_find = m_name_toindex.GetValueForKey(name.GetCString(), found_index);
- if (iter == m_name_toindex.end() && m_synth_filter_ap.get() != NULL)
+ if (!did_find && m_synth_filter_ap.get() != NULL)
{
uint32_t index = m_synth_filter_ap->GetIndexOfChildWithName (name);
if (index == UINT32_MAX)
return index;
- m_name_toindex[name.GetCString()] = index;
+ m_name_toindex.SetValueForKey(name.GetCString(), index);
return index;
}
- else if (iter == m_name_toindex.end() && m_synth_filter_ap.get() == NULL)
+ else if (!did_find && m_synth_filter_ap.get() == NULL)
return UINT32_MAX;
else /*if (iter != m_name_toindex.end())*/
- return iter->second;
+ return found_index;
}
bool
OpenPOWER on IntegriCloud