xref: /aosp_15_r20/external/cronet/base/metrics/ranges_manager.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/metrics/ranges_manager.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker namespace base {
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker RangesManager::RangesManager() = default;
10*6777b538SAndroid Build Coastguard Worker 
~RangesManager()11*6777b538SAndroid Build Coastguard Worker RangesManager::~RangesManager() {
12*6777b538SAndroid Build Coastguard Worker   if (!do_not_release_ranges_on_destroy_for_testing_) {
13*6777b538SAndroid Build Coastguard Worker     ReleaseBucketRanges();
14*6777b538SAndroid Build Coastguard Worker   }
15*6777b538SAndroid Build Coastguard Worker }
16*6777b538SAndroid Build Coastguard Worker 
operator ()(const BucketRanges * const a) const17*6777b538SAndroid Build Coastguard Worker size_t RangesManager::BucketRangesHash::operator()(
18*6777b538SAndroid Build Coastguard Worker     const BucketRanges* const a) const {
19*6777b538SAndroid Build Coastguard Worker   return a->checksum();
20*6777b538SAndroid Build Coastguard Worker }
21*6777b538SAndroid Build Coastguard Worker 
operator ()(const BucketRanges * const a,const BucketRanges * const b) const22*6777b538SAndroid Build Coastguard Worker bool RangesManager::BucketRangesEqual::operator()(
23*6777b538SAndroid Build Coastguard Worker     const BucketRanges* const a,
24*6777b538SAndroid Build Coastguard Worker     const BucketRanges* const b) const {
25*6777b538SAndroid Build Coastguard Worker   return a->Equals(b);
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker 
GetOrRegisterCanonicalRanges(const BucketRanges * ranges)28*6777b538SAndroid Build Coastguard Worker const BucketRanges* RangesManager::GetOrRegisterCanonicalRanges(
29*6777b538SAndroid Build Coastguard Worker     const BucketRanges* ranges) {
30*6777b538SAndroid Build Coastguard Worker   // Note: This code is run in a critical lock path from StatisticsRecorder
31*6777b538SAndroid Build Coastguard Worker   // so we intentionally don't use a CHECK() here.
32*6777b538SAndroid Build Coastguard Worker   DCHECK(ranges->HasValidChecksum());
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   // Attempt to insert |ranges| into the set of registered BucketRanges. If an
35*6777b538SAndroid Build Coastguard Worker   // equivalent one already exists (one with the exact same ranges), this
36*6777b538SAndroid Build Coastguard Worker   // fetches the pre-existing one and does not insert the passed |ranges|.
37*6777b538SAndroid Build Coastguard Worker   return *GetRanges().insert(ranges).first;
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker 
GetBucketRanges() const40*6777b538SAndroid Build Coastguard Worker std::vector<const BucketRanges*> RangesManager::GetBucketRanges() const {
41*6777b538SAndroid Build Coastguard Worker   std::vector<const BucketRanges*> out;
42*6777b538SAndroid Build Coastguard Worker   out.reserve(GetRanges().size());
43*6777b538SAndroid Build Coastguard Worker   out.assign(GetRanges().begin(), GetRanges().end());
44*6777b538SAndroid Build Coastguard Worker   return out;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker 
ReleaseBucketRanges()47*6777b538SAndroid Build Coastguard Worker void RangesManager::ReleaseBucketRanges() {
48*6777b538SAndroid Build Coastguard Worker   for (const BucketRanges* range : GetRanges()) {
49*6777b538SAndroid Build Coastguard Worker     delete range;
50*6777b538SAndroid Build Coastguard Worker   }
51*6777b538SAndroid Build Coastguard Worker   GetRanges().clear();
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker 
GetRanges()54*6777b538SAndroid Build Coastguard Worker RangesManager::RangesMap& RangesManager::GetRanges() {
55*6777b538SAndroid Build Coastguard Worker   return ranges_;
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
GetRanges() const58*6777b538SAndroid Build Coastguard Worker const RangesManager::RangesMap& RangesManager::GetRanges() const {
59*6777b538SAndroid Build Coastguard Worker   return ranges_;
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker 
DoNotReleaseRangesOnDestroyForTesting()62*6777b538SAndroid Build Coastguard Worker void RangesManager::DoNotReleaseRangesOnDestroyForTesting() {
63*6777b538SAndroid Build Coastguard Worker   do_not_release_ranges_on_destroy_for_testing_ = true;
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker ThreadSafeRangesManager::ThreadSafeRangesManager() = default;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker ThreadSafeRangesManager::~ThreadSafeRangesManager() = default;
69*6777b538SAndroid Build Coastguard Worker 
GetOrRegisterCanonicalRanges(const BucketRanges * ranges)70*6777b538SAndroid Build Coastguard Worker const BucketRanges* ThreadSafeRangesManager::GetOrRegisterCanonicalRanges(
71*6777b538SAndroid Build Coastguard Worker     const BucketRanges* ranges) {
72*6777b538SAndroid Build Coastguard Worker   base::AutoLock auto_lock(lock_);
73*6777b538SAndroid Build Coastguard Worker   return RangesManager::GetOrRegisterCanonicalRanges(ranges);
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
GetBucketRanges() const76*6777b538SAndroid Build Coastguard Worker std::vector<const BucketRanges*> ThreadSafeRangesManager::GetBucketRanges()
77*6777b538SAndroid Build Coastguard Worker     const {
78*6777b538SAndroid Build Coastguard Worker   base::AutoLock auto_lock(lock_);
79*6777b538SAndroid Build Coastguard Worker   return RangesManager::GetBucketRanges();
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker 
ReleaseBucketRanges()82*6777b538SAndroid Build Coastguard Worker void ThreadSafeRangesManager::ReleaseBucketRanges() {
83*6777b538SAndroid Build Coastguard Worker   base::AutoLock auto_lock(lock_);
84*6777b538SAndroid Build Coastguard Worker   RangesManager::ReleaseBucketRanges();
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
GetRanges()87*6777b538SAndroid Build Coastguard Worker RangesManager::RangesMap& ThreadSafeRangesManager::GetRanges() {
88*6777b538SAndroid Build Coastguard Worker   lock_.AssertAcquired();
89*6777b538SAndroid Build Coastguard Worker   return RangesManager::GetRanges();
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker 
GetRanges() const92*6777b538SAndroid Build Coastguard Worker const RangesManager::RangesMap& ThreadSafeRangesManager::GetRanges() const {
93*6777b538SAndroid Build Coastguard Worker   lock_.AssertAcquired();
94*6777b538SAndroid Build Coastguard Worker   return RangesManager::GetRanges();
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker }  // namespace base
98