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

Side by Side Diff: chrome/browser/metrics/thread_watcher.cc

Issue 2362493002: Stack sampling profiler: set process and thread information (Closed)
Patch Set: address comments Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/metrics/thread_watcher.h" 5 #include "chrome/browser/metrics/thread_watcher.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 17 matching lines...) Expand all
28 #include "components/metrics/call_stack_profile_metrics_provider.h" 28 #include "components/metrics/call_stack_profile_metrics_provider.h"
29 #include "components/version_info/version_info.h" 29 #include "components/version_info/version_info.h"
30 #include "content/public/browser/notification_service.h" 30 #include "content/public/browser/notification_service.h"
31 31
32 #if defined(OS_WIN) 32 #if defined(OS_WIN)
33 #include "base/win/windows_version.h" 33 #include "base/win/windows_version.h"
34 #endif 34 #endif
35 35
36 using content::BrowserThread; 36 using content::BrowserThread;
37 37
38 namespace {
39
40 base::StackSamplingProfiler::SamplingParams GetJankTimeBombSamplingParams() {
41 base::StackSamplingProfiler::SamplingParams params;
42 params.initial_delay = base::TimeDelta::FromMilliseconds(0);
43 params.bursts = 1;
44 // 5 seconds at 10Hz.
45 params.samples_per_burst = 50;
46 params.sampling_interval = base::TimeDelta::FromMilliseconds(100);
47 return params;
48 }
49
50 } // namespace
51
38 // ThreadWatcher methods and members. 52 // ThreadWatcher methods and members.
39 ThreadWatcher::ThreadWatcher(const WatchingParams& params) 53 ThreadWatcher::ThreadWatcher(const WatchingParams& params)
40 : thread_id_(params.thread_id), 54 : thread_id_(params.thread_id),
41 thread_name_(params.thread_name), 55 thread_name_(params.thread_name),
42 watched_runner_(BrowserThread::GetTaskRunnerForThread(params.thread_id)), 56 watched_runner_(BrowserThread::GetTaskRunnerForThread(params.thread_id)),
43 sleep_time_(params.sleep_time), 57 sleep_time_(params.sleep_time),
44 unresponsive_time_(params.unresponsive_time), 58 unresponsive_time_(params.unresponsive_time),
45 ping_time_(base::TimeTicks::Now()), 59 ping_time_(base::TimeTicks::Now()),
46 pong_time_(ping_time_), 60 pong_time_(ping_time_),
47 ping_sequence_number_(0), 61 ping_sequence_number_(0),
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 base::TimeDelta::FromSeconds(10)); 922 base::TimeDelta::FromSeconds(10));
909 } 923 }
910 924
911 // static 925 // static
912 void StartupTimeBomb::DisarmStartupTimeBomb() { 926 void StartupTimeBomb::DisarmStartupTimeBomb() {
913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 927 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
914 if (g_startup_timebomb_) 928 if (g_startup_timebomb_)
915 g_startup_timebomb_->Disarm(); 929 g_startup_timebomb_->Disarm();
916 } 930 }
917 931
918 base::StackSamplingProfiler::SamplingParams GetJankTimeBombSamplingParams() {
919 base::StackSamplingProfiler::SamplingParams params;
920 params.initial_delay = base::TimeDelta::FromMilliseconds(0);
921 params.bursts = 1;
922 // 5 seconds at 10Hz.
923 params.samples_per_burst = 50;
924 params.sampling_interval = base::TimeDelta::FromMilliseconds(100);
925 return params;
926 }
927
928 // JankTimeBomb methods and members. 932 // JankTimeBomb methods and members.
929 // 933 //
930 JankTimeBomb::JankTimeBomb(base::TimeDelta duration) 934 JankTimeBomb::JankTimeBomb(base::TimeDelta duration,
931 : weak_ptr_factory_(this) { 935 metrics::CallStackProfileParams::Thread thread)
936 : thread_(thread), weak_ptr_factory_(this) {
932 if (IsEnabled()) { 937 if (IsEnabled()) {
933 WatchDogThread::PostDelayedTask( 938 WatchDogThread::PostDelayedTask(
934 FROM_HERE, 939 FROM_HERE,
935 base::Bind(&JankTimeBomb::Alarm, 940 base::Bind(&JankTimeBomb::Alarm,
936 weak_ptr_factory_.GetWeakPtr(), 941 weak_ptr_factory_.GetWeakPtr(),
937 base::PlatformThread::CurrentId()), 942 base::PlatformThread::CurrentId()),
938 duration); 943 duration);
939 } 944 }
940 } 945 }
941 946
942 JankTimeBomb::~JankTimeBomb() { 947 JankTimeBomb::~JankTimeBomb() {
943 } 948 }
944 949
945 bool JankTimeBomb::IsEnabled() const { 950 bool JankTimeBomb::IsEnabled() const {
946 version_info::Channel channel = chrome::GetChannel(); 951 version_info::Channel channel = chrome::GetChannel();
947 return channel == version_info::Channel::UNKNOWN || 952 return channel == version_info::Channel::UNKNOWN ||
948 channel == version_info::Channel::CANARY || 953 channel == version_info::Channel::CANARY ||
949 channel == version_info::Channel::DEV; 954 channel == version_info::Channel::DEV;
950 } 955 }
951 956
952 void JankTimeBomb::Alarm(base::PlatformThreadId thread_id) { 957 void JankTimeBomb::Alarm(base::PlatformThreadId thread_id) {
953 DCHECK(WatchDogThread::CurrentlyOnWatchDogThread()); 958 DCHECK(WatchDogThread::CurrentlyOnWatchDogThread());
954 sampling_profiler_.reset(new base::StackSamplingProfiler( 959 sampling_profiler_.reset(new base::StackSamplingProfiler(
955 thread_id, 960 thread_id,
956 GetJankTimeBombSamplingParams(), 961 GetJankTimeBombSamplingParams(),
957 metrics::CallStackProfileMetricsProvider::GetProfilerCallback( 962 metrics::CallStackProfileMetricsProvider::GetProfilerCallback(
958 metrics::CallStackProfileParams( 963 metrics::CallStackProfileParams(
964 metrics::CallStackProfileParams::BROWSER_PROCESS,
965 thread_,
959 metrics::CallStackProfileParams::JANKY_TASK, 966 metrics::CallStackProfileParams::JANKY_TASK,
960 metrics::CallStackProfileParams::PRESERVE_ORDER)))); 967 metrics::CallStackProfileParams::PRESERVE_ORDER))));
961 // Use synchronous profiler. It will automatically stop collection when 968 // Use synchronous profiler. It will automatically stop collection when
962 // destroyed. 969 // destroyed.
963 sampling_profiler_->Start(); 970 sampling_profiler_->Start();
964 } 971 }
965 972
966 // ShutdownWatcherHelper methods and members. 973 // ShutdownWatcherHelper methods and members.
967 // 974 //
968 // ShutdownWatcherHelper is a wrapper class for detecting hangs during 975 // ShutdownWatcherHelper is a wrapper class for detecting hangs during
(...skipping 30 matching lines...) Expand all
999 1006
1000 #if defined(OS_WIN) 1007 #if defined(OS_WIN)
1001 // On Windows XP, give twice the time for shutdown. 1008 // On Windows XP, give twice the time for shutdown.
1002 if (base::win::GetVersion() <= base::win::VERSION_XP) 1009 if (base::win::GetVersion() <= base::win::VERSION_XP)
1003 actual_duration *= 2; 1010 actual_duration *= 2;
1004 #endif 1011 #endif
1005 1012
1006 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration); 1013 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration);
1007 shutdown_watchdog_->Arm(); 1014 shutdown_watchdog_->Arm();
1008 } 1015 }
OLDNEW
« no previous file with comments | « chrome/browser/metrics/thread_watcher.h ('k') | chrome/browser/metrics/thread_watcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698