Line data Source code
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