| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/scheduler/base/task_queue_manager.h" | 5 #include "platform/scheduler/base/task_queue_manager.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 } | 51 } |
| 52 | 52 |
| 53 TaskQueueManager::TaskQueueManager( | 53 TaskQueueManager::TaskQueueManager( |
| 54 scoped_refptr<TaskQueueManagerDelegate> delegate, | 54 scoped_refptr<TaskQueueManagerDelegate> delegate, |
| 55 const char* tracing_category, | 55 const char* tracing_category, |
| 56 const char* disabled_by_default_tracing_category, | 56 const char* disabled_by_default_tracing_category, |
| 57 const char* disabled_by_default_verbose_tracing_category) | 57 const char* disabled_by_default_verbose_tracing_category) |
| 58 : real_time_domain_(new RealTimeDomain(tracing_category)), | 58 : real_time_domain_(new RealTimeDomain(tracing_category)), |
| 59 delegate_(delegate), | 59 delegate_(delegate), |
| 60 task_was_run_on_quiescence_monitored_queue_(false), | 60 task_was_run_on_quiescence_monitored_queue_(false), |
| 61 other_thread_pending_wakeup_(false), | |
| 62 record_task_delay_histograms_(true), | 61 record_task_delay_histograms_(true), |
| 63 work_batch_size_(1), | 62 work_batch_size_(1), |
| 64 task_count_(0), | 63 task_count_(0), |
| 65 tracing_category_(tracing_category), | 64 tracing_category_(tracing_category), |
| 66 disabled_by_default_tracing_category_( | 65 disabled_by_default_tracing_category_( |
| 67 disabled_by_default_tracing_category), | 66 disabled_by_default_tracing_category), |
| 68 disabled_by_default_verbose_tracing_category_( | 67 disabled_by_default_verbose_tracing_category_( |
| 69 disabled_by_default_verbose_tracing_category), | 68 disabled_by_default_verbose_tracing_category), |
| 70 currently_executing_task_queue_(nullptr), | 69 currently_executing_task_queue_(nullptr), |
| 71 observer_(nullptr), | 70 observer_(nullptr), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 94 "TaskQueueManager", this); | 93 "TaskQueueManager", this); |
| 95 | 94 |
| 96 while (!queues_.empty()) | 95 while (!queues_.empty()) |
| 97 (*queues_.begin())->UnregisterTaskQueue(); | 96 (*queues_.begin())->UnregisterTaskQueue(); |
| 98 | 97 |
| 99 selector_.SetTaskQueueSelectorObserver(nullptr); | 98 selector_.SetTaskQueueSelectorObserver(nullptr); |
| 100 | 99 |
| 101 delegate_->RemoveNestingObserver(this); | 100 delegate_->RemoveNestingObserver(this); |
| 102 } | 101 } |
| 103 | 102 |
| 103 TaskQueueManager::AnyThread::AnyThread() : other_thread_pending_wakeup(false) {} |
| 104 |
| 104 void TaskQueueManager::RegisterTimeDomain(TimeDomain* time_domain) { | 105 void TaskQueueManager::RegisterTimeDomain(TimeDomain* time_domain) { |
| 105 time_domains_.insert(time_domain); | 106 time_domains_.insert(time_domain); |
| 106 time_domain->OnRegisterWithTaskQueueManager(this); | 107 time_domain->OnRegisterWithTaskQueueManager(this); |
| 107 } | 108 } |
| 108 | 109 |
| 109 void TaskQueueManager::UnregisterTimeDomain(TimeDomain* time_domain) { | 110 void TaskQueueManager::UnregisterTimeDomain(TimeDomain* time_domain) { |
| 110 time_domains_.erase(time_domain); | 111 time_domains_.erase(time_domain); |
| 111 } | 112 } |
| 112 | 113 |
| 113 scoped_refptr<internal::TaskQueueImpl> TaskQueueManager::NewTaskQueue( | 114 scoped_refptr<internal::TaskQueueImpl> TaskQueueManager::NewTaskQueue( |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 const tracked_objects::Location& from_here) { | 173 const tracked_objects::Location& from_here) { |
| 173 bool on_main_thread = delegate_->BelongsToCurrentThread(); | 174 bool on_main_thread = delegate_->BelongsToCurrentThread(); |
| 174 // De-duplicate DoWork posts. | 175 // De-duplicate DoWork posts. |
| 175 if (on_main_thread) { | 176 if (on_main_thread) { |
| 176 if (!main_thread_pending_wakeups_.insert(base::TimeTicks()).second) { | 177 if (!main_thread_pending_wakeups_.insert(base::TimeTicks()).second) { |
| 177 return; | 178 return; |
| 178 } | 179 } |
| 179 delegate_->PostTask(from_here, from_main_thread_immediate_do_work_closure_); | 180 delegate_->PostTask(from_here, from_main_thread_immediate_do_work_closure_); |
| 180 } else { | 181 } else { |
| 181 { | 182 { |
| 182 base::AutoLock lock(other_thread_lock_); | 183 base::AutoLock lock(any_thread_lock_); |
| 183 if (other_thread_pending_wakeup_) | 184 if (any_thread().other_thread_pending_wakeup) |
| 184 return; | 185 return; |
| 185 other_thread_pending_wakeup_ = true; | 186 any_thread().other_thread_pending_wakeup = true; |
| 186 } | 187 } |
| 187 delegate_->PostTask(from_here, | 188 delegate_->PostTask(from_here, |
| 188 from_other_thread_immediate_do_work_closure_); | 189 from_other_thread_immediate_do_work_closure_); |
| 189 } | 190 } |
| 190 } | 191 } |
| 191 | 192 |
| 192 void TaskQueueManager::MaybeScheduleDelayedWork( | 193 void TaskQueueManager::MaybeScheduleDelayedWork( |
| 193 const tracked_objects::Location& from_here, | 194 const tracked_objects::Location& from_here, |
| 194 base::TimeTicks now, | 195 base::TimeTicks now, |
| 195 base::TimeDelta delay) { | 196 base::TimeDelta delay) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 217 } | 218 } |
| 218 | 219 |
| 219 void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) { | 220 void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) { |
| 220 DCHECK(main_thread_checker_.CalledOnValidThread()); | 221 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 221 TRACE_EVENT1(tracing_category_, "TaskQueueManager::DoWork", | 222 TRACE_EVENT1(tracing_category_, "TaskQueueManager::DoWork", |
| 222 "from_main_thread", from_main_thread); | 223 "from_main_thread", from_main_thread); |
| 223 | 224 |
| 224 if (from_main_thread) { | 225 if (from_main_thread) { |
| 225 main_thread_pending_wakeups_.erase(run_time); | 226 main_thread_pending_wakeups_.erase(run_time); |
| 226 } else { | 227 } else { |
| 227 base::AutoLock lock(other_thread_lock_); | 228 base::AutoLock lock(any_thread_lock_); |
| 228 other_thread_pending_wakeup_ = false; | 229 any_thread().other_thread_pending_wakeup = false; |
| 229 } | 230 } |
| 230 | 231 |
| 231 // Posting a DoWork while a DoWork is running leads to spurious DoWorks. | 232 // Posting a DoWork while a DoWork is running leads to spurious DoWorks. |
| 232 main_thread_pending_wakeups_.insert(base::TimeTicks()); | 233 main_thread_pending_wakeups_.insert(base::TimeTicks()); |
| 233 | 234 |
| 234 if (!delegate_->IsNested()) | 235 if (!delegate_->IsNested()) |
| 235 queues_to_delete_.clear(); | 236 queues_to_delete_.clear(); |
| 236 | 237 |
| 237 LazyNow lazy_now(real_time_domain()->CreateLazyNow()); | 238 LazyNow lazy_now(real_time_domain()->CreateLazyNow()); |
| 238 UpdateWorkQueues(&lazy_now); | 239 UpdateWorkQueues(&lazy_now); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { | 537 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { |
| 537 TimeDomain* time_domain = queue->GetTimeDomain(); | 538 TimeDomain* time_domain = queue->GetTimeDomain(); |
| 538 if (time_domain_now.find(time_domain) == time_domain_now.end()) | 539 if (time_domain_now.find(time_domain) == time_domain_now.end()) |
| 539 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); | 540 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); |
| 540 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); | 541 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); |
| 541 } | 542 } |
| 542 } | 543 } |
| 543 | 544 |
| 544 } // namespace scheduler | 545 } // namespace scheduler |
| 545 } // namespace blink | 546 } // namespace blink |
| OLD | NEW |