diff options
| author | Owen Anderson <resistor@mac.com> | 2009-08-20 19:03:20 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2009-08-20 19:03:20 +0000 |
| commit | c1a3a471c40ed0edd367f9b1813726b461f7e078 (patch) | |
| tree | c3c394c33e35dc52449f1cb019986dce5744631e /llvm/lib | |
| parent | a298c0ee3c2ae7655ed4060f41ffe28c1264324e (diff) | |
| download | bcm5719-llvm-c1a3a471c40ed0edd367f9b1813726b461f7e078.tar.gz bcm5719-llvm-c1a3a471c40ed0edd367f9b1813726b461f7e078.zip | |
Reduce contention on the Attributes lock by using atomic operations for reference counting rather than locking.
llvm-svn: 79560
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/VMCore/Attributes.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/llvm/lib/VMCore/Attributes.cpp b/llvm/lib/VMCore/Attributes.cpp index 73c92ec6c09..fb1a9b8cd5f 100644 --- a/llvm/lib/VMCore/Attributes.cpp +++ b/llvm/lib/VMCore/Attributes.cpp @@ -15,6 +15,7 @@ #include "llvm/Type.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/System/Atomic.h" #include "llvm/System/Mutex.h" #include "llvm/Support/Streams.h" #include "llvm/Support/ManagedStatic.h" @@ -97,7 +98,7 @@ Attributes Attribute::typeIncompatible(const Type *Ty) { namespace llvm { class AttributeListImpl : public FoldingSetNode { - unsigned RefCount; + sys::cas_flag RefCount; // AttributesList is uniqued, these should not be publicly available. void operator=(const AttributeListImpl &); // Do not implement @@ -111,8 +112,11 @@ public: RefCount = 0; } - void AddRef() { ++RefCount; } - void DropRef() { if (--RefCount == 0) delete this; } + void AddRef() { sys::AtomicIncrement(&RefCount); } + void DropRef() { + sys::cas_flag old = sys::AtomicDecrement(&RefCount); + if (old == 0) delete this; + } void Profile(FoldingSetNodeID &ID) const { Profile(ID, Attrs.data(), Attrs.size()); @@ -175,17 +179,14 @@ AttrListPtr AttrListPtr::get(const AttributeWithIndex *Attrs, unsigned NumAttrs) //===----------------------------------------------------------------------===// AttrListPtr::AttrListPtr(AttributeListImpl *LI) : AttrList(LI) { - sys::SmartScopedLock<true> Lock(*ALMutex); if (LI) LI->AddRef(); } AttrListPtr::AttrListPtr(const AttrListPtr &P) : AttrList(P.AttrList) { - sys::SmartScopedLock<true> Lock(*ALMutex); if (AttrList) AttrList->AddRef(); } const AttrListPtr &AttrListPtr::operator=(const AttrListPtr &RHS) { - sys::SmartScopedLock<true> Lock(*ALMutex); if (AttrList == RHS.AttrList) return *this; if (AttrList) AttrList->DropRef(); AttrList = RHS.AttrList; @@ -194,7 +195,6 @@ const AttrListPtr &AttrListPtr::operator=(const AttrListPtr &RHS) { } AttrListPtr::~AttrListPtr() { - sys::SmartScopedLock<true> Lock(*ALMutex); if (AttrList) AttrList->DropRef(); } |

