blob: b22f3f95726f18b42f3bb36f3bd98462d63ebc0a [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
Sebastien Marchandf1349f52019-01-25 03:16:417#include "base/bind.h"
afakhry174069722016-05-24 19:16:168#include "chrome/browser/browser_process.h"
avi24d693f2016-08-06 18:03:529#include "chrome/browser/task_manager/sampling/task_manager_impl.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"
John Abd-El-Malek2791e092018-01-08 15:35:2015#include "content/public/common/child_process_host.h"
afakhry05015032015-08-14 01:09:5616
Avi Drissman73ea8642020-07-29 19:56:1517#if defined(OS_MAC)
afakhry174069722016-05-24 19:16:1618#include "chrome/browser/ui/browser_dialogs.h"
Avi Drissman73ea8642020-07-29 19:56:1519#endif // defined(OS_MAC)
afakhry174069722016-05-24 19:16:1620
avi24d693f2016-08-06 18:03:5221namespace task_manager {
afakhry54485752015-07-06 17:39:1622
afakhry05015032015-08-14 01:09:5623// static
afakhry174069722016-05-24 19:16:1624void TaskManagerInterface::RegisterPrefs(PrefRegistrySimple* registry) {
25 registry->RegisterDictionaryPref(prefs::kTaskManagerWindowPlacement);
26 registry->RegisterDictionaryPref(prefs::kTaskManagerColumnVisibility);
27 registry->RegisterBooleanPref(prefs::kTaskManagerEndProcessEnabled, true);
28}
29
30// static
31bool TaskManagerInterface::IsEndProcessEnabled() {
32 PrefService* state = g_browser_process->local_state();
33 return !state || state->GetBoolean(prefs::kTaskManagerEndProcessEnabled);
34}
35
afakhry174069722016-05-24 19:16:1636// static
afakhry05015032015-08-14 01:09:5637TaskManagerInterface* TaskManagerInterface::GetTaskManager() {
38 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
39
40 return TaskManagerImpl::GetInstance();
41}
42
afakhry54485752015-07-06 17:39:1643void TaskManagerInterface::AddObserver(TaskManagerObserver* observer) {
44 observers_.AddObserver(observer);
afakhry05015032015-08-14 01:09:5645 observer->observed_task_manager_ = this;
afakhry54485752015-07-06 17:39:1646
47 ResourceFlagsAdded(observer->desired_resources_flags());
48
afakhry05015032015-08-14 01:09:5649 base::TimeDelta current_refresh_time = GetCurrentRefreshTime();
50 if (current_refresh_time == base::TimeDelta::Max()) {
51 // This is the first observer to be added. Start updating.
52 StartUpdating();
53 }
54
55 if (observer->desired_refresh_time() > current_refresh_time)
afakhry54485752015-07-06 17:39:1656 return;
57
58 // Reached here, then this is EITHER (not the first observer to be added AND
59 // it requires a more frequent refresh rate) OR (it's the very first observer
60 // to be added).
61 // Reset the refresh timer.
62 ScheduleRefresh(observer->desired_refresh_time());
63}
64
65void TaskManagerInterface::RemoveObserver(TaskManagerObserver* observer) {
66 observers_.RemoveObserver(observer);
afakhry05015032015-08-14 01:09:5667 observer->observed_task_manager_ = nullptr;
afakhry54485752015-07-06 17:39:1668
69 // Recalculate the minimum refresh rate and the enabled resource flags.
avi664c07b2015-12-26 02:18:3170 int64_t flags = 0;
afakhry54485752015-07-06 17:39:1671 base::TimeDelta min_time = base::TimeDelta::Max();
dchengea687662016-10-13 16:59:5272 for (auto& observer : observers_) {
73 if (observer.desired_refresh_time() < min_time)
74 min_time = observer.desired_refresh_time();
afakhry54485752015-07-06 17:39:1675
dchengea687662016-10-13 16:59:5276 flags |= observer.desired_resources_flags();
afakhry54485752015-07-06 17:39:1677 }
78
79 if (min_time == base::TimeDelta::Max()) {
afakhry05015032015-08-14 01:09:5680 // This is the last observer to be removed. Stop updating.
afakhry54485752015-07-06 17:39:1681 SetEnabledResourceFlags(0);
82 refresh_timer_->Stop();
afakhry05015032015-08-14 01:09:5683 StopUpdating();
afakhry54485752015-07-06 17:39:1684 } else {
85 SetEnabledResourceFlags(flags);
86 ScheduleRefresh(min_time);
87 }
88}
89
afakhry05015032015-08-14 01:09:5690void TaskManagerInterface::RecalculateRefreshFlags() {
avi664c07b2015-12-26 02:18:3191 int64_t flags = 0;
dchengea687662016-10-13 16:59:5292 for (auto& observer : observers_)
93 flags |= observer.desired_resources_flags();
afakhry05015032015-08-14 01:09:5694
95 SetEnabledResourceFlags(flags);
96}
97
afakhry98241832016-03-11 19:27:4798bool TaskManagerInterface::IsResourceRefreshEnabled(RefreshType type) const {
afakhry54485752015-07-06 17:39:1699 return (enabled_resources_flags_ & type) != 0;
100}
101
102TaskManagerInterface::TaskManagerInterface()
tzik550a880d2018-07-12 21:29:13103 : refresh_timer_(new base::RepeatingTimer()), enabled_resources_flags_(0) {}
afakhry54485752015-07-06 17:39:16104
105TaskManagerInterface::~TaskManagerInterface() {
106}
107
108void TaskManagerInterface::NotifyObserversOnTaskAdded(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56109 for (TaskManagerObserver& observer : observers_)
110 observer.OnTaskAdded(id);
afakhry54485752015-07-06 17:39:16111}
112
113void TaskManagerInterface::NotifyObserversOnTaskToBeRemoved(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56114 for (TaskManagerObserver& observer : observers_)
115 observer.OnTaskToBeRemoved(id);
afakhry54485752015-07-06 17:39:16116}
117
118void TaskManagerInterface::NotifyObserversOnRefresh(
119 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56120 for (TaskManagerObserver& observer : observers_)
121 observer.OnTasksRefreshed(task_ids);
afakhry54485752015-07-06 17:39:16122}
123
afakhry98241832016-03-11 19:27:47124void TaskManagerInterface::NotifyObserversOnRefreshWithBackgroundCalculations(
125 const TaskIdList& task_ids) {
ericwilligers58b0e162016-10-21 07:15:56126 for (TaskManagerObserver& observer : observers_)
127 observer.OnTasksRefreshedWithBackgroundCalculations(task_ids);
afakhry98241832016-03-11 19:27:47128}
129
130void TaskManagerInterface::NotifyObserversOnTaskUnresponsive(TaskId id) {
ericwilligers58b0e162016-10-21 07:15:56131 for (TaskManagerObserver& observer : observers_)
132 observer.OnTaskUnresponsive(id);
afakhry98241832016-03-11 19:27:47133}
134
afakhry54485752015-07-06 17:39:16135base::TimeDelta TaskManagerInterface::GetCurrentRefreshTime() const {
136 return refresh_timer_->IsRunning() ? refresh_timer_->GetCurrentDelay()
137 : base::TimeDelta::Max();
138}
139
avi664c07b2015-12-26 02:18:31140void TaskManagerInterface::ResourceFlagsAdded(int64_t flags) {
afakhry54485752015-07-06 17:39:16141 enabled_resources_flags_ |= flags;
142}
143
avi664c07b2015-12-26 02:18:31144void TaskManagerInterface::SetEnabledResourceFlags(int64_t flags) {
afakhry54485752015-07-06 17:39:16145 enabled_resources_flags_ = flags;
146}
147
148void TaskManagerInterface::ScheduleRefresh(base::TimeDelta refresh_time) {
Minggang Wangb30ad4a02020-07-17 01:20:28149 refresh_timer_->Start(FROM_HERE, refresh_time,
150 base::BindRepeating(&TaskManagerInterface::Refresh,
151 base::Unretained(this)));
afakhry54485752015-07-06 17:39:16152}
153
avi24d693f2016-08-06 18:03:52154} // namespace task_manager