diff options
Diffstat (limited to 'source/Symbol/TypeSystem.cpp')
-rw-r--r-- | source/Symbol/TypeSystem.cpp | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/source/Symbol/TypeSystem.cpp b/source/Symbol/TypeSystem.cpp index 5c2ab5cceab6..2cd82f221f91 100644 --- a/source/Symbol/TypeSystem.cpp +++ b/source/Symbol/TypeSystem.cpp @@ -153,7 +153,9 @@ TypeSystem::DeclGetFunctionArgumentType (void *opaque_decl, size_t arg_idx) std::vector<CompilerDecl> -TypeSystem::DeclContextFindDeclByName (void *opaque_decl_ctx, ConstString name) +TypeSystem::DeclContextFindDeclByName (void *opaque_decl_ctx, + ConstString name, + bool ignore_imported_decls) { return std::vector<CompilerDecl>(); } @@ -161,9 +163,7 @@ TypeSystem::DeclContextFindDeclByName (void *opaque_decl_ctx, ConstString name) #pragma mark TypeSystemMap -TypeSystemMap::TypeSystemMap() : - m_mutex (), - m_map () +TypeSystemMap::TypeSystemMap() : m_mutex(), m_map(), m_clear_in_progress(false) { } @@ -174,15 +174,35 @@ TypeSystemMap::~TypeSystemMap() void TypeSystemMap::Clear () { - Mutex::Locker locker (m_mutex); - m_map.clear(); + collection map; + { + std::lock_guard<std::mutex> guard(m_mutex); + map = m_map; + m_clear_in_progress = true; + } + std::set<TypeSystem *> visited; + for (auto pair : map) + { + TypeSystem *type_system = pair.second.get(); + if (type_system && !visited.count(type_system)) + { + visited.insert(type_system); + type_system->Finalize(); + } + } + map.clear(); + { + std::lock_guard<std::mutex> guard(m_mutex); + m_map.clear(); + m_clear_in_progress = false; + } } void TypeSystemMap::ForEach (std::function <bool(TypeSystem *)> const &callback) { - Mutex::Locker locker (m_mutex); + std::lock_guard<std::mutex> guard(m_mutex); // Use a std::set so we only call the callback once for each unique // TypeSystem instance std::set<TypeSystem *> visited; @@ -201,7 +221,7 @@ TypeSystemMap::ForEach (std::function <bool(TypeSystem *)> const &callback) TypeSystem * TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Module *module, bool can_create) { - Mutex::Locker locker (m_mutex); + std::lock_guard<std::mutex> guard(m_mutex); collection::iterator pos = m_map.find(language); if (pos != m_map.end()) return pos->second.get(); @@ -212,7 +232,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(); } } @@ -222,14 +242,14 @@ 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(); } TypeSystem * TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Target *target, bool can_create) { - Mutex::Locker locker (m_mutex); + std::lock_guard<std::mutex> guard(m_mutex); collection::iterator pos = m_map.find(language); if (pos != m_map.end()) return pos->second.get(); @@ -240,7 +260,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(); } } @@ -249,7 +270,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; +} |