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

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

Issue 2653643002: Move has_incoming_immediate_work to the TaskQueueManager (Closed)
Patch Set: Don't try to be quite so clever in TaskQueueManager::ComputeDelayTillNextTask 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 10 matching lines...) Expand all
21 21
22 void TimeDomain::RegisterQueue(internal::TaskQueueImpl* queue) { 22 void TimeDomain::RegisterQueue(internal::TaskQueueImpl* queue) {
23 DCHECK(main_thread_checker_.CalledOnValidThread()); 23 DCHECK(main_thread_checker_.CalledOnValidThread());
24 DCHECK_EQ(queue->GetTimeDomain(), this); 24 DCHECK_EQ(queue->GetTimeDomain(), this);
25 } 25 }
26 26
27 void TimeDomain::UnregisterQueue(internal::TaskQueueImpl* queue) { 27 void TimeDomain::UnregisterQueue(internal::TaskQueueImpl* queue) {
28 DCHECK(main_thread_checker_.CalledOnValidThread()); 28 DCHECK(main_thread_checker_.CalledOnValidThread());
29 DCHECK_EQ(queue->GetTimeDomain(), this); 29 DCHECK_EQ(queue->GetTimeDomain(), this);
30 30
31 {
32 base::AutoLock lock(has_incoming_immediate_work_lock_);
33 has_incoming_immediate_work_.erase(queue);
34 }
35
36 CancelDelayedWork(queue); 31 CancelDelayedWork(queue);
37 } 32 }
38 33
39 void TimeDomain::MigrateQueue(internal::TaskQueueImpl* queue, 34 void TimeDomain::MigrateQueue(internal::TaskQueueImpl* queue,
40 TimeDomain* destination_time_domain) { 35 TimeDomain* destination_time_domain) {
41 DCHECK(main_thread_checker_.CalledOnValidThread()); 36 DCHECK(main_thread_checker_.CalledOnValidThread());
42 DCHECK_EQ(queue->GetTimeDomain(), this); 37 DCHECK_EQ(queue->GetTimeDomain(), this);
43 DCHECK(destination_time_domain); 38 DCHECK(destination_time_domain);
44 39
45 // Make sure we remember to update |queue| if it's got incoming immediate
46 // work.
47 bool has_incoming_immediate_work;
48 {
49 base::AutoLock lock(has_incoming_immediate_work_lock_);
50 has_incoming_immediate_work = has_incoming_immediate_work_.erase(queue);
51 }
52 if (has_incoming_immediate_work) {
53 base::AutoLock lock(
54 destination_time_domain->has_incoming_immediate_work_lock_);
55 destination_time_domain->has_incoming_immediate_work_.insert(queue);
56 }
57
58 // If no wakeup has been requested then bail out. 40 // If no wakeup has been requested then bail out.
59 if (!queue->heap_handle().IsValid()) 41 if (!queue->heap_handle().IsValid())
60 return; 42 return;
61 43
62 base::TimeTicks wake_up_time = queue->scheduled_time_domain_wakeup(); 44 base::TimeTicks wake_up_time = queue->scheduled_time_domain_wakeup();
63 DCHECK_NE(wake_up_time, base::TimeTicks()); 45 DCHECK_NE(wake_up_time, base::TimeTicks());
64 46
65 // O(log n) 47 // O(log n)
66 delayed_wakeup_queue_.erase(queue->heap_handle()); 48 delayed_wakeup_queue_.erase(queue->heap_handle());
67 49
(...skipping 24 matching lines...) Expand all
92 // If |queue| is the first wakeup then request the wakeup. 74 // If |queue| is the first wakeup then request the wakeup.
93 if (delayed_wakeup_queue_.min().queue == queue) { 75 if (delayed_wakeup_queue_.min().queue == queue) {
94 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now); 76 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now);
95 RequestWakeup(now, delay); 77 RequestWakeup(now, delay);
96 } 78 }
97 79
98 if (observer_) 80 if (observer_)
99 observer_->OnTimeDomainHasDelayedWork(queue); 81 observer_->OnTimeDomainHasDelayedWork(queue);
100 } 82 }
101 83
102 void TimeDomain::OnQueueHasIncomingImmediateWork( 84 void TimeDomain::OnQueueHasImmediateWork(internal::TaskQueueImpl* queue) {
103 internal::TaskQueueImpl* queue) {
104 {
105 base::AutoLock lock(has_incoming_immediate_work_lock_);
106 has_incoming_immediate_work_.insert(queue);
107 }
108
109 if (observer_) 85 if (observer_)
110 observer_->OnTimeDomainHasImmediateWork(queue); 86 observer_->OnTimeDomainHasImmediateWork(queue);
111 } 87 }
112 88
113 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) { 89 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) {
114 DCHECK(main_thread_checker_.CalledOnValidThread()); 90 DCHECK(main_thread_checker_.CalledOnValidThread());
115 DCHECK_EQ(queue->GetTimeDomain(), this); 91 DCHECK_EQ(queue->GetTimeDomain(), this);
116 92
117 // If no wakeup has been requested then bail out. 93 // If no wakeup has been requested then bail out.
118 if (!queue->heap_handle().IsValid()) 94 if (!queue->heap_handle().IsValid())
119 return; 95 return;
120 96
121 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks()); 97 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks());
122 98
123 // O(log n) 99 // O(log n)
124 delayed_wakeup_queue_.erase(queue->heap_handle()); 100 delayed_wakeup_queue_.erase(queue->heap_handle());
125 } 101 }
126 102
127 void TimeDomain::UpdateWorkQueues(LazyNow* lazy_now) {
128 DCHECK(main_thread_checker_.CalledOnValidThread());
129
130 // Move any ready delayed tasks into the Incoming queues.
131 WakeupReadyDelayedQueues(lazy_now);
132
133 std::set<internal::TaskQueueImpl*> queues_to_reload_if_empty;
134
135 {
136 base::AutoLock lock(has_incoming_immediate_work_lock_);
137 std::swap(queues_to_reload_if_empty, has_incoming_immediate_work_);
138 }
139
140 for (internal::TaskQueueImpl* queue : queues_to_reload_if_empty)
141 queue->ReloadImmediateWorkQueueIfEmpty();
142 }
143
144 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { 103 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) {
145 DCHECK(main_thread_checker_.CalledOnValidThread()); 104 DCHECK(main_thread_checker_.CalledOnValidThread());
146 // Wake up any queues with pending delayed work. Note std::multipmap stores 105 // Wake up any queues with pending delayed work. Note std::multipmap stores
147 // the elements sorted by key, so the begin() iterator points to the earliest 106 // the elements sorted by key, so the begin() iterator points to the earliest
148 // queue to wakeup. 107 // queue to wakeup.
149 while (!delayed_wakeup_queue_.empty() && 108 while (!delayed_wakeup_queue_.empty() &&
150 delayed_wakeup_queue_.min().time <= lazy_now->Now()) { 109 delayed_wakeup_queue_.min().time <= lazy_now->Now()) {
151 internal::TaskQueueImpl* queue = delayed_wakeup_queue_.min().queue; 110 internal::TaskQueueImpl* queue = delayed_wakeup_queue_.min().queue;
152 base::Optional<base::TimeTicks> next_wakeup = 111 base::Optional<base::TimeTicks> next_wakeup =
153 queue->WakeUpForDelayedWork(lazy_now); 112 queue->WakeUpForDelayedWork(lazy_now);
(...skipping 24 matching lines...) Expand all
178 if (delayed_wakeup_queue_.empty()) 137 if (delayed_wakeup_queue_.empty())
179 return false; 138 return false;
180 139
181 *out_task_queue = delayed_wakeup_queue_.min().queue; 140 *out_task_queue = delayed_wakeup_queue_.min().queue;
182 return true; 141 return true;
183 } 142 }
184 143
185 void TimeDomain::AsValueInto(base::trace_event::TracedValue* state) const { 144 void TimeDomain::AsValueInto(base::trace_event::TracedValue* state) const {
186 state->BeginDictionary(); 145 state->BeginDictionary();
187 state->SetString("name", GetName()); 146 state->SetString("name", GetName());
188 {
189 base::AutoLock lock(has_incoming_immediate_work_lock_);
190 state->BeginArray("has_incoming_immediate_work");
191 for (internal::TaskQueueImpl* queue : has_incoming_immediate_work_)
192 state->AppendString(queue->GetName());
193 state->EndArray();
194 }
195 state->SetInteger("registered_delay_count", delayed_wakeup_queue_.size()); 147 state->SetInteger("registered_delay_count", delayed_wakeup_queue_.size());
196 if (!delayed_wakeup_queue_.empty()) { 148 if (!delayed_wakeup_queue_.empty()) {
197 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now(); 149 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now();
198 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); 150 state->SetDouble("next_delay_ms", delay.InMillisecondsF());
199 } 151 }
200 AsValueIntoInternal(state); 152 AsValueIntoInternal(state);
201 state->EndDictionary(); 153 state->EndDictionary();
202 } 154 }
203 155
204 } // namespace scheduler 156 } // namespace scheduler
205 } // namespace blink 157 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698