1 // Copyright 2019 The Chromium Authors. All rights reserved.
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/profiler/sample_metadata.h"
6
7 #include "base/metrics/metrics_hashes.h"
8 #include "base/no_destructor.h"
9 #include "base/profiler/stack_sampling_profiler.h"
10
11 namespace base {
12
SampleMetadata(StringPiece name)13 SampleMetadata::SampleMetadata(StringPiece name)
14 : name_hash_(HashMetricName(name)) {}
15
Set(int64_t value)16 void SampleMetadata::Set(int64_t value) {
17 GetSampleMetadataRecorder()->Set(name_hash_, nullopt, value);
18 }
19
Set(int64_t key,int64_t value)20 void SampleMetadata::Set(int64_t key, int64_t value) {
21 GetSampleMetadataRecorder()->Set(name_hash_, key, value);
22 }
23
Remove()24 void SampleMetadata::Remove() {
25 GetSampleMetadataRecorder()->Remove(name_hash_, nullopt);
26 }
27
Remove(int64_t key)28 void SampleMetadata::Remove(int64_t key) {
29 GetSampleMetadataRecorder()->Remove(name_hash_, key);
30 }
31
ScopedSampleMetadata(StringPiece name,int64_t value)32 ScopedSampleMetadata::ScopedSampleMetadata(StringPiece name, int64_t value)
33 : name_hash_(HashMetricName(name)) {
34 GetSampleMetadataRecorder()->Set(name_hash_, nullopt, value);
35 }
36
ScopedSampleMetadata(StringPiece name,int64_t key,int64_t value)37 ScopedSampleMetadata::ScopedSampleMetadata(StringPiece name,
38 int64_t key,
39 int64_t value)
40 : name_hash_(HashMetricName(name)), key_(key) {
41 GetSampleMetadataRecorder()->Set(name_hash_, key, value);
42 }
43
~ScopedSampleMetadata()44 ScopedSampleMetadata::~ScopedSampleMetadata() {
45 GetSampleMetadataRecorder()->Remove(name_hash_, key_);
46 }
47
48 // This function is friended by StackSamplingProfiler so must live directly in
49 // the base namespace.
ApplyMetadataToPastSamplesImpl(TimeTicks period_start,TimeTicks period_end,int64_t name_hash,Optional<int64_t> key,int64_t value)50 void ApplyMetadataToPastSamplesImpl(TimeTicks period_start,
51 TimeTicks period_end,
52 int64_t name_hash,
53 Optional<int64_t> key,
54 int64_t value) {
55 StackSamplingProfiler::ApplyMetadataToPastSamples(period_start, period_end,
56 name_hash, key, value);
57 }
58
ApplyMetadataToPastSamples(TimeTicks period_start,TimeTicks period_end,StringPiece name,int64_t value)59 void ApplyMetadataToPastSamples(TimeTicks period_start,
60 TimeTicks period_end,
61 StringPiece name,
62 int64_t value) {
63 return ApplyMetadataToPastSamplesImpl(period_start, period_end,
64 HashMetricName(name), nullopt, value);
65 }
66
ApplyMetadataToPastSamples(TimeTicks period_start,TimeTicks period_end,StringPiece name,int64_t key,int64_t value)67 void ApplyMetadataToPastSamples(TimeTicks period_start,
68 TimeTicks period_end,
69 StringPiece name,
70 int64_t key,
71 int64_t value) {
72 return ApplyMetadataToPastSamplesImpl(period_start, period_end,
73 HashMetricName(name), key, value);
74 }
75
GetSampleMetadataRecorder()76 MetadataRecorder* GetSampleMetadataRecorder() {
77 static NoDestructor<MetadataRecorder> instance;
78 return instance.get();
79 }
80
81 } // namespace base
82