1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_METRICS_RANGES_MANAGER_H_
#define BASE_METRICS_RANGES_MANAGER_H_
#include <unordered_set>
#include "base/base_export.h"
#include "base/metrics/bucket_ranges.h"
namespace base {
// Manages BucketRanges and their lifetime. When registering a BucketRanges
// to a RangesManager instance, if an equivalent one already exists (one with
// the exact same ranges), the passed BucketRanges is deleted. This is useful to
// prevent duplicate instances of equivalent BucketRanges. Upon the destruction
// of a RangesManager instance, all BucketRanges managed by it are destroyed. A
// BucketRanges instance should not be registered to multiple RangesManagers.
class BASE_EXPORT RangesManager {
public:
RangesManager();
RangesManager(const RangesManager&) = delete;
RangesManager& operator=(const RangesManager&) = delete;
~RangesManager();
// Registers a BucketRanges. If an equivalent BucketRanges is already
// registered, then the argument |ranges| will be deleted. The returned value
// is always the registered BucketRanges (either the argument, or the
// pre-existing one). Registering a BucketRanges passes the ownership, and
// will be released when the RangesManager is released.
const BucketRanges* RegisterOrDeleteDuplicateRanges(
const BucketRanges* ranges);
// Gets all registered BucketRanges. The order of returned BucketRanges is not
// guaranteed.
std::vector<const BucketRanges*> GetBucketRanges();
// Some tests may instantiate temporary StatisticsRecorders, each having their
// own RangesManager. During the tests, ranges may get registered with a
// recorder that later gets released, which would release the ranges as well.
// Calling this method prevents this, as the tests may not expect them to be
// deleted.
void DoNotReleaseRangesOnDestroyForTesting();
private:
// Removes all registered BucketRanges and destroys them. This is called in
// the destructor.
void ReleaseBucketRanges();
// Used to get the hash of a BucketRanges, which is simply its checksum.
struct BucketRangesHash {
size_t operator()(const BucketRanges* a) const;
};
// Comparator for BucketRanges. See `BucketRanges::Equals()`.
struct BucketRangesEqual {
bool operator()(const BucketRanges* a, const BucketRanges* b) const;
};
// Type for a set of unique RangesBucket, with their hash and equivalence
// defined by `BucketRangesHash` and `BucketRangesEqual`.
typedef std::
unordered_set<const BucketRanges*, BucketRangesHash, BucketRangesEqual>
RangesMap;
// The set of unique BucketRanges registered to the RangesManager.
RangesMap ranges_;
// Whether or not to release the registered BucketRanges when this
// RangesManager is destroyed. See `DoNotReleaseRangesOnDestroyForTesting()`.
bool do_not_release_ranges_on_destroy_for_testing_ = false;
};
} // namespace base
#endif // BASE_METRICS_RANGES_MANAGER_H_
|