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

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

Issue 2808843003: [scheduler] Change TaskQueue observer call mechanism. (Closed)
Patch Set: Fix compilation Created 3 years, 7 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 23 matching lines...) Expand all
34 void TimeDomain::ScheduleDelayedWork( 34 void TimeDomain::ScheduleDelayedWork(
35 internal::TaskQueueImpl* queue, 35 internal::TaskQueueImpl* queue,
36 internal::TaskQueueImpl::DelayedWakeUp wake_up, 36 internal::TaskQueueImpl::DelayedWakeUp wake_up,
37 base::TimeTicks now) { 37 base::TimeTicks now) {
38 DCHECK(main_thread_checker_.CalledOnValidThread()); 38 DCHECK(main_thread_checker_.CalledOnValidThread());
39 DCHECK_EQ(queue->GetTimeDomain(), this); 39 DCHECK_EQ(queue->GetTimeDomain(), this);
40 DCHECK(queue->IsQueueEnabled()); 40 DCHECK(queue->IsQueueEnabled());
41 // We only want to store a single wake-up per queue, so we need to remove any 41 // We only want to store a single wake-up per queue, so we need to remove any
42 // previously registered wake up for |queue|. 42 // previously registered wake up for |queue|.
43 if (queue->heap_handle().IsValid()) { 43 if (queue->heap_handle().IsValid()) {
44 DCHECK_NE(queue->scheduled_time_domain_wake_up(), base::TimeTicks()); 44 DCHECK(queue->scheduled_time_domain_wake_up());
45 45
46 // O(log n) 46 // O(log n)
47 delayed_wake_up_queue_.ChangeKey(queue->heap_handle(), {wake_up, queue}); 47 delayed_wake_up_queue_.ChangeKey(queue->heap_handle(), {wake_up, queue});
48 } else { 48 } else {
49 // O(log n) 49 // O(log n)
50 delayed_wake_up_queue_.insert({wake_up, queue}); 50 delayed_wake_up_queue_.insert({wake_up, queue});
51 } 51 }
52 52
53 queue->set_scheduled_time_domain_wake_up(wake_up.time); 53 queue->SetScheduledTimeDomainWakeUp(wake_up.time);
54 54
55 // If |queue| is the first wake-up then request the wake-up. 55 // If |queue| is the first wake-up then request the wake-up.
56 if (delayed_wake_up_queue_.Min().queue == queue) 56 if (delayed_wake_up_queue_.Min().queue == queue)
57 RequestWakeUpAt(now, wake_up.time); 57 RequestWakeUpAt(now, wake_up.time);
58 } 58 }
59 59
60 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) { 60 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) {
61 DCHECK(main_thread_checker_.CalledOnValidThread()); 61 DCHECK(main_thread_checker_.CalledOnValidThread());
62 DCHECK_EQ(queue->GetTimeDomain(), this); 62 DCHECK_EQ(queue->GetTimeDomain(), this);
63 63
64 // If no wake-up has been requested then bail out. 64 // If no wake-up has been requested then bail out.
65 if (!queue->heap_handle().IsValid()) 65 if (!queue->heap_handle().IsValid())
66 return; 66 return;
67 67
68 DCHECK_NE(queue->scheduled_time_domain_wake_up(), base::TimeTicks()); 68 DCHECK(queue->scheduled_time_domain_wake_up());
69 DCHECK(!delayed_wake_up_queue_.empty()); 69 DCHECK(!delayed_wake_up_queue_.empty());
70 base::TimeTicks prev_first_wake_up = 70 base::TimeTicks prev_first_wake_up =
71 delayed_wake_up_queue_.Min().wake_up.time; 71 delayed_wake_up_queue_.Min().wake_up.time;
72 72
73 // O(log n) 73 // O(log n)
74 delayed_wake_up_queue_.erase(queue->heap_handle()); 74 delayed_wake_up_queue_.erase(queue->heap_handle());
75 75
76 if (delayed_wake_up_queue_.empty()) { 76 if (delayed_wake_up_queue_.empty()) {
77 CancelWakeUpAt(prev_first_wake_up); 77 CancelWakeUpAt(prev_first_wake_up);
78 } else if (prev_first_wake_up != delayed_wake_up_queue_.Min().wake_up.time) { 78 } else if (prev_first_wake_up != delayed_wake_up_queue_.Min().wake_up.time) {
79 CancelWakeUpAt(prev_first_wake_up); 79 CancelWakeUpAt(prev_first_wake_up);
80 RequestWakeUpAt(Now(), delayed_wake_up_queue_.Min().wake_up.time); 80 RequestWakeUpAt(Now(), delayed_wake_up_queue_.Min().wake_up.time);
81 } 81 }
82 } 82 }
83 83
84 void TimeDomain::WakeUpReadyDelayedQueues(LazyNow* lazy_now) { 84 void TimeDomain::WakeUpReadyDelayedQueues(LazyNow* lazy_now) {
85 DCHECK(main_thread_checker_.CalledOnValidThread()); 85 DCHECK(main_thread_checker_.CalledOnValidThread());
86 // Wake up any queues with pending delayed work. Note std::multimap stores 86 // Wake up any queues with pending delayed work. Note std::multimap stores
87 // the elements sorted by key, so the begin() iterator points to the earliest 87 // the elements sorted by key, so the begin() iterator points to the earliest
88 // queue to wake-up. 88 // queue to wake-up.
89 while (!delayed_wake_up_queue_.empty() && 89 while (!delayed_wake_up_queue_.empty() &&
90 delayed_wake_up_queue_.Min().wake_up.time <= lazy_now->Now()) { 90 delayed_wake_up_queue_.Min().wake_up.time <= lazy_now->Now()) {
91 internal::TaskQueueImpl* queue = delayed_wake_up_queue_.Min().queue; 91 internal::TaskQueueImpl* queue = delayed_wake_up_queue_.Min().queue;
92 base::Optional<internal::TaskQueueImpl::DelayedWakeUp> next_wake_up = 92 base::Optional<internal::TaskQueueImpl::DelayedWakeUp> next_wake_up =
93 queue->WakeUpForDelayedWork(lazy_now); 93 queue->WakeUpForDelayedWork(lazy_now);
94 94
95 if (next_wake_up) { 95 if (next_wake_up) {
96 // O(log n) 96 // O(log n)
97 delayed_wake_up_queue_.ReplaceMin({*next_wake_up, queue}); 97 delayed_wake_up_queue_.ReplaceMin({*next_wake_up, queue});
98 queue->set_scheduled_time_domain_wake_up(next_wake_up->time); 98 queue->SetScheduledTimeDomainWakeUp(next_wake_up->time);
99 } else { 99 } else {
100 // O(log n) 100 // O(log n)
101 delayed_wake_up_queue_.Pop(); 101 delayed_wake_up_queue_.Pop();
102 DCHECK_EQ(queue->scheduled_time_domain_wake_up(), base::TimeTicks()); 102 DCHECK(!queue->scheduled_time_domain_wake_up());
103 } 103 }
104 } 104 }
105 } 105 }
106 106
107 bool TimeDomain::NextScheduledRunTime(base::TimeTicks* out_time) const { 107 bool TimeDomain::NextScheduledRunTime(base::TimeTicks* out_time) const {
108 DCHECK(main_thread_checker_.CalledOnValidThread()); 108 DCHECK(main_thread_checker_.CalledOnValidThread());
109 if (delayed_wake_up_queue_.empty()) 109 if (delayed_wake_up_queue_.empty())
110 return false; 110 return false;
111 111
112 *out_time = delayed_wake_up_queue_.Min().wake_up.time; 112 *out_time = delayed_wake_up_queue_.Min().wake_up.time;
(...skipping 16 matching lines...) Expand all
129 if (!delayed_wake_up_queue_.empty()) { 129 if (!delayed_wake_up_queue_.empty()) {
130 base::TimeDelta delay = delayed_wake_up_queue_.Min().wake_up.time - Now(); 130 base::TimeDelta delay = delayed_wake_up_queue_.Min().wake_up.time - Now();
131 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); 131 state->SetDouble("next_delay_ms", delay.InMillisecondsF());
132 } 132 }
133 AsValueIntoInternal(state); 133 AsValueIntoInternal(state);
134 state->EndDictionary(); 134 state->EndDictionary();
135 } 135 }
136 136
137 } // namespace scheduler 137 } // namespace scheduler
138 } // namespace blink 138 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698