Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc

Issue 2572893002: [Reland] Dont post delayed DoWork for disabled queues. (Closed)
Patch Set: Rebased Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698