mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Expose ValueMap's mutex type as a typedef instead of a sys::Mutex.
This enables static polymorphism of the mutex type, which is necessary in order to replace the standard mutex implementation with a different type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211080 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
408691f967
commit
84fea7720c
@ -45,8 +45,10 @@ class ValueMapConstIterator;
|
||||
/// This class defines the default behavior for configurable aspects of
|
||||
/// ValueMap<>. User Configs should inherit from this class to be as compatible
|
||||
/// as possible with future versions of ValueMap.
|
||||
template<typename KeyT>
|
||||
template<typename KeyT, typename MutexT = sys::Mutex>
|
||||
struct ValueMapConfig {
|
||||
typedef MutexT mutex_type;
|
||||
|
||||
/// If FollowRAUW is true, the ValueMap will update mappings on RAUW. If it's
|
||||
/// false, the ValueMap will leave the original mapping in place.
|
||||
enum { FollowRAUW = true };
|
||||
@ -67,7 +69,7 @@ struct ValueMapConfig {
|
||||
/// and onDelete) and not inside other ValueMap methods. NULL means that no
|
||||
/// mutex is necessary.
|
||||
template<typename ExtraDataT>
|
||||
static sys::Mutex *getMutex(const ExtraDataT &/*Data*/) { return nullptr; }
|
||||
static mutex_type *getMutex(const ExtraDataT &/*Data*/) { return nullptr; }
|
||||
};
|
||||
|
||||
/// See the file comment.
|
||||
@ -212,7 +214,7 @@ public:
|
||||
void deleted() override {
|
||||
// Make a copy that won't get changed even when *this is destroyed.
|
||||
ValueMapCallbackVH Copy(*this);
|
||||
sys::Mutex *M = Config::getMutex(Copy.Map->Data);
|
||||
typename Config::mutex_type *M = Config::getMutex(Copy.Map->Data);
|
||||
if (M)
|
||||
M->acquire();
|
||||
Config::onDelete(Copy.Map->Data, Copy.Unwrap()); // May destroy *this.
|
||||
@ -225,7 +227,7 @@ public:
|
||||
"Invalid RAUW on key of ValueMap<>");
|
||||
// Make a copy that won't get changed even when *this is destroyed.
|
||||
ValueMapCallbackVH Copy(*this);
|
||||
sys::Mutex *M = Config::getMutex(Copy.Map->Data);
|
||||
typename Config::mutex_type *M = Config::getMutex(Copy.Map->Data);
|
||||
if (M)
|
||||
M->acquire();
|
||||
|
||||
|
@ -177,10 +177,10 @@ TYPED_TEST(ValueMapTest, ConfiguredCollisionBehavior) {
|
||||
// TODO: Implement this when someone needs it.
|
||||
}
|
||||
|
||||
template<typename KeyT>
|
||||
struct LockMutex : ValueMapConfig<KeyT> {
|
||||
template<typename KeyT, typename MutexT>
|
||||
struct LockMutex : ValueMapConfig<KeyT, MutexT> {
|
||||
struct ExtraData {
|
||||
sys::Mutex *M;
|
||||
mutex_type *M;
|
||||
bool *CalledRAUW;
|
||||
bool *CalledDeleted;
|
||||
};
|
||||
@ -192,15 +192,15 @@ struct LockMutex : ValueMapConfig<KeyT> {
|
||||
*Data.CalledDeleted = true;
|
||||
EXPECT_FALSE(Data.M->tryacquire()) << "Mutex should already be locked.";
|
||||
}
|
||||
static sys::Mutex *getMutex(const ExtraData &Data) { return Data.M; }
|
||||
static mutex_type *getMutex(const ExtraData &Data) { return Data.M; }
|
||||
};
|
||||
#if LLVM_ENABLE_THREADS
|
||||
TYPED_TEST(ValueMapTest, LocksMutex) {
|
||||
sys::Mutex M(false); // Not recursive.
|
||||
bool CalledRAUW = false, CalledDeleted = false;
|
||||
typename LockMutex<TypeParam*>::ExtraData Data =
|
||||
{&M, &CalledRAUW, &CalledDeleted};
|
||||
ValueMap<TypeParam*, int, LockMutex<TypeParam*> > VM(Data);
|
||||
typedef LockMutex<TypeParam*, sys::Mutex> ConfigType;
|
||||
typename ConfigType::ExtraData Data = {&M, &CalledRAUW, &CalledDeleted};
|
||||
ValueMap<TypeParam*, int, ConfigType> VM(Data);
|
||||
VM[this->BitcastV.get()] = 7;
|
||||
this->BitcastV->replaceAllUsesWith(this->AddV.get());
|
||||
this->AddV.reset();
|
||||
|
Loading…
Reference in New Issue
Block a user