| 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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 any_thread().immediate_do_work_posted_count++; | 223 any_thread().immediate_do_work_posted_count++; |
| 224 } | 224 } |
| 225 | 225 |
| 226 TRACE_EVENT0(disabled_by_default_tracing_category_, | 226 TRACE_EVENT0(disabled_by_default_tracing_category_, |
| 227 "TaskQueueManager::MaybeScheduleImmediateWorkLocked::PostTask"); | 227 "TaskQueueManager::MaybeScheduleImmediateWorkLocked::PostTask"); |
| 228 delegate_->PostTask(from_here, immediate_do_work_closure_); | 228 delegate_->PostTask(from_here, immediate_do_work_closure_); |
| 229 } | 229 } |
| 230 | 230 |
| 231 void TaskQueueManager::MaybeScheduleDelayedWork( | 231 void TaskQueueManager::MaybeScheduleDelayedWork( |
| 232 const tracked_objects::Location& from_here, | 232 const tracked_objects::Location& from_here, |
| 233 base::TimeTicks now, | 233 LazyNow* lazy_now, |
| 234 base::TimeDelta delay) { | 234 base::TimeTicks run_time) { |
| 235 DCHECK(main_thread_checker_.CalledOnValidThread()); | 235 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 236 DCHECK_GE(delay, base::TimeDelta()); | |
| 237 { | 236 { |
| 238 base::AutoLock lock(any_thread_lock_); | 237 base::AutoLock lock(any_thread_lock_); |
| 239 | 238 |
| 240 // Unless we're nested, don't post a delayed DoWork if there's an immediate | 239 // Unless we're nested, don't post a delayed DoWork if there's an immediate |
| 241 // DoWork in flight or we're inside a DoWork. We can rely on DoWork posting | 240 // DoWork in flight or we're inside a DoWork. We can rely on DoWork posting |
| 242 // a delayed continuation as needed. | 241 // a delayed continuation as needed. |
| 243 if (!any_thread().is_nested && | 242 if (!any_thread().is_nested && |
| 244 (any_thread().immediate_do_work_posted_count > 0 || | 243 (any_thread().immediate_do_work_posted_count > 0 || |
| 245 any_thread().do_work_running_count == 1)) { | 244 any_thread().do_work_running_count == 1)) { |
| 246 return; | 245 return; |
| 247 } | 246 } |
| 248 } | 247 } |
| 249 | 248 |
| 250 // De-duplicate DoWork posts. | 249 // De-duplicate DoWork posts. |
| 251 base::TimeTicks run_time = now + delay; | |
| 252 if (next_scheduled_delayed_do_work_time_ <= run_time && | 250 if (next_scheduled_delayed_do_work_time_ <= run_time && |
| 253 !next_scheduled_delayed_do_work_time_.is_null()) | 251 !next_scheduled_delayed_do_work_time_.is_null()) |
| 254 return; | 252 return; |
| 255 | 253 |
| 254 cancelable_delayed_do_work_closure_.Reset(delayed_do_work_closure_); |
| 255 |
| 256 base::TimeDelta delay = |
| 257 std::max(base::TimeDelta(), run_time - lazy_now->Now()); |
| 258 next_scheduled_delayed_do_work_time_ = lazy_now->Now() + delay; |
| 259 |
| 256 TRACE_EVENT1(disabled_by_default_tracing_category_, | 260 TRACE_EVENT1(disabled_by_default_tracing_category_, |
| 257 "TaskQueueManager::MaybeScheduleDelayedWork::PostDelayedTask", | 261 "TaskQueueManager::MaybeScheduleDelayedWork::PostDelayedTask", |
| 258 "delay_ms", delay.InMillisecondsF()); | 262 "delay_ms", delay.InMillisecondsF()); |
| 259 | 263 |
| 260 cancelable_delayed_do_work_closure_.Reset(delayed_do_work_closure_); | 264 cancelable_delayed_do_work_closure_.Reset(delayed_do_work_closure_); |
| 261 next_scheduled_delayed_do_work_time_ = run_time; | 265 next_scheduled_delayed_do_work_time_ = run_time; |
| 262 delegate_->PostDelayedTask( | 266 delegate_->PostDelayedTask( |
| 263 from_here, cancelable_delayed_do_work_closure_.callback(), delay); | 267 from_here, cancelable_delayed_do_work_closure_.callback(), delay); |
| 264 } | 268 } |
| 265 | 269 |
| 270 void TaskQueueManager::CancelDelayedWork(base::TimeTicks run_time) { |
| 271 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 272 if (next_scheduled_delayed_do_work_time_ != run_time) |
| 273 return; |
| 274 |
| 275 cancelable_delayed_do_work_closure_.Cancel(); |
| 276 next_scheduled_delayed_do_work_time_ = base::TimeTicks(); |
| 277 } |
| 278 |
| 266 void TaskQueueManager::DoWork(bool delayed) { | 279 void TaskQueueManager::DoWork(bool delayed) { |
| 267 DCHECK(main_thread_checker_.CalledOnValidThread()); | 280 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 268 TRACE_EVENT1(tracing_category_, "TaskQueueManager::DoWork", "delayed", | 281 TRACE_EVENT1(tracing_category_, "TaskQueueManager::DoWork", "delayed", |
| 269 delayed); | 282 delayed); |
| 270 | 283 |
| 271 LazyNow lazy_now(real_time_domain()->CreateLazyNow()); | 284 LazyNow lazy_now(real_time_domain()->CreateLazyNow()); |
| 272 bool is_nested = delegate_->IsNested(); | 285 bool is_nested = delegate_->IsNested(); |
| 273 if (!is_nested) | 286 if (!is_nested) |
| 274 queues_to_delete_.clear(); | 287 queues_to_delete_.clear(); |
| 275 | 288 |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { | 704 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { |
| 692 TimeDomain* time_domain = queue->GetTimeDomain(); | 705 TimeDomain* time_domain = queue->GetTimeDomain(); |
| 693 if (time_domain_now.find(time_domain) == time_domain_now.end()) | 706 if (time_domain_now.find(time_domain) == time_domain_now.end()) |
| 694 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); | 707 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); |
| 695 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); | 708 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); |
| 696 } | 709 } |
| 697 } | 710 } |
| 698 | 711 |
| 699 } // namespace scheduler | 712 } // namespace scheduler |
| 700 } // namespace blink | 713 } // namespace blink |
| OLD | NEW |