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