diff options
author | Jim Ingham <jingham@apple.com> | 2016-02-15 20:04:15 +0000 |
---|---|---|
committer | Jim Ingham <jingham@apple.com> | 2016-02-15 20:04:15 +0000 |
commit | b6bdfc522ccf8f42b1564aec7c71a876ec585ad5 (patch) | |
tree | 8009d85500c7326d5df6c7d288bf82f5c4dba597 | |
parent | 71c992d85396071855fb1fcce8fc9433d7f41593 (diff) | |
download | bcm5719-llvm-b6bdfc522ccf8f42b1564aec7c71a876ec585ad5.tar.gz bcm5719-llvm-b6bdfc522ccf8f42b1564aec7c71a876ec585ad5.zip |
Refinement of r260624. It is possible somebody might try to add to the map
while we are finalizing its elements. Prevent that.
<rdar://problem/24554920>
llvm-svn: 260909
-rw-r--r-- | lldb/include/lldb/Symbol/TypeSystem.h | 4 | ||||
-rw-r--r-- | lldb/source/Symbol/TypeSystem.cpp | 26 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 83372ad4aaf..eeecf3ee98a 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -607,9 +607,13 @@ protected: GetTypeSystemForLanguage (lldb::LanguageType language, Target *target, bool can_create); protected: + void + AddToMap (lldb::LanguageType language, lldb::TypeSystemSP const &type_system_sp); + typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> collection; mutable Mutex m_mutex; ///< A mutex to keep this object happy in multi-threaded environments. collection m_map; + bool m_clear_in_progress; }; } // namespace lldb_private diff --git a/lldb/source/Symbol/TypeSystem.cpp b/lldb/source/Symbol/TypeSystem.cpp index 5354f22a10f..f8690aa79ef 100644 --- a/lldb/source/Symbol/TypeSystem.cpp +++ b/lldb/source/Symbol/TypeSystem.cpp @@ -165,7 +165,8 @@ TypeSystem::DeclContextFindDeclByName (void *opaque_decl_ctx, TypeSystemMap::TypeSystemMap() : m_mutex (), - m_map () + m_map (), + m_clear_in_progress(false) { } @@ -180,6 +181,7 @@ TypeSystemMap::Clear () { Mutex::Locker locker (m_mutex); map = m_map; + m_clear_in_progress = true; } std::set<TypeSystem *> visited; for (auto pair : map) @@ -195,6 +197,7 @@ TypeSystemMap::Clear () { Mutex::Locker locker (m_mutex); m_map.clear(); + m_clear_in_progress = false; } } @@ -232,7 +235,7 @@ TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Module *mo { // Add a new mapping for "language" to point to an already existing // TypeSystem that supports this language - m_map[language] = pair.second; + AddToMap(language, pair.second); return pair.second.get(); } } @@ -242,7 +245,7 @@ TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Module *mo // Cache even if we get a shared pointer that contains null type system back lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, module); - m_map[language] = type_system_sp; + AddToMap (language, type_system_sp); return type_system_sp.get(); } @@ -260,7 +263,8 @@ TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Target *ta { // Add a new mapping for "language" to point to an already existing // TypeSystem that supports this language - m_map[language] = pair.second; + + AddToMap(language, pair.second); return pair.second.get(); } } @@ -269,7 +273,17 @@ TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Target *ta return nullptr; // Cache even if we get a shared pointer that contains null type system back - lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, target); - m_map[language] = type_system_sp; + lldb::TypeSystemSP type_system_sp; + if (!m_clear_in_progress) + type_system_sp = TypeSystem::CreateInstance (language, target); + + AddToMap(language, type_system_sp); return type_system_sp.get(); } + +void +TypeSystemMap::AddToMap (lldb::LanguageType language, lldb::TypeSystemSP const &type_system_sp) +{ + if (!m_clear_in_progress) + m_map[language] = type_system_sp; +} |