HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: C:/Users/fred/anaconda3/Library/include/boost/url/grammar/detail/impl/recycled.ipp
//
// Copyright (c) 2022 Vinnie Falco ([email protected])
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/url
//

#ifndef BOOST_URL_GRAMMAR_DETAIL_IMPL_RECYCLED_IPP
#define BOOST_URL_GRAMMAR_DETAIL_IMPL_RECYCLED_IPP

#include <cstdlib>
#include <utility>
#include <atomic>

#ifdef BOOST_URL_REPORT
# ifdef _MSC_VER
#  include <intrin.h>
# endif
#endif

namespace boost {
namespace urls {
namespace grammar {
namespace detail {

struct all_reports
{
    // current count
    std::atomic<std::size_t> count = {0};

    // current bytes
    std::atomic<std::size_t> bytes = {0};

    // highest total ptr count
    std::atomic<std::size_t> count_max = {0};

    // highest total bytes
    std::atomic<std::size_t> bytes_max = {0};

    // largest single allocation
    std::atomic<std::size_t> alloc_max = {0};

    ~all_reports()
    {
        // breakpoint here to view report
#ifdef BOOST_URL_REPORT
# ifdef _MSC_VER
        if(count_max > 0)
            ::__debugbreak();
# endif
#endif
    }
};

static all_reports all_reports_;

void
recycled_add_impl(
    std::size_t n) noexcept
{
    auto& a = all_reports_;

    std::size_t new_count = ++a.count;
    std::size_t old_count_max = a.count_max;
    while (
        old_count_max < new_count &&
        !a.count_max.compare_exchange_weak(
            old_count_max, new_count))
    {}

    std::size_t new_bytes = a.bytes.fetch_add(n) + n;
    std::size_t old_bytes_max = a.bytes_max;
    while (
        old_bytes_max < new_bytes &&
        !a.bytes_max.compare_exchange_weak(
            old_bytes_max, new_bytes))
    {}

    std::size_t old_alloc_max = a.alloc_max;
    while (
        old_alloc_max < n &&
        !a.alloc_max.compare_exchange_weak(
            old_alloc_max, n))
    {}
}

void
recycled_remove_impl(
    std::size_t n) noexcept
{
    all_reports_.count--;
    all_reports_.bytes-=n;
}

} // detail
} // grammar
} // urls
} // boost

#endif