| //===- PerThreadBumpPtrAllocatorTest.cpp ----------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Support/PerThreadBumpPtrAllocator.h" |
| #include "llvm/Support/Parallel.h" |
| #include "gtest/gtest.h" |
| #include <cstdlib> |
| |
| using namespace llvm; |
| using namespace parallel; |
| |
| namespace { |
| |
| TEST(PerThreadBumpPtrAllocatorTest, Simple) { |
| PerThreadBumpPtrAllocator Allocator; |
| |
| parallel::TaskGroup tg; |
| |
| tg.spawn([&]() { |
| uint64_t *Var = |
| (uint64_t *)Allocator.Allocate(sizeof(uint64_t), alignof(uint64_t)); |
| *Var = 0xFE; |
| EXPECT_EQ(0xFEul, *Var); |
| EXPECT_EQ(sizeof(uint64_t), Allocator.getBytesAllocated()); |
| EXPECT_TRUE(Allocator.getBytesAllocated() <= Allocator.getTotalMemory()); |
| |
| PerThreadBumpPtrAllocator Allocator2(std::move(Allocator)); |
| |
| EXPECT_EQ(sizeof(uint64_t), Allocator2.getBytesAllocated()); |
| EXPECT_TRUE(Allocator2.getBytesAllocated() <= Allocator2.getTotalMemory()); |
| |
| EXPECT_EQ(0xFEul, *Var); |
| }); |
| } |
| |
| TEST(PerThreadBumpPtrAllocatorTest, ParallelAllocation) { |
| PerThreadBumpPtrAllocator Allocator; |
| |
| static size_t constexpr NumAllocations = 1000; |
| |
| parallelFor(0, NumAllocations, [&](size_t Idx) { |
| uint64_t *ptr = |
| (uint64_t *)Allocator.Allocate(sizeof(uint64_t), alignof(uint64_t)); |
| *ptr = Idx; |
| }); |
| |
| EXPECT_EQ(sizeof(uint64_t) * NumAllocations, Allocator.getBytesAllocated()); |
| EXPECT_EQ(Allocator.getNumberOfAllocators(), parallel::getThreadCount()); |
| } |
| |
| } // anonymous namespace |