Fix PR8441, a race condition in the static attributes list. While the reference...
authorOwen Anderson <resistor@mac.com>
Tue, 9 Nov 2010 00:27:03 +0000 (00:27 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 9 Nov 2010 00:27:03 +0000 (00:27 +0000)
the implicit removal of each object from the global list was not.  Make this operation atomic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118461 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Attributes.cpp

index 6f5ecd278d880102fab47387b07ce737574a6ba5..d854628603bee0b6ed48059b8ef43c0a0aa2b5a9 100644 (file)
@@ -106,7 +106,10 @@ Attributes Attribute::typeIncompatible(const Type *Ty) {
 // AttributeListImpl Definition
 //===----------------------------------------------------------------------===//
 
+
 namespace llvm {
+static ManagedStatic<sys::SmartMutex<true> > ALMutex;
+
 class AttributeListImpl : public FoldingSetNode {
   sys::cas_flag RefCount;
   
@@ -122,10 +125,15 @@ public:
     RefCount = 0;
   }
   
-  void AddRef() { sys::AtomicIncrement(&RefCount); }
+  void AddRef() {
+    sys::SmartScopedLock<true> Lock(*ALMutex);
+    ++RefCount;
+  }
   void DropRef() {
-    sys::cas_flag old = sys::AtomicDecrement(&RefCount);
-    if (old == 0) delete this;
+    sys::SmartScopedLock<true> Lock(*ALMutex);
+    sys::cas_flag old = RefCount++;
+    if (old == 0)
+      delete this;
   }
   
   void Profile(FoldingSetNodeID &ID) const {
@@ -139,11 +147,10 @@ public:
 };
 }
 
-static ManagedStatic<sys::SmartMutex<true> > ALMutex;
 static ManagedStatic<FoldingSet<AttributeListImpl> > AttributesLists;
 
 AttributeListImpl::~AttributeListImpl() {
-  sys::SmartScopedLock<true> Lock(*ALMutex);
+  // NOTE: Lock must be acquired by caller.
   AttributesLists->RemoveNode(this);
 }