From 82b58a843b9e7d61f8fcb91ddac41929a7f65b65 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. llvm-svn: 73588 --- llvm/include/llvm/System/Atomic.h | 4 ++-- llvm/include/llvm/Type.h | 8 +++++--- llvm/lib/System/Atomic.cpp | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/System/Atomic.h b/llvm/include/llvm/System/Atomic.h index f90a8f62e1c7..adbb975298e8 100644 --- a/llvm/include/llvm/System/Atomic.h +++ b/llvm/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/llvm/include/llvm/Type.h b/llvm/include/llvm/Type.h index 256944f60049..d439233d8c05 100644 --- a/llvm/include/llvm/Type.h +++ b/llvm/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/llvm/lib/System/Atomic.cpp b/llvm/lib/System/Atomic.cpp index 9d8ac925b890..5676ca9d62c5 100644 --- a/llvm/lib/System/Atomic.cpp +++ b/llvm/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;