summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2016-02-15 20:04:15 +0000
committerJim Ingham <jingham@apple.com>2016-02-15 20:04:15 +0000
commitb6bdfc522ccf8f42b1564aec7c71a876ec585ad5 (patch)
tree8009d85500c7326d5df6c7d288bf82f5c4dba597
parent71c992d85396071855fb1fcce8fc9433d7f41593 (diff)
downloadbcm5719-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.h4
-rw-r--r--lldb/source/Symbol/TypeSystem.cpp26
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;
+}
OpenPOWER on IntegriCloud