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 #ifndef BASE_METRICS_RANGES_MANAGER_H_ 6 #define BASE_METRICS_RANGES_MANAGER_H_ 7 8 #include <unordered_set> 9 #include <vector> 10 11 #include "base/base_export.h" 12 #include "base/metrics/bucket_ranges.h" 13 #include "base/synchronization/lock.h" 14 15 namespace base { 16 17 // Manages BucketRanges and their lifetime. When registering a BucketRanges 18 // to a RangesManager instance, if an equivalent one already exists (one with 19 // the exact same ranges), the passed BucketRanges is deleted. This is useful to 20 // prevent duplicate instances of equivalent BucketRanges. Upon the destruction 21 // of a RangesManager instance, all BucketRanges managed by it are destroyed. A 22 // BucketRanges instance should not be registered to multiple RangesManagers. 23 class BASE_EXPORT RangesManager { 24 public: 25 RangesManager(); 26 27 RangesManager(const RangesManager&) = delete; 28 RangesManager& operator=(const RangesManager&) = delete; 29 30 virtual ~RangesManager(); 31 32 // Gets the canonical BucketRanges object corresponding to `ranges`. If one 33 // does not exist, then `ranges` will be registered with this object, which 34 // will take ownership of it. Returns a pointer to the canonical ranges 35 // object. If it's different than `ranges`, the caller is responsible for 36 // deleting `ranges`. 37 virtual const BucketRanges* GetOrRegisterCanonicalRanges( 38 const BucketRanges* ranges); 39 40 // Gets all registered BucketRanges. The order of returned BucketRanges is not 41 // guaranteed. 42 virtual std::vector<const BucketRanges*> GetBucketRanges() const; 43 44 // Some tests may instantiate temporary StatisticsRecorders, each having their 45 // own RangesManager. During the tests, ranges may get registered with a 46 // recorder that later gets released, which would release the ranges as well. 47 // Calling this method prevents this, as the tests may not expect them to be 48 // deleted. 49 void DoNotReleaseRangesOnDestroyForTesting(); 50 51 protected: 52 // Used to get the hash of a BucketRanges, which is simply its checksum. 53 struct BucketRangesHash { 54 size_t operator()(const BucketRanges* a) const; 55 }; 56 57 // Comparator for BucketRanges. See `BucketRanges::Equals()`. 58 struct BucketRangesEqual { 59 bool operator()(const BucketRanges* a, const BucketRanges* b) const; 60 }; 61 62 // Type for a set of unique RangesBucket, with their hash and equivalence 63 // defined by `BucketRangesHash` and `BucketRangesEqual`. 64 typedef std:: 65 unordered_set<const BucketRanges*, BucketRangesHash, BucketRangesEqual> 66 RangesMap; 67 68 // Removes all registered BucketRanges and destroys them. This is called in 69 // the destructor. 70 virtual void ReleaseBucketRanges(); 71 72 virtual RangesMap& GetRanges(); 73 virtual const RangesMap& GetRanges() const; 74 75 private: 76 // The set of unique BucketRanges registered to the RangesManager. 77 RangesMap ranges_; 78 79 // Whether or not to release the registered BucketRanges when this 80 // RangesManager is destroyed. See `DoNotReleaseRangesOnDestroyForTesting()`. 81 bool do_not_release_ranges_on_destroy_for_testing_ = false; 82 }; 83 84 class BASE_EXPORT ThreadSafeRangesManager final : public RangesManager { 85 public: 86 ThreadSafeRangesManager(); 87 88 ThreadSafeRangesManager(const RangesManager&) = delete; 89 ThreadSafeRangesManager& operator=(const ThreadSafeRangesManager&) = delete; 90 91 ~ThreadSafeRangesManager() override; 92 93 // RangesManager: 94 const BucketRanges* GetOrRegisterCanonicalRanges( 95 const BucketRanges* ranges) override; 96 std::vector<const BucketRanges*> GetBucketRanges() const override; 97 98 protected: 99 // RangesManager: 100 void ReleaseBucketRanges() override; 101 RangesMap& GetRanges() override; 102 const RangesMap& GetRanges() const override; 103 104 private: 105 // Used to protect access to |ranges_|. 106 mutable base::Lock lock_; 107 }; 108 109 } // namespace base 110 111 #endif // BASE_METRICS_RANGES_MANAGER_H_ 112