diff options
author | Owen Anderson <resistor@mac.com> | 2009-06-17 00:12:30 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-06-17 00:12:30 +0000 |
commit | 142fb2acdd4b94a73e2c992b9ed57ee1449ab818 (patch) | |
tree | 38e84d4c78615b2c148527528026ba01436f1769 | |
parent | 6be926647d42e149fb7ef20554899d2fe9a2e80f (diff) |
Add locking around the accessors for AbstractTypeUsers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73586 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/VMCore/Type.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp index 8509aa283c..34ba5be8be 100644 --- a/lib/VMCore/Type.cpp +++ b/lib/VMCore/Type.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Threading.h" +#include "llvm/System/Mutex.h" #include "llvm/System/RWMutex.h" #include <algorithm> #include <cstdarg> @@ -45,6 +46,9 @@ AbstractTypeUser::~AbstractTypeUser() {} // Reader/writer lock used for guarding access to the type maps. static ManagedStatic<sys::RWMutex> TypeMapLock; +// Lock used for guarding access to AbstractTypeUsers. +static ManagedStatic<sys::Mutex> AbstractTypeUsersLock; + // Concrete/Abstract TypeDescriptions - We lazily calculate type descriptions // for types as they are needed. Because resolution of types must invalidate // all of the abstract type descriptions, we keep them in a seperate map to make @@ -1440,12 +1444,28 @@ bool PointerType::isValidElementType(const Type *ElemTy) { // Derived Type Refinement Functions //===----------------------------------------------------------------------===// +// addAbstractTypeUser - Notify an abstract type that there is a new user of +// it. This function is called primarily by the PATypeHandle class. +void Type::addAbstractTypeUser(AbstractTypeUser *U) const { + assert(isAbstract() && "addAbstractTypeUser: Current type not abstract!"); + if (llvm_is_multithreaded()) { + AbstractTypeUsersLock->acquire(); + AbstractTypeUsers.push_back(U); + AbstractTypeUsersLock->release(); + } else { + AbstractTypeUsers.push_back(U); + } +} + + // removeAbstractTypeUser - Notify an abstract type that a user of the class // no longer has a handle to the type. This function is called primarily by // the PATypeHandle class. When there are no users of the abstract type, it // is annihilated, because there is no way to get a reference to it ever again. // void Type::removeAbstractTypeUser(AbstractTypeUser *U) const { + if (llvm_is_multithreaded()) AbstractTypeUsersLock->acquire(); + // Search from back to front because we will notify users from back to // front. Also, it is likely that there will be a stack like behavior to // users that register and unregister users. @@ -1469,8 +1489,11 @@ void Type::removeAbstractTypeUser(AbstractTypeUser *U) const { DOUT << "DELETEing unused abstract type: <" << *this << ">[" << (void*)this << "]" << "\n"; #endif - this->destroy(); + + this->destroy(); } + + if (llvm_is_multithreaded()) AbstractTypeUsersLock->release(); } // unlockedRefineAbstractTypeTo - This function is used when it is discovered |