src/ex/recycling_memory_resource.cpp

92.3% Lines (24/26) 100.0% Functions (8/8) 71.4% Branches (10/14)
src/ex/recycling_memory_resource.cpp
Line Branch Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/capy
8 //
9
10 #include <boost/capy/ex/recycling_memory_resource.hpp>
11
12 namespace boost {
13 namespace capy {
14
15 46 recycling_memory_resource::~recycling_memory_resource() = default;
16
17 recycling_memory_resource::pool&
18 111 recycling_memory_resource::global() noexcept
19 {
20
3/4
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 78 times.
✓ Branch 3 taken 33 times.
✗ Branch 4 not taken.
111 static pool p;
21 111 return p;
22 }
23
24 std::mutex&
25 111 recycling_memory_resource::global_mutex() noexcept
26 {
27 static std::mutex mtx;
28 111 return mtx;
29 }
30
31 void*
32 107 recycling_memory_resource::allocate_slow(
33 std::size_t rounded, std::size_t idx)
34 {
35 {
36
1/1
✓ Branch 2 taken 107 times.
107 std::lock_guard<std::mutex> lock(global_mutex());
37
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 107 times.
107 if(auto* p = global().buckets[idx].pop(local().buckets[idx]))
38 return p;
39 107 }
40 107 return ::operator new(rounded);
41 }
42
43 void
44 4 recycling_memory_resource::deallocate_slow(
45 void* p, std::size_t idx)
46 {
47 {
48
1/1
✓ Branch 2 taken 4 times.
4 std::lock_guard<std::mutex> lock(global_mutex());
49
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 if(global().buckets[idx].push(p))
50 4 return;
51 4 }
52 ::operator delete(p);
53 }
54
55 void*
56 2902 recycling_memory_resource::do_allocate(std::size_t bytes, std::size_t alignment)
57 {
58 2902 return allocate_fast(bytes, alignment);
59 }
60
61 void
62 2902 recycling_memory_resource::do_deallocate(void* p, std::size_t bytes, std::size_t alignment)
63 {
64 2902 deallocate_fast(p, bytes, alignment);
65 2902 }
66
67 std::pmr::memory_resource*
68 3068 get_recycling_memory_resource() noexcept
69 {
70
3/4
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 3022 times.
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
3068 static recycling_memory_resource instance;
71 3068 return &instance;
72 }
73
74 } // namespace capy
75 } // namespace boost
76