blob: c4a328579debedcecc451b8434b3ab14b744aac8 [file] [log] [blame]
afakhry54485752015-07-06 17:39:161// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
avi24d693f2016-08-06 18:03:525#include "chrome/browser/task_manager/task_manager_interface.h"
afakhry54485752015-07-06 17:39:166
afakhry174069722016-05-24 19:16:167#include "chrome/browser/browser_process.h"
avi24d693f2016-08-06 18:03:528#include "chrome/browser/task_manager/sampling/task_manager_impl.h"
9#include "chrome/browser/task_manager/sampling/task_manager_io_thread_helper.h"
afakhry05015032015-08-14 01:09:5610#include "chrome/common/chrome_switches.h"
afakhry174069722016-05-24 19:16:1611#include "chrome/common/pref_names.h"
12#include "components/prefs/pref_registry_simple.h"
13#include "components/prefs/pref_service.h"
afakhry05015032015-08-14 01:09:5614#include "content/public/browser/browser_thread.h"
15
afakhry174069722016-05-24 19:16:1616#if defined(OS_MACOSX)
17#include "chrome/browser/ui/browser_dialogs.h"
18#endif // defined(OS_MACOSX)
19
avi24d693f2016-08-06 18:03:5220namespace task_manager {
afakhry54485752015-07-06 17:39:1621
afakhry05015032015-08-14 01:09:5622// static
afakhry174069722016-05-24 19:16:1623void TaskManagerInterface::RegisterPrefs(PrefRegistrySimple* registry) {
24 registry->RegisterDictionaryPref(prefs::kTaskManagerWindowPlacement);
25 registry->RegisterDictionaryPref(prefs::kTaskManagerColumnVisibility);
26 registry->RegisterBooleanPref(prefs::kTaskManagerEndProcessEnabled, true);
27}
28
29// static
30bool TaskManagerInterface::IsEndProcessEnabled() {
31 PrefService* state = g_browser_process->local_state();
32 return !state || state->GetBoolean(prefs::kTaskManagerEndProcessEnabled);
33}
34
afakhry174069722016-05-24 19:16:1635// static
afakhry05015032015-08-14 01:09:5636TaskManagerInterface* TaskManagerInterface::GetTaskManager() {
37 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
38
39 return TaskManagerImpl::GetInstance();
40}
41
42// static
43void TaskManagerInterface::OnRawBytesRead(const net::URLRequest& request,
sclittlece72c482015-08-24 20:20:5944 int64_t bytes_read) {
afakhry05015032015-08-14 01:09:5645 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
46
afakhry174069722016-05-24 19:16:1647 TaskManagerIoThreadHelper::OnRawBytesRead(request, bytes_read);
afakhry05015032015-08-14 01:09:5648}
49
afakhry54485752015-07-06 17:39:1650void TaskManagerInterface::AddObserver(TaskManagerObserver* observer) {
51 observers_.AddObserver(observer);
afakhry05015032015-08-14 01:09:5652 observer->observed_task_manager_ = this;
afakhry54485752015-07-06 17:39:1653
54 ResourceFlagsAdded(observer->desired_resources_flags());
55
afakhry05015032015-08-14 01:09:5656 base::TimeDelta current_refresh_time = GetCurrentRefreshTime();
57 if (current_refresh_time == base::TimeDelta::Max()) {
58 // This is the first observer to be added. Start updating.
59 StartUpdating();
60 }
61
62 if (observer->desired_refresh_time() > current_refresh_time)
afakhry54485752015-07-06 17:39:1663 return;
64
65 // Reached here, then this is EITHER (not the first observer to be added AND
66 // it requires a more frequent refresh rate) OR (it's the very first observer
67 // to be added).
68 // Reset the refresh timer.
69 ScheduleRefresh(observer->desired_refresh_time());
70}
71
72void TaskManagerInterface::RemoveObserver(TaskManagerObserver* observer) {
73 observers_.RemoveObserver(observer);
afakhry05015032015-08-14 01:09:5674 observer->observed_task_manager_ = nullptr;
afakhry54485752015-07-06 17:39:1675
76 // Recalculate the minimum refresh rate and the enabled resource flags.
avi664c07b2015-12-26 02:18:3177 int64_t flags = 0;
afakhry54485752015-07-06 17:39:1678 base::TimeDelta min_time = base::TimeDelta::Max();
dchengea687662016-10-13 16:59:5279 for (auto& observer : observers_) {
80 if (observer.desired_refresh_time() < min_time)
81 min_time = observer.desired_refresh_time();
afakhry54485752015-07-06 17:39:1682
dchengea687662016-10-13 16:59:5283 flags |= observer.desired_resources_flags();
afakhry54485752015-07-06 17:39:1684 }
85
86 if (min_time == base::TimeDelta::Max()) {
afakhry05015032015-08-14 01:09:5687 // This is the last observer to be removed. Stop updating.
afakhry54485752015-07-06 17:39:1688 SetEnabledResourceFlags(0);
89 refresh_timer_->Stop();
afakhry05015032015-08-14 01:09:5690 StopUpdating();
afakhry54485752015-07-06 17:39:1691 } else {
92 SetEnabledResourceFlags(flags);
93 ScheduleRefresh(min_time);
94 }
95}
96
afakhry05015032015-08-14 01:09:5697void TaskManagerInterface::RecalculateRefreshFlags() {
avi664c07b2015-12-26 02:18:3198 int64_t flags = 0;
dchengea687662016-10-13 16:59:5299 for (auto& observer : observers_)
100 flags |= observer.desired_resources_flags();
afakhry05015032015-08-14 01:09:56101
102 SetEnabledResourceFlags(flags);
103}
104
afakhry98241832016-03-11 19:27:47105bool TaskManagerInterface::IsResourceRefreshEnabled(RefreshType type) const {
afakhry54485752015-07-06 17:39:16106 return (enabled_resources_flags_ & type) != 0;
107}
108
109TaskManagerInterface::TaskManagerInterface()
thestig4949a1e2016-03-29 00:53:52110 : refresh_timer_(new base::Timer(true, true)),
afakhry54485752015-07-06 17:39:16111 enabled_resources_flags_(0) {
112}
113
114TaskManagerInterface::~TaskManagerInterface() {
115}
116
117void TaskManagerInterface::NotifyObserversOnTaskAdded(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56118 for (TaskManagerObserver& observer : observers_)
119 observer.OnTaskAdded(id);
afakhry54485752015-07-06 17:39:16120}
121
122void TaskManagerInterface::NotifyObserversOnTaskToBeRemoved(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56123 for (TaskManagerObserver& observer : observers_)
124 observer.OnTaskToBeRemoved(id);
afakhry54485752015-07-06 17:39:16125}
126
127void TaskManagerInterface::NotifyObserversOnRefresh(
128 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56129 for (TaskManagerObserver& observer : observers_)
130 observer.OnTasksRefreshed(task_ids);
afakhry54485752015-07-06 17:39:16131}
132
afakhry98241832016-03-11 19:27:47133void TaskManagerInterface::NotifyObserversOnRefreshWithBackgroundCalculations(
134 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56135 for (TaskManagerObserver& observer : observers_)
136 observer.OnTasksRefreshedWithBackgroundCalculations(task_ids);
afakhry98241832016-03-11 19:27:47137}
138
139void TaskManagerInterface::NotifyObserversOnTaskUnresponsive(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56140 for (TaskManagerObserver& observer : observers_)
141 observer.OnTaskUnresponsive(id);
afakhry98241832016-03-11 19:27:47142}
143
afakhry54485752015-07-06 17:39:16144base::TimeDelta TaskManagerInterface::GetCurrentRefreshTime() const {
145 return refresh_timer_->IsRunning() ? refresh_timer_->GetCurrentDelay()
146 : base::TimeDelta::Max();
147}
148
avi664c07b2015-12-26 02:18:31149void TaskManagerInterface::ResourceFlagsAdded(int64_t flags) {
afakhry54485752015-07-06 17:39:16150 enabled_resources_flags_ |= flags;
151}
152
avi664c07b2015-12-26 02:18:31153void TaskManagerInterface::SetEnabledResourceFlags(int64_t flags) {
afakhry54485752015-07-06 17:39:16154 enabled_resources_flags_ = flags;
155}
156
157void TaskManagerInterface::ScheduleRefresh(base::TimeDelta refresh_time) {
158 refresh_timer_->Start(FROM_HERE,
159 refresh_time,
160 base::Bind(&TaskManagerInterface::Refresh,
161 base::Unretained(this)));
162}
163
avi24d693f2016-08-06 18:03:52164} // namespace task_manager