//===- 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 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