LCOV - code coverage report
Current view: top level - libs/url/src/grammar/detail/recycled.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 9 9
Test Date: 2024-07-10 02:48:26 Functions: 100.0 % 3 3

            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              :     {
      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
        

Generated by: LCOV version 2.1