Chromium Code Reviews| Index: components/metrics/call_stack_profile_metrics_provider.cc |
| diff --git a/components/metrics/call_stack_profile_metrics_provider.cc b/components/metrics/call_stack_profile_metrics_provider.cc |
| index 7ed60f5ba6b301b215582a6212a8e4162faeddf2..0951d8d168eda442adb0689cf9c684695ce2e200 100644 |
| --- a/components/metrics/call_stack_profile_metrics_provider.cc |
| +++ b/components/metrics/call_stack_profile_metrics_provider.cc |
| @@ -8,8 +8,10 @@ |
| #include <map> |
| #include <utility> |
| +#include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| +#include "base/metrics/field_trial.h" |
| #include "base/profiler/stack_sampling_profiler.h" |
| #include "components/metrics/metrics_hashes.h" |
| #include "components/metrics/proto/chrome_user_metrics_extension.pb.h" |
| @@ -20,6 +22,14 @@ namespace metrics { |
| namespace { |
| +bool IsSamplingProfilingReportingEnabled() { |
|
Ilya Sherman
2015/03/24 04:02:03
nit: Doc string, please.
Mike Wittman
2015/03/24 18:37:39
Done.
|
| + const std::string group_name = |
| + base::FieldTrialList::FindFullName( |
| + CallStackProfileMetricsProvider::kFieldTrialName); |
| + return group_name == |
| + CallStackProfileMetricsProvider::kReportProfilesGroupName; |
| +} |
| + |
| // The protobuf expects the MD5 checksum prefix of the module name. |
| uint64 HashModuleFilename(const base::FilePath& filename) { |
| const base::FilePath::StringType basename = filename.BaseName().value(); |
| @@ -106,17 +116,45 @@ void CopyProfileToProto( |
| } |
|
Ilya Sherman
2015/03/24 04:02:03
nit: Please leave a blank line here.
Mike Wittman
2015/03/24 18:37:39
Done.
|
| } // namespace |
| -CallStackProfileMetricsProvider::CallStackProfileMetricsProvider() {} |
| +const char CallStackProfileMetricsProvider::kFieldTrialName[] = |
| + "StackProfiling"; |
| +const char CallStackProfileMetricsProvider::kReportProfilesGroupName[] = |
| + "Report profiles"; |
| -CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() {} |
| +CallStackProfileMetricsProvider::CallStackProfileMetricsProvider() |
| + : weak_factory_(this) { |
| +} |
| + |
| +CallStackProfileMetricsProvider::~CallStackProfileMetricsProvider() { |
| + StackSamplingProfiler::SetDefaultCompletedCallback( |
| + StackSamplingProfiler::CompletedCallback()); |
| +} |
| + |
| +void CallStackProfileMetricsProvider::OnRecordingEnabled() { |
| + StackSamplingProfiler::SetDefaultCompletedCallback( |
| + base::Bind(&CallStackProfileMetricsProvider::ReceiveCompletedProfiles, |
| + weak_factory_.GetWeakPtr())); |
|
Ilya Sherman
2015/03/24 04:02:03
Note that weak pointers are only safe to read on t
Mike Wittman
2015/03/24 18:37:39
Ah, didn't realize that. Updated to post a task ba
|
| +} |
| + |
| +void CallStackProfileMetricsProvider::OnRecordingDisabled() { |
| + StackSamplingProfiler::SetDefaultCompletedCallback( |
| + base::Bind(&CallStackProfileMetricsProvider::IgnoreCompletedProfiles)); |
| + { |
| + base::AutoLock scoped_lock(pending_profiles_lock_); |
| + pending_profiles_.clear(); |
| + } |
| +} |
| void CallStackProfileMetricsProvider::ProvideGeneralMetrics( |
| ChromeUserMetricsExtension* uma_proto) { |
| std::vector<StackSamplingProfiler::Profile> profiles; |
| - if (!source_profiles_for_test_.empty()) |
| - profiles.swap(source_profiles_for_test_); |
| - else |
| - StackSamplingProfiler::GetPendingProfiles(&profiles); |
| + { |
| + base::AutoLock scoped_lock(pending_profiles_lock_); |
| + profiles.swap(pending_profiles_); |
| + } |
| + |
| + if (!IsSamplingProfilingReportingEnabled()) |
| + return; |
| for (const StackSamplingProfiler::Profile& profile : profiles) { |
| CallStackProfile* call_stack_profile = |
| @@ -127,7 +165,20 @@ void CallStackProfileMetricsProvider::ProvideGeneralMetrics( |
| void CallStackProfileMetricsProvider::SetSourceProfilesForTesting( |
| const std::vector<StackSamplingProfiler::Profile>& profiles) { |
| - source_profiles_for_test_ = profiles; |
| + base::AutoLock scoped_lock(pending_profiles_lock_); |
| + pending_profiles_ = profiles; |
| +} |
| + |
| +void CallStackProfileMetricsProvider::ReceiveCompletedProfiles( |
| + const std::vector<base::StackSamplingProfiler::Profile>& profiles) { |
| + base::AutoLock scoped_lock(pending_profiles_lock_); |
| + pending_profiles_.insert(pending_profiles_.end(), profiles.begin(), |
| + profiles.end()); |
| +} |
| + |
| +// static |
| +void CallStackProfileMetricsProvider::IgnoreCompletedProfiles( |
| + const std::vector<base::StackSamplingProfiler::Profile>& profiles) { |
| } |
| } // namespace metrics |