blob: 577696823f283b17f216ed457d70818318d85004 [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
5#include "chrome/browser/task_management/task_manager_interface.h"
6
afakhry05015032015-08-14 01:09:567#include "chrome/browser/task_management/sampling/task_manager_impl.h"
8#include "chrome/browser/task_management/sampling/task_manager_io_thread_helper.h"
9#include "chrome/browser/task_manager/task_manager.h"
10#include "chrome/common/chrome_switches.h"
11#include "content/public/browser/browser_thread.h"
12
afakhry54485752015-07-06 17:39:1613namespace task_management {
14
afakhry05015032015-08-14 01:09:5615// static
16TaskManagerInterface* TaskManagerInterface::GetTaskManager() {
17 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
18
19 return TaskManagerImpl::GetInstance();
20}
21
22// static
23void TaskManagerInterface::OnRawBytesRead(const net::URLRequest& request,
sclittlece72c482015-08-24 20:20:5924 int64_t bytes_read) {
afakhry05015032015-08-14 01:09:5625 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
26
27 if (switches::NewTaskManagerEnabled())
28 TaskManagerIoThreadHelper::OnRawBytesRead(request, bytes_read);
29 else
30 TaskManager::GetInstance()->model()->NotifyBytesRead(request, bytes_read);
31}
32
afakhry54485752015-07-06 17:39:1633void TaskManagerInterface::AddObserver(TaskManagerObserver* observer) {
34 observers_.AddObserver(observer);
afakhry05015032015-08-14 01:09:5635 observer->observed_task_manager_ = this;
afakhry54485752015-07-06 17:39:1636
37 ResourceFlagsAdded(observer->desired_resources_flags());
38
afakhry05015032015-08-14 01:09:5639 base::TimeDelta current_refresh_time = GetCurrentRefreshTime();
40 if (current_refresh_time == base::TimeDelta::Max()) {
41 // This is the first observer to be added. Start updating.
42 StartUpdating();
43 }
44
45 if (observer->desired_refresh_time() > current_refresh_time)
afakhry54485752015-07-06 17:39:1646 return;
47
48 // Reached here, then this is EITHER (not the first observer to be added AND
49 // it requires a more frequent refresh rate) OR (it's the very first observer
50 // to be added).
51 // Reset the refresh timer.
52 ScheduleRefresh(observer->desired_refresh_time());
53}
54
55void TaskManagerInterface::RemoveObserver(TaskManagerObserver* observer) {
56 observers_.RemoveObserver(observer);
afakhry05015032015-08-14 01:09:5657 observer->observed_task_manager_ = nullptr;
afakhry54485752015-07-06 17:39:1658
59 // Recalculate the minimum refresh rate and the enabled resource flags.
avi664c07b2015-12-26 02:18:3160 int64_t flags = 0;
afakhry54485752015-07-06 17:39:1661 base::TimeDelta min_time = base::TimeDelta::Max();
62 base::ObserverList<TaskManagerObserver>::Iterator itr(&observers_);
afakhry05015032015-08-14 01:09:5663 while (TaskManagerObserver* obs = itr.GetNext()) {
afakhry54485752015-07-06 17:39:1664 if (obs->desired_refresh_time() < min_time)
65 min_time = obs->desired_refresh_time();
66
67 flags |= obs->desired_resources_flags();
68 }
69
70 if (min_time == base::TimeDelta::Max()) {
afakhry05015032015-08-14 01:09:5671 // This is the last observer to be removed. Stop updating.
afakhry54485752015-07-06 17:39:1672 SetEnabledResourceFlags(0);
73 refresh_timer_->Stop();
afakhry05015032015-08-14 01:09:5674 StopUpdating();
afakhry54485752015-07-06 17:39:1675 } else {
76 SetEnabledResourceFlags(flags);
77 ScheduleRefresh(min_time);
78 }
79}
80
afakhry05015032015-08-14 01:09:5681void TaskManagerInterface::RecalculateRefreshFlags() {
avi664c07b2015-12-26 02:18:3182 int64_t flags = 0;
afakhry05015032015-08-14 01:09:5683 base::ObserverList<TaskManagerObserver>::Iterator itr(&observers_);
84 while (TaskManagerObserver* obs = itr.GetNext())
85 flags |= obs->desired_resources_flags();
86
87 SetEnabledResourceFlags(flags);
88}
89
afakhry98241832016-03-11 19:27:4790bool TaskManagerInterface::IsResourceRefreshEnabled(RefreshType type) const {
afakhry54485752015-07-06 17:39:1691 return (enabled_resources_flags_ & type) != 0;
92}
93
94TaskManagerInterface::TaskManagerInterface()
95 : observers_(),
96 refresh_timer_(new base::Timer(true, true)),
97 enabled_resources_flags_(0) {
98}
99
100TaskManagerInterface::~TaskManagerInterface() {
101}
102
103void TaskManagerInterface::NotifyObserversOnTaskAdded(TaskId id) {
104 FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskAdded(id));
105}
106
107void TaskManagerInterface::NotifyObserversOnTaskToBeRemoved(TaskId id) {
108 FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskToBeRemoved(id));
109}
110
111void TaskManagerInterface::NotifyObserversOnRefresh(
112 const TaskIdList& task_ids) {
113 FOR_EACH_OBSERVER(TaskManagerObserver,
114 observers_,
115 OnTasksRefreshed(task_ids));
116}
117
afakhry98241832016-03-11 19:27:47118void TaskManagerInterface::NotifyObserversOnRefreshWithBackgroundCalculations(
119 const TaskIdList& task_ids) {
120 FOR_EACH_OBSERVER(TaskManagerObserver,
121 observers_,
122 OnTasksRefreshedWithBackgroundCalculations(task_ids));
123}
124
125void TaskManagerInterface::NotifyObserversOnTaskUnresponsive(TaskId id) {
126 FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskUnresponsive(id));
127}
128
afakhry54485752015-07-06 17:39:16129base::TimeDelta TaskManagerInterface::GetCurrentRefreshTime() const {
130 return refresh_timer_->IsRunning() ? refresh_timer_->GetCurrentDelay()
131 : base::TimeDelta::Max();
132}
133
avi664c07b2015-12-26 02:18:31134void TaskManagerInterface::ResourceFlagsAdded(int64_t flags) {
afakhry54485752015-07-06 17:39:16135 enabled_resources_flags_ |= flags;
136}
137
avi664c07b2015-12-26 02:18:31138void TaskManagerInterface::SetEnabledResourceFlags(int64_t flags) {
afakhry54485752015-07-06 17:39:16139 enabled_resources_flags_ = flags;
140}
141
142void TaskManagerInterface::ScheduleRefresh(base::TimeDelta refresh_time) {
143 refresh_timer_->Start(FROM_HERE,
144 refresh_time,
145 base::Bind(&TaskManagerInterface::Refresh,
146 base::Unretained(this)));
147}
148
149} // namespace task_management