[llvm] r211080 - Expose ValueMap's mutex type as a typedef instead of a sys::Mutex.

David Blaikie dblaikie at gmail.com
Tue Jun 17 10:47:43 PDT 2014


On Tue, Jun 17, 2014 at 9:14 AM, Zachary Turner <zturner at google.com> wrote:
> This is so I can change smaller amounts of code incrementally, but with
> sys::Mutex, whether or not the mutex is recursive is a runtime parameter to
> the constructor, and with the std mutexes, recursive and non-recursive
> mutexes are entirely different types.  It turns out that ValueMap is being
> used with both recursive and non-recursive mutexes, so the only way to
> support this is to templatize the mutex type.

OK - I'll keep an eye out for the follow up patches to get an idea of
how/why/where different users specify different kinds of mutexes.
Thanks for the details

- David

>
>
> On Mon, Jun 16, 2014 at 10:38 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> I'm assuming this is so you can change smaller amounts of code/work
>> incrementally, and at the end everything will be std::murex and this new
>> template parameter can be removed?
>>
>> On Jun 16, 2014 5:27 PM, "Zachary Turner" <zturner at google.com> wrote:
>>>
>>> Author: zturner
>>> Date: Mon Jun 16 19:17:38 2014
>>> New Revision: 211080
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=211080&view=rev
>>> Log:
>>> 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.
>>>
>>> Modified:
>>>     llvm/trunk/include/llvm/IR/ValueMap.h
>>>     llvm/trunk/unittests/IR/ValueMapTest.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/IR/ValueMap.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/ValueMap.h?rev=211080&r1=211079&r2=211080&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/IR/ValueMap.h (original)
>>> +++ llvm/trunk/include/llvm/IR/ValueMap.h Mon Jun 16 19:17:38 2014
>>> @@ -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();
>>>
>>>
>>> Modified: llvm/trunk/unittests/IR/ValueMapTest.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/ValueMapTest.cpp?rev=211080&r1=211079&r2=211080&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/unittests/IR/ValueMapTest.cpp (original)
>>> +++ llvm/trunk/unittests/IR/ValueMapTest.cpp Mon Jun 16 19:17:38 2014
>>> @@ -177,10 +177,10 @@ TYPED_TEST(ValueMapTest, ConfiguredColli
>>>    // 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();
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



More information about the llvm-commits mailing list