From 3afb024907729b09bd91ff2358c0b085f472e6ac Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 9 Nov 2010 00:27:03 +0000 Subject: [PATCH] Fix PR8441, a race condition in the static attributes list. While the reference counting was itself threadsafe, 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 | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index 6f5ecd278d8..d854628603b 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -106,7 +106,10 @@ Attributes Attribute::typeIncompatible(const Type *Ty) { // AttributeListImpl Definition //===----------------------------------------------------------------------===// + namespace llvm { +static ManagedStatic > 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 Lock(*ALMutex); + ++RefCount; + } void DropRef() { - sys::cas_flag old = sys::AtomicDecrement(&RefCount); - if (old == 0) delete this; + sys::SmartScopedLock Lock(*ALMutex); + sys::cas_flag old = RefCount++; + if (old == 0) + delete this; } void Profile(FoldingSetNodeID &ID) const { @@ -139,11 +147,10 @@ public: }; } -static ManagedStatic > ALMutex; static ManagedStatic > AttributesLists; AttributeListImpl::~AttributeListImpl() { - sys::SmartScopedLock Lock(*ALMutex); + // NOTE: Lock must be acquired by caller. AttributesLists->RemoveNode(this); }