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