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 |