Author: jingham Date: Mon Feb 15 14:04:15 2016 New Revision: 260909 URL: http://llvm.org/viewvc/llvm-project?rev=260909&view=rev Log: 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> Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h lldb/trunk/source/Symbol/TypeSystem.cpp Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=260909&r1=260908&r2=260909&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original) +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Mon Feb 15 14:04:15 2016 @@ -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 Modified: lldb/trunk/source/Symbol/TypeSystem.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=260909&r1=260908&r2=260909&view=diff ============================================================================== --- lldb/trunk/source/Symbol/TypeSystem.cpp (original) +++ lldb/trunk/source/Symbol/TypeSystem.cpp Mon Feb 15 14:04:15 2016 @@ -165,7 +165,8 @@ TypeSystem::DeclContextFindDeclByName (v 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 { // 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 // 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 { // 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 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; +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits