From efdbfc4ceff91a44a835244db9516eb4d1953f8a Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 17 Jun 2009 00:28:49 +0000 Subject: [PATCH] Use atomic increment/decrement for reference counting of Type's. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73588 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/System/Atomic.h | 4 ++-- include/llvm/Type.h | 8 +++++--- lib/System/Atomic.cpp | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h index f90a8f62e1c..adbb975298e 100644 --- a/include/llvm/System/Atomic.h +++ b/include/llvm/System/Atomic.h @@ -24,8 +24,8 @@ namespace llvm { cas_flag CompareAndSwap(volatile cas_flag* ptr, cas_flag new_value, cas_flag old_value); - cas_flag AtomicPostIncrement(volatile cas_flag* ptr); - cas_flag AtomicPostDecrement(volatile cas_flag* ptr); + cas_flag AtomicIncrement(volatile cas_flag* ptr); + cas_flag AtomicDecrement(volatile cas_flag* ptr); } } diff --git a/include/llvm/Type.h b/include/llvm/Type.h index 256944f6004..d439233d8c0 100644 --- a/include/llvm/Type.h +++ b/include/llvm/Type.h @@ -14,6 +14,7 @@ #include "llvm/AbstractTypeUser.h" #include "llvm/Support/Casting.h" #include "llvm/Support/DataTypes.h" +#include "llvm/System/Atomic.h" #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/iterator.h" #include @@ -102,7 +103,7 @@ private: /// has no AbstractTypeUsers, the type is deleted. This is only sensical for /// derived types. /// - mutable unsigned RefCount; + mutable sys::cas_flag RefCount; const Type *getForwardedTypeInternal() const; @@ -337,7 +338,7 @@ public: void addRef() const { assert(isAbstract() && "Cannot add a reference to a non-abstract type!"); - ++RefCount; + sys::AtomicIncrement(&RefCount); } void dropRef() const { @@ -346,7 +347,8 @@ public: // If this is the last PATypeHolder using this object, and there are no // PATypeHandles using it, the type is dead, delete it now. - if (--RefCount == 0 && AbstractTypeUsers.empty()) + sys::cas_flag OldCount = sys::AtomicDecrement(&RefCount); + if (OldCount == 0 && AbstractTypeUsers.empty()) this->destroy(); } diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp index 9d8ac925b89..5676ca9d62c 100644 --- a/lib/System/Atomic.cpp +++ b/lib/System/Atomic.cpp @@ -52,7 +52,7 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr, #endif } -sys::cas_flag sys::AtomicPostIncrement(volatile sys::cas_flag* ptr) { +sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) { #if LLVM_MULTITHREADED==0 ++(*ptr); return *ptr; @@ -65,7 +65,7 @@ sys::cas_flag sys::AtomicPostIncrement(volatile sys::cas_flag* ptr) { #endif } -sys::cas_flag sys::AtomicPostDecrement(volatile sys::cas_flag* ptr) { +sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) { #if LLVM_MULTITHREADED==0 --(*ptr); return *ptr; -- 2.11.0