[Lldb-commits] [PATCH] D13941: Fix some race condition in ConstString around Mangled name handling

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Wed Oct 21 06:38:35 PDT 2015


tberghammer created this revision.
tberghammer added reviewers: labath, clayborg.
tberghammer added a subscriber: lldb-commits.

Fix some race condition in ConstString around Mangled name handling

http://reviews.llvm.org/D13941

Files:
  source/Core/ConstString.cpp

Index: source/Core/ConstString.cpp
===================================================================
--- source/Core/ConstString.cpp
+++ source/Core/ConstString.cpp
@@ -36,7 +36,9 @@
     {
         if (ccstr)
         {
-            const StringPoolEntryType&entry = GetStringMapEntryFromKeyData (ccstr);
+            uint8_t h = hash (llvm::StringRef(ccstr));
+            llvm::sys::SmartScopedReader<false> rlock(m_string_pools[h].m_mutex);
+            const StringPoolEntryType& entry = GetStringMapEntryFromKeyData (ccstr);
             return entry.getKey().size();
         }
         return 0;
@@ -46,17 +48,29 @@
     GetMangledCounterpart (const char *ccstr) const
     {
         if (ccstr)
+        {
+            uint8_t h = hash (llvm::StringRef(ccstr));
+            llvm::sys::SmartScopedReader<false> rlock(m_string_pools[h].m_mutex);
             return GetStringMapEntryFromKeyData (ccstr).getValue();
+        }
         return 0;
     }
 
     bool
     SetMangledCounterparts (const char *key_ccstr, const char *value_ccstr)
     {
         if (key_ccstr && value_ccstr)
         {
-            GetStringMapEntryFromKeyData (key_ccstr).setValue(value_ccstr);
-            GetStringMapEntryFromKeyData (value_ccstr).setValue(key_ccstr);
+            {
+                uint8_t h = hash (llvm::StringRef(key_ccstr));
+                llvm::sys::SmartScopedWriter<false> wlock(m_string_pools[h].m_mutex);
+                GetStringMapEntryFromKeyData (key_ccstr).setValue(value_ccstr);
+            }
+            {
+                uint8_t h = hash (llvm::StringRef(value_ccstr));
+                llvm::sys::SmartScopedWriter<false> wlock(m_string_pools[h].m_mutex);
+                GetStringMapEntryFromKeyData (value_ccstr).setValue(key_ccstr);
+            }
             return true;
         }
         return false;
@@ -104,18 +118,29 @@
     {
         if (demangled_cstr)
         {
-            llvm::StringRef string_ref (demangled_cstr);
-            uint8_t h = hash (string_ref);
-            llvm::sys::SmartScopedWriter<false> wlock(m_string_pools[h].m_mutex);
+            const char *demangled_ccstr = nullptr;
 
-            // Make string pool entry with the mangled counterpart already set
-            StringPoolEntryType& entry = *m_string_pools[h].m_string_map.insert (std::make_pair (string_ref, mangled_ccstr)).first;
+            {
+                llvm::StringRef string_ref (demangled_cstr);
+                uint8_t h = hash (string_ref);
+                llvm::sys::SmartScopedWriter<false> wlock(m_string_pools[h].m_mutex);
+
+                // Make string pool entry with the mangled counterpart already set
+                StringPoolEntryType& entry = *m_string_pools[h].m_string_map.insert (
+                    std::make_pair (string_ref, mangled_ccstr)).first;
+
+                // Extract the const version of the demangled_cstr
+                demangled_ccstr = entry.getKeyData();
+            }
+
+            {
+                // Now assign the demangled const string as the counterpart of the
+                // mangled const string...
+                uint8_t h = hash (llvm::StringRef(mangled_ccstr));
+                llvm::sys::SmartScopedWriter<false> wlock(m_string_pools[h].m_mutex);
+                GetStringMapEntryFromKeyData (mangled_ccstr).setValue(demangled_ccstr);
+            }
 
-            // Extract the const version of the demangled_cstr
-            const char *demangled_ccstr = entry.getKeyData();
-            // Now assign the demangled const string as the counterpart of the
-            // mangled const string...
-            GetStringMapEntryFromKeyData (mangled_ccstr).setValue(demangled_ccstr);
             // Return the constant demangled C string
             return demangled_ccstr;
         }
@@ -153,7 +178,7 @@
 
 protected:
     uint8_t
-    hash(const llvm::StringRef &s)
+    hash(const llvm::StringRef &s) const
     {
         uint32_t h = llvm::HashString(s);
         return ((h >> 24) ^ (h >> 16) ^ (h >> 8) ^ h) & 0xff;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D13941.38006.patch
Type: text/x-patch
Size: 4045 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151021/aab0c05f/attachment-0001.bin>


More information about the lldb-commits mailing list