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

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

Issue 2583333002: Revert of Dont post delayed DoWork for disabled queues. (Closed)
Patch Set: Created 4 years 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 // If no wakeup has been requested then bail out. 47 // If no wakeup has been requested then bail out.
48 if (!queue->heap_handle().IsValid()) 48 if (!queue->heap_handle().IsValid())
49 return; 49 return;
50 50
51 base::TimeTicks wake_up_time = queue->scheduled_time_domain_wakeup(); 51 base::TimeTicks wake_up_time = queue->scheduled_time_domain_wakeup();
52 DCHECK_NE(wake_up_time, base::TimeTicks()); 52 DCHECK_NE(wake_up_time, base::TimeTicks());
53 53
54 // O(log n) 54 // O(log n)
55 delayed_wakeup_queue_.erase(queue->heap_handle()); 55 delayed_wakeup_queue_.erase(queue->heap_handle());
56 56
57 LazyNow destination_lazy_now = destination_time_domain->CreateLazyNow(); 57 base::TimeTicks destination_now = destination_time_domain->Now();
58 destination_time_domain->ScheduleDelayedWork(queue, wake_up_time, 58 destination_time_domain->ScheduleDelayedWork(queue, wake_up_time,
59 &destination_lazy_now); 59 destination_now);
60 } 60 }
61 61
62 void TimeDomain::ScheduleDelayedWork(internal::TaskQueueImpl* queue, 62 void TimeDomain::ScheduleDelayedWork(internal::TaskQueueImpl* queue,
63 base::TimeTicks delayed_run_time, 63 base::TimeTicks delayed_run_time,
64 LazyNow* lazy_now) { 64 base::TimeTicks now) {
65 DCHECK(main_thread_checker_.CalledOnValidThread()); 65 DCHECK(main_thread_checker_.CalledOnValidThread());
66 // We only want to store a single wakeup per queue, so we need to remove any 66 // We only want to store a single wakeup per queue, so we need to remove any
67 // previously registered wake up for |queue|. 67 // previously registered wake up for |queue|.
68 if (queue->heap_handle().IsValid()) { 68 if (queue->heap_handle().IsValid()) {
69 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks()); 69 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks());
70 70
71 // O(log n) 71 // O(log n)
72 delayed_wakeup_queue_.ChangeKey(queue->heap_handle(), 72 delayed_wakeup_queue_.ChangeKey(queue->heap_handle(),
73 {delayed_run_time, queue}); 73 {delayed_run_time, queue});
74 } else { 74 } else {
75 // O(log n) 75 // O(log n)
76 delayed_wakeup_queue_.insert({delayed_run_time, queue}); 76 delayed_wakeup_queue_.insert({delayed_run_time, queue});
77 } 77 }
78 78
79 queue->set_scheduled_time_domain_wakeup(delayed_run_time); 79 queue->set_scheduled_time_domain_wakeup(delayed_run_time);
80 80
81 // If |queue| is the first wakeup then request the wakeup. 81 // If |queue| is the first wakeup then request the wakeup.
82 if (delayed_wakeup_queue_.min().queue == queue) 82 if (delayed_wakeup_queue_.min().queue == queue) {
83 RequestWakeupAt(lazy_now, delayed_run_time); 83 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now);
84 RequestWakeup(now, delay);
85 }
84 86
85 if (observer_) 87 if (observer_)
86 observer_->OnTimeDomainHasDelayedWork(queue); 88 observer_->OnTimeDomainHasDelayedWork(queue);
87 } 89 }
88 90
89 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue) {
90 if (!queue->heap_handle().IsValid())
91 return;
92
93 DCHECK(!delayed_wakeup_queue_.empty());
94 base::TimeTicks prev_first_wakeup = delayed_wakeup_queue_.min().time;
95
96 // O(log n)
97 delayed_wakeup_queue_.erase(queue->heap_handle());
98
99 if (delayed_wakeup_queue_.empty()) {
100 CancelWakeupAt(prev_first_wakeup);
101 } else if (prev_first_wakeup != delayed_wakeup_queue_.min().time) {
102 LazyNow lazy_now = CreateLazyNow();
103 CancelWakeupAt(prev_first_wakeup);
104 RequestWakeupAt(&lazy_now, delayed_wakeup_queue_.min().time);
105 }
106 }
107
108 void TimeDomain::OnQueueHasImmediateWork(internal::TaskQueueImpl* queue) { 91 void TimeDomain::OnQueueHasImmediateWork(internal::TaskQueueImpl* queue) {
109 if (observer_) 92 if (observer_)
110 observer_->OnTimeDomainHasImmediateWork(queue); 93 observer_->OnTimeDomainHasImmediateWork(queue);
111 } 94 }
112 95
113 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { 96 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) {
114 DCHECK(main_thread_checker_.CalledOnValidThread()); 97 DCHECK(main_thread_checker_.CalledOnValidThread());
115 // Wake up any queues with pending delayed work. Note std::multipmap stores 98 // Wake up any queues with pending delayed work. Note std::multipmap stores
116 // the elements sorted by key, so the begin() iterator points to the earliest 99 // the elements sorted by key, so the begin() iterator points to the earliest
117 // queue to wakeup. 100 // queue to wakeup.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 if (!delayed_wakeup_queue_.empty()) { 141 if (!delayed_wakeup_queue_.empty()) {
159 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now(); 142 base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now();
160 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); 143 state->SetDouble("next_delay_ms", delay.InMillisecondsF());
161 } 144 }
162 AsValueIntoInternal(state); 145 AsValueIntoInternal(state);
163 state->EndDictionary(); 146 state->EndDictionary();
164 } 147 }
165 148
166 } // namespace scheduler 149 } // namespace scheduler
167 } // namespace blink 150 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698