Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Unified Diff: components/metrics/call_stack_profile_metrics_provider.cc

Issue 1029653002: Enable startup profiling by Win x64 stack sampling profiler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@statprof-metrics-provider
Patch Set: add tests Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698