[llvm] r206372 - [Allocator] Make BumpPtrAllocator movable and move assignable.

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed Apr 16 15:55:52 PDT 2014


On 2014-Apr-16, at 3:48, Chandler Carruth <chandlerc at gmail.com> wrote:

> Author: chandlerc
> Date: Wed Apr 16 05:48:27 2014
> New Revision: 206372
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=206372&view=rev
> Log:
> [Allocator] Make BumpPtrAllocator movable and move assignable.
> 
> Modified:
>    llvm/trunk/include/llvm/Support/Allocator.h
>    llvm/trunk/unittests/Support/AllocatorTest.cpp
> 
> Modified: llvm/trunk/include/llvm/Support/Allocator.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Allocator.h?rev=206372&r1=206371&r2=206372&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Allocator.h (original)
> +++ llvm/trunk/include/llvm/Support/Allocator.h Wed Apr 16 05:48:27 2014
> @@ -138,9 +138,6 @@ template <typename AllocatorT = MallocAl
> class BumpPtrAllocatorImpl
>     : public AllocatorBase<
>           BumpPtrAllocatorImpl<AllocatorT, SlabSize, SizeThreshold>> {
> -  BumpPtrAllocatorImpl(const BumpPtrAllocatorImpl &) LLVM_DELETED_FUNCTION;
> -  void operator=(const BumpPtrAllocatorImpl &) LLVM_DELETED_FUNCTION;
> -

Why delete these?

> public:
>   static_assert(SizeThreshold <= SlabSize,
>                 "The SizeThreshold must be at most the SlabSize to ensure "
> @@ -153,11 +150,43 @@ public:
>   BumpPtrAllocatorImpl(T &&Allocator)
>       : CurPtr(nullptr), End(nullptr), BytesAllocated(0),
>         Allocator(std::forward<T &&>(Allocator)) {}
> +
> +  // Manually implement a move constructor as we must clear the old allocators
> +  // slabs as a matter of correctness.
> +  BumpPtrAllocatorImpl(BumpPtrAllocatorImpl &&Old)
> +      : CurPtr(Old.CurPtr), End(Old.End), Slabs(std::move(Old.Slabs)),
> +        CustomSizedSlabs(std::move(Old.CustomSizedSlabs)),
> +        BytesAllocated(Old.BytesAllocated),
> +        Allocator(std::move(Old.Allocator)) {
> +    Old.CurPtr = Old.End = nullptr;
> +    Old.BytesAllocated = 0;
> +    Old.Slabs.clear();
> +    Old.CustomSizedSlabs.clear();
> +  }
> +
>   ~BumpPtrAllocatorImpl() {
>     DeallocateSlabs(Slabs.begin(), Slabs.end());
>     DeallocateCustomSizedSlabs();
>   }
> 
> +  BumpPtrAllocatorImpl &operator=(BumpPtrAllocatorImpl &&RHS) {
> +    DeallocateSlabs(Slabs.begin(), Slabs.end());
> +    DeallocateCustomSizedSlabs();
> +
> +    CurPtr = RHS.CurPtr;
> +    End = RHS.End;
> +    BytesAllocated = RHS.BytesAllocated;
> +    Slabs = std::move(RHS.Slabs);
> +    CustomSizedSlabs = std::move(RHS.CustomSizedSlabs);
> +    Allocator = std::move(RHS.Allocator);
> +
> +    RHS.CurPtr = RHS.End = nullptr;
> +    RHS.BytesAllocated = 0;
> +    RHS.Slabs.clear();
> +    RHS.CustomSizedSlabs.clear();
> +    return *this;
> +  }
> +
>   /// \brief Deallocate all but the current slab and reset the current pointer
>   /// to the beginning of it, freeing all memory allocated so far.
>   void Reset() {
> 
> Modified: llvm/trunk/unittests/Support/AllocatorTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/AllocatorTest.cpp?rev=206372&r1=206371&r2=206372&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/AllocatorTest.cpp (original)
> +++ llvm/trunk/unittests/Support/AllocatorTest.cpp Wed Apr 16 05:48:27 2014
> @@ -29,6 +29,21 @@ TEST(AllocatorTest, Basics) {
>   EXPECT_EQ(2, b[9]);
>   EXPECT_EQ(3, *c);
>   EXPECT_EQ(1U, Alloc.GetNumSlabs());
> +
> +  BumpPtrAllocator Alloc2 = std::move(Alloc);
> +  EXPECT_EQ(0U, Alloc.GetNumSlabs());
> +  EXPECT_EQ(1U, Alloc2.GetNumSlabs());
> +
> +  // Make sure the old pointers still work. These are especially interesting
> +  // under ASan or Valgrind.
> +  EXPECT_EQ(1, *a);
> +  EXPECT_EQ(2, b[0]);
> +  EXPECT_EQ(2, b[9]);
> +  EXPECT_EQ(3, *c);
> +
> +  Alloc = std::move(Alloc2);
> +  EXPECT_EQ(0U, Alloc2.GetNumSlabs());
> +  EXPECT_EQ(1U, Alloc.GetNumSlabs());
> }
> 
> // Allocate enough bytes to create three slabs.
> 
> 
> _______________________________________________
> 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