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

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

Issue 2572893002: [Reland] Dont post delayed DoWork for disabled queues. (Closed)
Patch Set: TimeDomain::CancelDelayedWork shouldn't send a OnTimeDomainHasDelayedWork notification 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 2015 The Chromium Authors. All rights reserved. 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 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/time_domain.h" 5 #include "platform/scheduler/base/time_domain.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "platform/scheduler/base/task_queue_impl.h" 9 #include "platform/scheduler/base/task_queue_impl.h"
10 #include "platform/scheduler/base/task_queue_manager_delegate.h" 10 #include "platform/scheduler/base/task_queue_manager_delegate.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 delayed_wakeup_queue_.ChangeKey(queue->heap_handle(), 45 delayed_wakeup_queue_.ChangeKey(queue->heap_handle(),
46 {delayed_run_time, queue}); 46 {delayed_run_time, queue});
47 } else { 47 } else {
48 // O(log n) 48 // O(log n)
49 delayed_wakeup_queue_.insert({delayed_run_time, queue}); 49 delayed_wakeup_queue_.insert({delayed_run_time, queue});
50 } 50 }
51 51
52 queue->set_scheduled_time_domain_wakeup(delayed_run_time); 52 queue->set_scheduled_time_domain_wakeup(delayed_run_time);
53 53
54 // If |queue| is the first wakeup then request the wakeup. 54 // If |queue| is the first wakeup then request the wakeup.
55 if (delayed_wakeup_queue_.min().queue == queue) { 55 if (delayed_wakeup_queue_.min().queue == queue)
56 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now); 56 RequestWakeupAt(now, delayed_run_time);
57 RequestWakeup(now, delay);
58 }
59 57
60 if (observer_) 58 if (observer_)
61 observer_->OnTimeDomainHasDelayedWork(queue); 59 observer_->OnTimeDomainHasDelayedWork(queue);
62 } 60 }
63 61
64 void TimeDomain::OnQueueHasImmediateWork(internal::TaskQueueImpl* queue) { 62 void TimeDomain::OnQueueHasImmediateWork(internal::TaskQueueImpl* queue) {
65 if (observer_) 63 if (observer_)
66 observer_->OnTimeDomainHasImmediateWork(queue); 64 observer_->OnTimeDomainHasImmediateWork(queue);
67 } 65 }
68 66
69 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) { 67 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) {
70 DCHECK(main_thread_checker_.CalledOnValidThread()); 68 DCHECK(main_thread_checker_.CalledOnValidThread());
71 DCHECK_EQ(queue->GetTimeDomain(), this); 69 DCHECK_EQ(queue->GetTimeDomain(), this);
72 70
73 // If no wakeup has been requested then bail out. 71 // If no wakeup has been requested then bail out.
74 if (!queue->heap_handle().IsValid()) 72 if (!queue->heap_handle().IsValid())
75 return; 73 return;
76 74
77 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks()); 75 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks());
76 DCHECK(!delayed_wakeup_queue_.empty());
77 base::TimeTicks prev_first_wakeup = delayed_wakeup_queue_.min().time;
78 78
79 // O(log n) 79 // O(log n)
80 delayed_wakeup_queue_.erase(queue->heap_handle()); 80 delayed_wakeup_queue_.erase(queue->heap_handle());
81
82 if (delayed_wakeup_queue_.empty()) {
83 CancelWakeupAt(prev_first_wakeup);
84 } else if (prev_first_wakeup != delayed_wakeup_queue_.min().time) {
85 CancelWakeupAt(prev_first_wakeup);
86 RequestWakeupAt(Now(), delayed_wakeup_queue_.min().time);
87 }
81 } 88 }
82 89
83 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { 90 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) {
84 DCHECK(main_thread_checker_.CalledOnValidThread()); 91 DCHECK(main_thread_checker_.CalledOnValidThread());
85 // Wake up any queues with pending delayed work. Note std::multipmap stores 92 // Wake up any queues with pending delayed work. Note std::multipmap stores
86 // the elements sorted by key, so the begin() iterator points to the earliest 93 // the elements sorted by key, so the begin() iterator points to the earliest
87 // queue to wakeup. 94 // queue to wakeup.
88 while (!delayed_wakeup_queue_.empty() && 95 while (!delayed_wakeup_queue_.empty() &&
89 delayed_wakeup_queue_.min().time <= lazy_now->Now()) { 96 delayed_wakeup_queue_.min().time <= lazy_now->Now()) {
90 internal::TaskQueueImpl* queue = delayed_wakeup_queue_.min().queue; 97 internal::TaskQueueImpl* queue = delayed_wakeup_queue_.min().queue;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 if (!delayed_wakeup_queue_.empty()) { 135 if (!delayed_wakeup_queue_.empty()) {
129 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now(); 136 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now();
130 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); 137 state->SetDouble("next_delay_ms", delay.InMillisecondsF());
131 } 138 }
132 AsValueIntoInternal(state); 139 AsValueIntoInternal(state);
133 state->EndDictionary(); 140 state->EndDictionary();
134 } 141 }
135 142
136 } // namespace scheduler 143 } // namespace scheduler
137 } // namespace blink 144 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698