afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 1 | // 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 | |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 7 | #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 | |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 13 | namespace task_management { |
| 14 | |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 15 | // static |
| 16 | TaskManagerInterface* TaskManagerInterface::GetTaskManager() { |
| 17 | DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 18 | |
| 19 | return TaskManagerImpl::GetInstance(); |
| 20 | } |
| 21 | |
| 22 | // static |
| 23 | void TaskManagerInterface::OnRawBytesRead(const net::URLRequest& request, |
sclittle | ce72c48 | 2015-08-24 20:20:59 | [diff] [blame] | 24 | int64_t bytes_read) { |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 25 | 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 | |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 33 | void TaskManagerInterface::AddObserver(TaskManagerObserver* observer) { |
| 34 | observers_.AddObserver(observer); |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 35 | observer->observed_task_manager_ = this; |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 36 | |
| 37 | ResourceFlagsAdded(observer->desired_resources_flags()); |
| 38 | |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 39 | 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) |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 46 | 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 | |
| 55 | void TaskManagerInterface::RemoveObserver(TaskManagerObserver* observer) { |
| 56 | observers_.RemoveObserver(observer); |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 57 | observer->observed_task_manager_ = nullptr; |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 58 | |
| 59 | // Recalculate the minimum refresh rate and the enabled resource flags. |
avi | 664c07b | 2015-12-26 02:18:31 | [diff] [blame] | 60 | int64_t flags = 0; |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 61 | base::TimeDelta min_time = base::TimeDelta::Max(); |
| 62 | base::ObserverList<TaskManagerObserver>::Iterator itr(&observers_); |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 63 | while (TaskManagerObserver* obs = itr.GetNext()) { |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 64 | 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()) { |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 71 | // This is the last observer to be removed. Stop updating. |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 72 | SetEnabledResourceFlags(0); |
| 73 | refresh_timer_->Stop(); |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 74 | StopUpdating(); |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 75 | } else { |
| 76 | SetEnabledResourceFlags(flags); |
| 77 | ScheduleRefresh(min_time); |
| 78 | } |
| 79 | } |
| 80 | |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 81 | void TaskManagerInterface::RecalculateRefreshFlags() { |
avi | 664c07b | 2015-12-26 02:18:31 | [diff] [blame] | 82 | int64_t flags = 0; |
afakhry | 0501503 | 2015-08-14 01:09:56 | [diff] [blame] | 83 | base::ObserverList<TaskManagerObserver>::Iterator itr(&observers_); |
| 84 | while (TaskManagerObserver* obs = itr.GetNext()) |
| 85 | flags |= obs->desired_resources_flags(); |
| 86 | |
| 87 | SetEnabledResourceFlags(flags); |
| 88 | } |
| 89 | |
afakhry | 9824183 | 2016-03-11 19:27:47 | [diff] [blame^] | 90 | bool TaskManagerInterface::IsResourceRefreshEnabled(RefreshType type) const { |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 91 | return (enabled_resources_flags_ & type) != 0; |
| 92 | } |
| 93 | |
| 94 | TaskManagerInterface::TaskManagerInterface() |
| 95 | : observers_(), |
| 96 | refresh_timer_(new base::Timer(true, true)), |
| 97 | enabled_resources_flags_(0) { |
| 98 | } |
| 99 | |
| 100 | TaskManagerInterface::~TaskManagerInterface() { |
| 101 | } |
| 102 | |
| 103 | void TaskManagerInterface::NotifyObserversOnTaskAdded(TaskId id) { |
| 104 | FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskAdded(id)); |
| 105 | } |
| 106 | |
| 107 | void TaskManagerInterface::NotifyObserversOnTaskToBeRemoved(TaskId id) { |
| 108 | FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskToBeRemoved(id)); |
| 109 | } |
| 110 | |
| 111 | void TaskManagerInterface::NotifyObserversOnRefresh( |
| 112 | const TaskIdList& task_ids) { |
| 113 | FOR_EACH_OBSERVER(TaskManagerObserver, |
| 114 | observers_, |
| 115 | OnTasksRefreshed(task_ids)); |
| 116 | } |
| 117 | |
afakhry | 9824183 | 2016-03-11 19:27:47 | [diff] [blame^] | 118 | void TaskManagerInterface::NotifyObserversOnRefreshWithBackgroundCalculations( |
| 119 | const TaskIdList& task_ids) { |
| 120 | FOR_EACH_OBSERVER(TaskManagerObserver, |
| 121 | observers_, |
| 122 | OnTasksRefreshedWithBackgroundCalculations(task_ids)); |
| 123 | } |
| 124 | |
| 125 | void TaskManagerInterface::NotifyObserversOnTaskUnresponsive(TaskId id) { |
| 126 | FOR_EACH_OBSERVER(TaskManagerObserver, observers_, OnTaskUnresponsive(id)); |
| 127 | } |
| 128 | |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 129 | base::TimeDelta TaskManagerInterface::GetCurrentRefreshTime() const { |
| 130 | return refresh_timer_->IsRunning() ? refresh_timer_->GetCurrentDelay() |
| 131 | : base::TimeDelta::Max(); |
| 132 | } |
| 133 | |
avi | 664c07b | 2015-12-26 02:18:31 | [diff] [blame] | 134 | void TaskManagerInterface::ResourceFlagsAdded(int64_t flags) { |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 135 | enabled_resources_flags_ |= flags; |
| 136 | } |
| 137 | |
avi | 664c07b | 2015-12-26 02:18:31 | [diff] [blame] | 138 | void TaskManagerInterface::SetEnabledResourceFlags(int64_t flags) { |
afakhry | 5448575 | 2015-07-06 17:39:16 | [diff] [blame] | 139 | enabled_resources_flags_ = flags; |
| 140 | } |
| 141 | |
| 142 | void 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 |