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 WorkerRangesManager::~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 Workersize_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 Workerbool 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 Workerconst 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 Workerstd::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 Workervoid 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 WorkerRangesManager::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 Workerconst 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 Workervoid 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 Workerconst 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 Workerstd::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 Workervoid 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 WorkerRangesManager::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 Workerconst 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