OLD | NEW |
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 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ | 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ |
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ | 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 virtual ~TimeDomain(); | 55 virtual ~TimeDomain(); |
56 | 56 |
57 // Returns a LazyNow that evaluate this TimeDomain's Now. Can be called from | 57 // Returns a LazyNow that evaluate this TimeDomain's Now. Can be called from |
58 // any thread. | 58 // any thread. |
59 // TODO(alexclarke): Make this main thread only. | 59 // TODO(alexclarke): Make this main thread only. |
60 virtual LazyNow CreateLazyNow() const = 0; | 60 virtual LazyNow CreateLazyNow() const = 0; |
61 | 61 |
62 // Evaluate this TimeDomain's Now. Can be called from any thread. | 62 // Evaluate this TimeDomain's Now. Can be called from any thread. |
63 virtual base::TimeTicks Now() const = 0; | 63 virtual base::TimeTicks Now() const = 0; |
64 | 64 |
65 // Some TimeDomains support virtual time, this method tells us to advance time | 65 // Computes the delay until the next task the TimeDomain is aware of, if any. |
66 // if possible and return true if time was advanced. | 66 // Note virtual time domains may return base::TimeDelta() if they have any |
67 virtual bool MaybeAdvanceTime() = 0; | 67 // tasks that are eligible to run. |
| 68 virtual base::Optional<base::TimeDelta> DelayTillNextTask( |
| 69 LazyNow* lazy_now) = 0; |
68 | 70 |
69 // Returns the name of this time domain for tracing. | 71 // Returns the name of this time domain for tracing. |
70 virtual const char* GetName() const = 0; | 72 virtual const char* GetName() const = 0; |
71 | 73 |
72 // If there is a scheduled delayed task, |out_time| is set to the scheduled | 74 // If there is a scheduled delayed task, |out_time| is set to the scheduled |
73 // runtime for the next one and it returns true. Returns false otherwise. | 75 // runtime for the next one and it returns true. Returns false otherwise. |
74 bool NextScheduledRunTime(base::TimeTicks* out_time) const; | 76 bool NextScheduledRunTime(base::TimeTicks* out_time) const; |
75 | 77 |
76 protected: | 78 protected: |
77 friend class internal::TaskQueueImpl; | 79 friend class internal::TaskQueueImpl; |
78 friend class TaskQueueManager; | 80 friend class TaskQueueManager; |
79 | 81 |
80 void AsValueInto(base::trace_event::TracedValue* state) const; | 82 void AsValueInto(base::trace_event::TracedValue* state) const; |
81 | 83 |
82 // Migrates |queue| from this time domain to |destination_time_domain|. | 84 // Migrates |queue| from this time domain to |destination_time_domain|. |
83 // Main-thread only. | 85 // Main-thread only. Returns the time of the scheduled wakeup if any, |
84 void MigrateQueue(internal::TaskQueueImpl* queue, | 86 base::TimeTicks MigrateQueue(internal::TaskQueueImpl* queue, |
85 TimeDomain* destination_time_domain); | 87 TimeDomain* destination_time_domain); |
86 | 88 |
87 // If there is a scheduled delayed task, |out_task_queue| is set to the queue | 89 // If there is a scheduled delayed task, |out_task_queue| is set to the queue |
88 // the next task was posted to and it returns true. Returns false otherwise. | 90 // the next task was posted to and it returns true. Returns false otherwise. |
89 bool NextScheduledTaskQueue(TaskQueue** out_task_queue) const; | 91 bool NextScheduledTaskQueue(TaskQueue** out_task_queue) const; |
90 | 92 |
91 // Adds |queue| to the set of task queues that UpdateWorkQueues calls | |
92 // UpdateWorkQueue on. | |
93 void RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue); | |
94 | |
95 // Schedules a call to TaskQueueImpl::WakeUpForDelayedWork when this | 93 // Schedules a call to TaskQueueImpl::WakeUpForDelayedWork when this |
96 // TimeDomain reaches |delayed_run_time|. This supersedes any previously | 94 // TimeDomain reaches |delayed_run_time|. This supersedes any previously |
97 // registered wakeup for |queue|. | 95 // registered wakeup for |queue|. |
98 void ScheduleDelayedWork(internal::TaskQueueImpl* queue, | 96 void ScheduleDelayedWork(internal::TaskQueueImpl* queue, |
99 base::TimeTicks delayed_run_time, | 97 base::TimeTicks delayed_run_time, |
100 base::TimeTicks now); | 98 base::TimeTicks now); |
101 | 99 |
| 100 // Cancels any scheduled calls to TaskQueueImpl::WakeUpForDelayedWork for |
| 101 // |queue|. |
| 102 void CancelDelayedWork(internal::TaskQueueImpl* queue); |
| 103 |
102 // Registers the |queue|. | 104 // Registers the |queue|. |
103 void RegisterQueue(internal::TaskQueueImpl* queue); | 105 void RegisterQueue(internal::TaskQueueImpl* queue); |
104 | 106 |
105 // Removes |queue| from the set of task queues that UpdateWorkQueues calls | |
106 // UpdateWorkQueue on. Returns true if |queue| was updatable. | |
107 bool UnregisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue); | |
108 | |
109 // Removes |queue| from all internal data structures. | 107 // Removes |queue| from all internal data structures. |
110 void UnregisterQueue(internal::TaskQueueImpl* queue); | 108 void UnregisterQueue(internal::TaskQueueImpl* queue); |
111 | 109 |
112 // Updates active queues associated with this TimeDomain. | 110 // Tells the time domain that |queue| went from having no immediate work to |
113 void UpdateWorkQueues(LazyNow lazy_now); | 111 // having some. |
| 112 void OnQueueHasImmediateWork(internal::TaskQueueImpl* queue); |
114 | 113 |
115 // Called by the TaskQueueManager when the TimeDomain is registered. | 114 // Called by the TaskQueueManager when the TimeDomain is registered. |
116 virtual void OnRegisterWithTaskQueueManager( | 115 virtual void OnRegisterWithTaskQueueManager( |
117 TaskQueueManager* task_queue_manager) = 0; | 116 TaskQueueManager* task_queue_manager) = 0; |
118 | 117 |
119 // The implementaion will secedule task processing to run with |delay| with | 118 // The implementaion will secedule task processing to run with |delay| with |
120 // respect to the TimeDomain's time source. Always called on the main thread. | 119 // respect to the TimeDomain's time source. Always called on the main thread. |
121 // NOTE this is only called by ScheduleDelayedWork if the scheduled runtime | 120 // NOTE this is only called by ScheduleDelayedWork if the scheduled runtime |
122 // is sooner than any previously sheduled work or if there is no other | 121 // is sooner than any previously sheduled work or if there is no other |
123 // scheduled work. | 122 // scheduled work. |
124 virtual void RequestWakeup(base::TimeTicks now, base::TimeDelta delay) = 0; | 123 virtual void RequestWakeup(base::TimeTicks now, base::TimeDelta delay) = 0; |
125 | 124 |
126 // For implementation specific tracing. | 125 // For implementation specific tracing. |
127 virtual void AsValueIntoInternal( | 126 virtual void AsValueIntoInternal( |
128 base::trace_event::TracedValue* state) const = 0; | 127 base::trace_event::TracedValue* state) const = 0; |
129 | 128 |
130 // Call TaskQueueImpl::UpdateDelayedWorkQueue for each queue where the delay | 129 // Call TaskQueueImpl::UpdateDelayedWorkQueue for each queue where the delay |
131 // has elapsed. | 130 // has elapsed. |
132 void WakeupReadyDelayedQueues(LazyNow* lazy_now); | 131 void WakeupReadyDelayedQueues(LazyNow* lazy_now); |
133 | 132 |
134 size_t NumberOfScheduledWakeups() const { | 133 size_t NumberOfScheduledWakeups() const { |
135 return delayed_wakeup_queue_.size(); | 134 return delayed_wakeup_queue_.size(); |
136 } | 135 } |
137 | 136 |
138 private: | 137 private: |
139 void MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); | |
140 | |
141 struct DelayedWakeup { | 138 struct DelayedWakeup { |
142 base::TimeTicks time; | 139 base::TimeTicks time; |
143 internal::TaskQueueImpl* queue; | 140 internal::TaskQueueImpl* queue; |
144 | 141 |
145 bool operator<=(const DelayedWakeup& other) const { | 142 bool operator<=(const DelayedWakeup& other) const { |
146 if (time == other.time) | 143 if (time == other.time) |
147 return queue <= other.queue; | 144 return queue <= other.queue; |
148 return time < other.time; | 145 return time < other.time; |
149 } | 146 } |
150 | 147 |
151 void SetHeapHandle(HeapHandle handle) { | 148 void SetHeapHandle(HeapHandle handle) { |
152 DCHECK(handle.IsValid()); | 149 DCHECK(handle.IsValid()); |
153 queue->set_heap_handle(handle); | 150 queue->set_heap_handle(handle); |
154 } | 151 } |
155 | 152 |
156 void ClearHeapHandle() { | 153 void ClearHeapHandle() { |
157 DCHECK(queue->heap_handle().IsValid()); | 154 DCHECK(queue->heap_handle().IsValid()); |
158 queue->set_heap_handle(HeapHandle()); | 155 queue->set_heap_handle(HeapHandle()); |
159 | 156 |
160 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks()); | 157 DCHECK_NE(queue->scheduled_time_domain_wakeup(), base::TimeTicks()); |
161 queue->set_scheduled_time_domain_wakeup(base::TimeTicks()); | 158 queue->set_scheduled_time_domain_wakeup(base::TimeTicks()); |
162 } | 159 } |
163 }; | 160 }; |
164 | 161 |
165 IntrusiveHeap<DelayedWakeup> delayed_wakeup_queue_; | 162 IntrusiveHeap<DelayedWakeup> delayed_wakeup_queue_; |
166 | 163 |
167 // This lock guards only |newly_updatable_|. It's not expected to be heavily | 164 Observer* const observer_; // NOT OWNED. |
168 // contended. | |
169 base::Lock newly_updatable_lock_; | |
170 std::vector<internal::TaskQueueImpl*> newly_updatable_; | |
171 | |
172 // Set of task queues with avaliable work on the incoming queue. This should | |
173 // only be accessed from the main thread. | |
174 std::set<internal::TaskQueueImpl*> updatable_queue_set_; | |
175 | |
176 Observer* observer_; // NOT OWNED. | |
177 | 165 |
178 base::ThreadChecker main_thread_checker_; | 166 base::ThreadChecker main_thread_checker_; |
179 | 167 |
180 DISALLOW_COPY_AND_ASSIGN(TimeDomain); | 168 DISALLOW_COPY_AND_ASSIGN(TimeDomain); |
181 }; | 169 }; |
182 | 170 |
183 } // namespace scheduler | 171 } // namespace scheduler |
184 } // namespace blink | 172 } // namespace blink |
185 | 173 |
186 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ | 174 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TIME_DOMAIN_H_ |
OLD | NEW |