xref: /openbsd-src/gnu/llvm/compiler-rt/lib/xray/tests/unit/allocator_test.cpp (revision 3cab2bb3f667058bece8e38b12449a63a9d73c4b)
1*3cab2bb3Spatrick //===-- allocator_test.cpp ------------------------------------------------===//
2*3cab2bb3Spatrick //
3*3cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*3cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3cab2bb3Spatrick //
7*3cab2bb3Spatrick //===----------------------------------------------------------------------===//
8*3cab2bb3Spatrick //
9*3cab2bb3Spatrick // This file is a part of XRay, a function call tracing system.
10*3cab2bb3Spatrick //
11*3cab2bb3Spatrick //===----------------------------------------------------------------------===//
12*3cab2bb3Spatrick 
13*3cab2bb3Spatrick #include "xray_allocator.h"
14*3cab2bb3Spatrick #include "xray_buffer_queue.h"
15*3cab2bb3Spatrick #include "gtest/gtest.h"
16*3cab2bb3Spatrick 
17*3cab2bb3Spatrick namespace __xray {
18*3cab2bb3Spatrick namespace {
19*3cab2bb3Spatrick 
20*3cab2bb3Spatrick struct TestData {
21*3cab2bb3Spatrick   s64 First;
22*3cab2bb3Spatrick   s64 Second;
23*3cab2bb3Spatrick };
24*3cab2bb3Spatrick 
TEST(AllocatorTest,Construction)25*3cab2bb3Spatrick TEST(AllocatorTest, Construction) { Allocator<sizeof(TestData)> A(2 << 11); }
26*3cab2bb3Spatrick 
TEST(AllocatorTest,Allocate)27*3cab2bb3Spatrick TEST(AllocatorTest, Allocate) {
28*3cab2bb3Spatrick   Allocator<sizeof(TestData)> A(2 << 11);
29*3cab2bb3Spatrick   auto B = A.Allocate();
30*3cab2bb3Spatrick   ASSERT_NE(B.Data, nullptr);
31*3cab2bb3Spatrick }
32*3cab2bb3Spatrick 
TEST(AllocatorTest,OverAllocate)33*3cab2bb3Spatrick TEST(AllocatorTest, OverAllocate) {
34*3cab2bb3Spatrick   Allocator<sizeof(TestData)> A(sizeof(TestData));
35*3cab2bb3Spatrick   auto B1 = A.Allocate();
36*3cab2bb3Spatrick   ASSERT_NE(B1.Data, nullptr);
37*3cab2bb3Spatrick   auto B2 = A.Allocate();
38*3cab2bb3Spatrick   ASSERT_EQ(B2.Data, nullptr);
39*3cab2bb3Spatrick }
40*3cab2bb3Spatrick 
41*3cab2bb3Spatrick struct OddSizedData {
42*3cab2bb3Spatrick   s64 A;
43*3cab2bb3Spatrick   s32 B;
44*3cab2bb3Spatrick };
45*3cab2bb3Spatrick 
TEST(AllocatorTest,AllocateBoundaries)46*3cab2bb3Spatrick TEST(AllocatorTest, AllocateBoundaries) {
47*3cab2bb3Spatrick   Allocator<sizeof(OddSizedData)> A(GetPageSizeCached());
48*3cab2bb3Spatrick 
49*3cab2bb3Spatrick   // Keep allocating until we hit a nullptr block.
50*3cab2bb3Spatrick   unsigned C = 0;
51*3cab2bb3Spatrick   auto Expected =
52*3cab2bb3Spatrick       GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize);
53*3cab2bb3Spatrick   for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C)
54*3cab2bb3Spatrick     ;
55*3cab2bb3Spatrick 
56*3cab2bb3Spatrick   ASSERT_EQ(C, Expected);
57*3cab2bb3Spatrick }
58*3cab2bb3Spatrick 
TEST(AllocatorTest,AllocateFromNonOwned)59*3cab2bb3Spatrick TEST(AllocatorTest, AllocateFromNonOwned) {
60*3cab2bb3Spatrick   bool Success = false;
61*3cab2bb3Spatrick   BufferQueue BQ(GetPageSizeCached(), 10, Success);
62*3cab2bb3Spatrick   ASSERT_TRUE(Success);
63*3cab2bb3Spatrick   BufferQueue::Buffer B;
64*3cab2bb3Spatrick   ASSERT_EQ(BQ.getBuffer(B), BufferQueue::ErrorCode::Ok);
65*3cab2bb3Spatrick   {
66*3cab2bb3Spatrick     Allocator<sizeof(OddSizedData)> A(B.Data, B.Size);
67*3cab2bb3Spatrick 
68*3cab2bb3Spatrick     // Keep allocating until we hit a nullptr block.
69*3cab2bb3Spatrick     unsigned C = 0;
70*3cab2bb3Spatrick     auto Expected =
71*3cab2bb3Spatrick         GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize);
72*3cab2bb3Spatrick     for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C)
73*3cab2bb3Spatrick       ;
74*3cab2bb3Spatrick 
75*3cab2bb3Spatrick     ASSERT_EQ(C, Expected);
76*3cab2bb3Spatrick   }
77*3cab2bb3Spatrick   ASSERT_EQ(BQ.releaseBuffer(B), BufferQueue::ErrorCode::Ok);
78*3cab2bb3Spatrick }
79*3cab2bb3Spatrick 
80*3cab2bb3Spatrick } // namespace
81*3cab2bb3Spatrick } // namespace __xray
82