OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/metrics/call_stack_profile_metrics_provider.h" | 5 #include "components/metrics/call_stack_profile_metrics_provider.h" |
6 | 6 |
7 #include <cstring> | 7 #include <cstring> |
8 #include <map> | 8 #include <map> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 24 matching lines...) Expand all Loading... |
35 // compute module instruction pointer offsets. | 35 // compute module instruction pointer offsets. |
36 void CopySampleToProto( | 36 void CopySampleToProto( |
37 const StackSamplingProfiler::Sample& sample, | 37 const StackSamplingProfiler::Sample& sample, |
38 const std::vector<StackSamplingProfiler::Module>& modules, | 38 const std::vector<StackSamplingProfiler::Module>& modules, |
39 CallStackProfile::Sample* proto_sample) { | 39 CallStackProfile::Sample* proto_sample) { |
40 for (const StackSamplingProfiler::Frame& frame : sample) { | 40 for (const StackSamplingProfiler::Frame& frame : sample) { |
41 CallStackProfile::Entry* entry = proto_sample->add_entry(); | 41 CallStackProfile::Entry* entry = proto_sample->add_entry(); |
42 // A frame may not have a valid module. If so, we can't compute the | 42 // A frame may not have a valid module. If so, we can't compute the |
43 // instruction pointer offset, and we don't want to send bare pointers, so | 43 // instruction pointer offset, and we don't want to send bare pointers, so |
44 // leave call_stack_entry empty. | 44 // leave call_stack_entry empty. |
45 if (frame.module_index < 0) | 45 if (frame.module_index == StackSamplingProfiler::Frame::kUnknownModuleIndex) |
46 continue; | 46 continue; |
47 int64 module_offset = | 47 int64 module_offset = |
48 reinterpret_cast<const char*>(frame.instruction_pointer) - | 48 reinterpret_cast<const char*>(frame.instruction_pointer) - |
49 reinterpret_cast<const char*>(modules[frame.module_index].base_address); | 49 reinterpret_cast<const char*>(modules[frame.module_index].base_address); |
50 DCHECK_GE(module_offset, 0); | 50 DCHECK_GE(module_offset, 0); |
51 entry->set_address(static_cast<uint64>(module_offset)); | 51 entry->set_address(static_cast<uint64>(module_offset)); |
52 entry->set_module_id_index(frame.module_index); | 52 entry->set_module_id_index(frame.module_index); |
53 } | 53 } |
54 } | 54 } |
55 | 55 |
56 // Transcode |profile| into |proto_profile|. | 56 // Transcode |profile| into |proto_profile|. |
57 void CopyProfileToProto( | 57 void CopyProfileToProto( |
58 const StackSamplingProfiler::Profile& profile, | 58 const StackSamplingProfiler::CallStackProfile& profile, |
59 CallStackProfile* proto_profile) { | 59 CallStackProfile* proto_profile) { |
60 if (profile.samples.empty()) | 60 if (profile.samples.empty()) |
61 return; | 61 return; |
62 | 62 |
63 if (profile.preserve_sample_ordering) { | 63 if (profile.preserve_sample_ordering) { |
64 // Collapse only consecutive repeated samples together. | 64 // Collapse only consecutive repeated samples together. |
65 CallStackProfile::Sample* current_sample_proto = nullptr; | 65 CallStackProfile::Sample* current_sample_proto = nullptr; |
66 for (auto it = profile.samples.begin(); it != profile.samples.end(); ++it) { | 66 for (auto it = profile.samples.begin(); it != profile.samples.end(); ++it) { |
67 if (!current_sample_proto || *it != *(it - 1)) { | 67 if (!current_sample_proto || *it != *(it - 1)) { |
68 current_sample_proto = proto_profile->add_sample(); | 68 current_sample_proto = proto_profile->add_sample(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 profile.sampling_period.InMilliseconds()); | 105 profile.sampling_period.InMilliseconds()); |
106 } | 106 } |
107 } // namespace | 107 } // namespace |
108 | 108 |
109 CallStackProfileMetricsProvider::CallStackProfileMetricsProvider() {} | 109 CallStackProfileMetricsProvider::CallStackProfileMetricsProvider() {} |
110 | 110 |
111 CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() {} | 111 CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() {} |
112 | 112 |
113 void CallStackProfileMetricsProvider::ProvideGeneralMetrics( | 113 void CallStackProfileMetricsProvider::ProvideGeneralMetrics( |
114 ChromeUserMetricsExtension* uma_proto) { | 114 ChromeUserMetricsExtension* uma_proto) { |
115 std::vector<StackSamplingProfiler::Profile> profiles; | 115 std::vector<StackSamplingProfiler::CallStackProfile> profiles; |
116 if (!source_profiles_for_test_.empty()) | 116 if (!source_profiles_for_test_.empty()) |
117 profiles.swap(source_profiles_for_test_); | 117 profiles.swap(source_profiles_for_test_); |
118 else | 118 else |
119 StackSamplingProfiler::GetPendingProfiles(&profiles); | 119 StackSamplingProfiler::GetPendingProfiles(&profiles); |
120 | 120 |
121 for (const StackSamplingProfiler::Profile& profile : profiles) { | 121 for (const StackSamplingProfiler::CallStackProfile& profile : profiles) { |
122 CallStackProfile* call_stack_profile = | 122 CallStackProfile* call_stack_profile = |
123 uma_proto->add_sampled_profile()->mutable_call_stack_profile(); | 123 uma_proto->add_sampled_profile()->mutable_call_stack_profile(); |
124 CopyProfileToProto(profile, call_stack_profile); | 124 CopyProfileToProto(profile, call_stack_profile); |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 void CallStackProfileMetricsProvider::SetSourceProfilesForTesting( | 128 void CallStackProfileMetricsProvider::SetSourceProfilesForTesting( |
129 const std::vector<StackSamplingProfiler::Profile>& profiles) { | 129 const std::vector<StackSamplingProfiler::CallStackProfile>& profiles) { |
130 source_profiles_for_test_ = profiles; | 130 source_profiles_for_test_ = profiles; |
131 } | 131 } |
132 | 132 |
133 } // namespace metrics | 133 } // namespace metrics |
OLD | NEW |