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()11RangesManager::~RangesManager() { 12 if (!do_not_release_ranges_on_destroy_for_testing_) { 13 ReleaseBucketRanges(); 14 } 15 } 16 operator ()(const BucketRanges * const a) const17size_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) const22bool 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)28const 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() const40std::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()47void RangesManager::ReleaseBucketRanges() { 48 for (const BucketRanges* range : GetRanges()) { 49 delete range; 50 } 51 GetRanges().clear(); 52 } 53 GetRanges()54RangesManager::RangesMap& RangesManager::GetRanges() { 55 return ranges_; 56 } 57 GetRanges() const58const RangesManager::RangesMap& RangesManager::GetRanges() const { 59 return ranges_; 60 } 61 DoNotReleaseRangesOnDestroyForTesting()62void 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)70const BucketRanges* ThreadSafeRangesManager::GetOrRegisterCanonicalRanges( 71 const BucketRanges* ranges) { 72 base::AutoLock auto_lock(lock_); 73 return RangesManager::GetOrRegisterCanonicalRanges(ranges); 74 } 75 GetBucketRanges() const76std::vector<const BucketRanges*> ThreadSafeRangesManager::GetBucketRanges() 77 const { 78 base::AutoLock auto_lock(lock_); 79 return RangesManager::GetBucketRanges(); 80 } 81 ReleaseBucketRanges()82void ThreadSafeRangesManager::ReleaseBucketRanges() { 83 base::AutoLock auto_lock(lock_); 84 RangesManager::ReleaseBucketRanges(); 85 } 86 GetRanges()87RangesManager::RangesMap& ThreadSafeRangesManager::GetRanges() { 88 lock_.AssertAcquired(); 89 return RangesManager::GetRanges(); 90 } 91 GetRanges() const92const RangesManager::RangesMap& ThreadSafeRangesManager::GetRanges() const { 93 lock_.AssertAcquired(); 94 return RangesManager::GetRanges(); 95 } 96 97 } // namespace base 98