GCC Code Coverage Report


Directory: libs/url/
File: libs/url/src/grammar/detail/recycled.cpp
Date: 2024-04-08 19:38:36
Exec Total Coverage
Lines: 10 10 100.0%
Functions: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 //
2 // Copyright (c) 2022 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/boostorg/url
8 //
9
10 #include <boost/url/detail/config.hpp>
11 #include <boost/url/grammar/detail/recycled.hpp>
12 #include <cstdlib>
13 #include <utility>
14 #include <atomic>
15
16 #ifdef BOOST_URL_REPORT
17 # ifdef _MSC_VER
18 # include <intrin.h>
19 # endif
20 #endif
21
22 namespace boost {
23 namespace urls {
24 namespace grammar {
25 namespace detail {
26
27 struct all_reports
28 {
29 // current count
30 std::atomic<std::size_t> count = {0};
31
32 // current bytes
33 std::atomic<std::size_t> bytes = {0};
34
35 // highest total ptr count
36 std::atomic<std::size_t> count_max = {0};
37
38 // highest total bytes
39 std::atomic<std::size_t> bytes_max = {0};
40
41 // largest single allocation
42 std::atomic<std::size_t> alloc_max = {0};
43
44 72 ~all_reports()
45 72 {
46 // breakpoint here to view report
47 #ifdef BOOST_URL_REPORT
48 # ifdef _MSC_VER
49 if(count_max > 0)
50 ::__debugbreak();
51 # endif
52 #endif
53 72 }
54 };
55
56 static all_reports all_reports_;
57
58 void
59 1 recycled_add_impl(
60 std::size_t n) noexcept
61 {
62 1 auto& a = all_reports_;
63
64 // LCOV_EXCL_START
65 /*
66 * We can't guarantee coverage
67 * exercise of this path.
68 */
69 std::size_t new_count = ++a.count;
70 std::size_t old_count_max = a.count_max;
71 while (
72 old_count_max < new_count &&
73 !a.count_max.compare_exchange_weak(
74 old_count_max, new_count))
75 {}
76
77 std::size_t new_bytes = a.bytes.fetch_add(n) + n;
78 std::size_t old_bytes_max = a.bytes_max;
79 while (
80 old_bytes_max < new_bytes &&
81 !a.bytes_max.compare_exchange_weak(
82 old_bytes_max, new_bytes))
83 {}
84
85 std::size_t old_alloc_max = a.alloc_max;
86 while (
87 old_alloc_max < n &&
88 !a.alloc_max.compare_exchange_weak(
89 old_alloc_max, n))
90 {}
91 // LCOV_EXCL_STOP
92 1 }
93
94 void
95 1 recycled_remove_impl(
96 std::size_t n) noexcept
97 {
98 1 all_reports_.count--;
99 1 all_reports_.bytes-=n;
100 1 }
101
102 } // detail
103 } // grammar
104 } // urls
105 } // boost
106