blob: 2b833ec9c0053cd49d15b7de6ec20358e384619e [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
cburne9d2f3612017-06-20 22:15:0350// static
51void TaskManagerInterface::OnRawBytesSent(const net::URLRequest& request,
52 int64_t bytes_sent) {
53 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
54 TaskManagerIoThreadHelper::OnRawBytesSent(request, bytes_sent);
55}
56
afakhry54485752015-07-06 17:39:1657void TaskManagerInterface::AddObserver(TaskManagerObserver* observer) {
58 observers_.AddObserver(observer);
afakhry05015032015-08-14 01:09:5659 observer->observed_task_manager_ = this;
afakhry54485752015-07-06 17:39:1660
61 ResourceFlagsAdded(observer->desired_resources_flags());
62
afakhry05015032015-08-14 01:09:5663 base::TimeDelta current_refresh_time = GetCurrentRefreshTime();
64 if (current_refresh_time == base::TimeDelta::Max()) {
65 // This is the first observer to be added. Start updating.
66 StartUpdating();
67 }
68
69 if (observer->desired_refresh_time() > current_refresh_time)
afakhry54485752015-07-06 17:39:1670 return;
71
72 // Reached here, then this is EITHER (not the first observer to be added AND
73 // it requires a more frequent refresh rate) OR (it's the very first observer
74 // to be added).
75 // Reset the refresh timer.
76 ScheduleRefresh(observer->desired_refresh_time());
77}
78
79void TaskManagerInterface::RemoveObserver(TaskManagerObserver* observer) {
80 observers_.RemoveObserver(observer);
afakhry05015032015-08-14 01:09:5681 observer->observed_task_manager_ = nullptr;
afakhry54485752015-07-06 17:39:1682
83 // Recalculate the minimum refresh rate and the enabled resource flags.
avi664c07b2015-12-26 02:18:3184 int64_t flags = 0;
afakhry54485752015-07-06 17:39:1685 base::TimeDelta min_time = base::TimeDelta::Max();
dchengea687662016-10-13 16:59:5286 for (auto& observer : observers_) {
87 if (observer.desired_refresh_time() < min_time)
88 min_time = observer.desired_refresh_time();
afakhry54485752015-07-06 17:39:1689
dchengea687662016-10-13 16:59:5290 flags |= observer.desired_resources_flags();
afakhry54485752015-07-06 17:39:1691 }
92
93 if (min_time == base::TimeDelta::Max()) {
afakhry05015032015-08-14 01:09:5694 // This is the last observer to be removed. Stop updating.
afakhry54485752015-07-06 17:39:1695 SetEnabledResourceFlags(0);
96 refresh_timer_->Stop();
afakhry05015032015-08-14 01:09:5697 StopUpdating();
afakhry54485752015-07-06 17:39:1698 } else {
99 SetEnabledResourceFlags(flags);
100 ScheduleRefresh(min_time);
101 }
102}
103
afakhry05015032015-08-14 01:09:56104void TaskManagerInterface::RecalculateRefreshFlags() {
avi664c07b2015-12-26 02:18:31105 int64_t flags = 0;
dchengea687662016-10-13 16:59:52106 for (auto& observer : observers_)
107 flags |= observer.desired_resources_flags();
afakhry05015032015-08-14 01:09:56108
109 SetEnabledResourceFlags(flags);
110}
111
afakhry98241832016-03-11 19:27:47112bool TaskManagerInterface::IsResourceRefreshEnabled(RefreshType type) const {
afakhry54485752015-07-06 17:39:16113 return (enabled_resources_flags_ & type) != 0;
114}
115
116TaskManagerInterface::TaskManagerInterface()
thestig4949a1e2016-03-29 00:53:52117 : refresh_timer_(new base::Timer(true, true)),
afakhry54485752015-07-06 17:39:16118 enabled_resources_flags_(0) {
119}
120
121TaskManagerInterface::~TaskManagerInterface() {
122}
123
124void TaskManagerInterface::NotifyObserversOnTaskAdded(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56125 for (TaskManagerObserver& observer : observers_)
126 observer.OnTaskAdded(id);
afakhry54485752015-07-06 17:39:16127}
128
129void TaskManagerInterface::NotifyObserversOnTaskToBeRemoved(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56130 for (TaskManagerObserver& observer : observers_)
131 observer.OnTaskToBeRemoved(id);
afakhry54485752015-07-06 17:39:16132}
133
134void TaskManagerInterface::NotifyObserversOnRefresh(
135 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56136 for (TaskManagerObserver& observer : observers_)
137 observer.OnTasksRefreshed(task_ids);
afakhry54485752015-07-06 17:39:16138}
139
afakhry98241832016-03-11 19:27:47140void TaskManagerInterface::NotifyObserversOnRefreshWithBackgroundCalculations(
141 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56142 for (TaskManagerObserver& observer : observers_)
143 observer.OnTasksRefreshedWithBackgroundCalculations(task_ids);
afakhry98241832016-03-11 19:27:47144}
145
146void TaskManagerInterface::NotifyObserversOnTaskUnresponsive(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56147 for (TaskManagerObserver& observer : observers_)
148 observer.OnTaskUnresponsive(id);
afakhry98241832016-03-11 19:27:47149}
150
afakhry54485752015-07-06 17:39:16151base::TimeDelta TaskManagerInterface::GetCurrentRefreshTime() const {
152 return refresh_timer_->IsRunning() ? refresh_timer_->GetCurrentDelay()
153 : base::TimeDelta::Max();
154}
155
avi664c07b2015-12-26 02:18:31156void TaskManagerInterface::ResourceFlagsAdded(int64_t flags) {
afakhry54485752015-07-06 17:39:16157 enabled_resources_flags_ |= flags;
158}
159
avi664c07b2015-12-26 02:18:31160void TaskManagerInterface::SetEnabledResourceFlags(int64_t flags) {
afakhry54485752015-07-06 17:39:16161 enabled_resources_flags_ = flags;
162}
163
164void TaskManagerInterface::ScheduleRefresh(base::TimeDelta refresh_time) {
165 refresh_timer_->Start(FROM_HERE,
166 refresh_time,
167 base::Bind(&TaskManagerInterface::Refresh,
168 base::Unretained(this)));
169}
170
avi24d693f2016-08-06 18:03:52171} // namespace task_manager