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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h

Issue 2798563003: [scheduler] Add TaskQueue::Observer (Closed)
Patch Set: Rebased Created 3 years, 8 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 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 // delayed_work_queue. The reason for this is we want to make sure delayed 58 // delayed_work_queue. The reason for this is we want to make sure delayed
59 // tasks (normally the most common type) don't starve out immediate work. 59 // tasks (normally the most common type) don't starve out immediate work.
60 class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { 60 class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue {
61 public: 61 public:
62 TaskQueueImpl(TaskQueueManager* task_queue_manager, 62 TaskQueueImpl(TaskQueueManager* task_queue_manager,
63 TimeDomain* time_domain, 63 TimeDomain* time_domain,
64 const Spec& spec, 64 const Spec& spec,
65 const char* disabled_by_default_tracing_category, 65 const char* disabled_by_default_tracing_category,
66 const char* disabled_by_default_verbose_tracing_category); 66 const char* disabled_by_default_verbose_tracing_category);
67 67
68 // Represents a time at which a task wants to run. Tasks scheduled for the
69 // same point in time will be ordered by their sequence numbers.
70 struct DelayedWakeUp {
71 base::TimeTicks time;
72 int sequence_num;
73
74 bool operator<=(const DelayedWakeUp& other) const {
75 if (time == other.time) {
76 DCHECK_NE(sequence_num, other.sequence_num);
77 return (sequence_num - other.sequence_num) < 0;
78 }
79 return time < other.time;
80 }
81 };
82
68 class BLINK_PLATFORM_EXPORT Task : public base::PendingTask { 83 class BLINK_PLATFORM_EXPORT Task : public base::PendingTask {
69 public: 84 public:
70 Task(); 85 Task();
71 Task(const tracked_objects::Location& posted_from, 86 Task(const tracked_objects::Location& posted_from,
72 base::OnceClosure task, 87 base::OnceClosure task,
73 base::TimeTicks desired_run_time, 88 base::TimeTicks desired_run_time,
74 EnqueueOrder sequence_number, 89 EnqueueOrder sequence_number,
75 bool nestable); 90 bool nestable);
76 91
77 Task(const tracked_objects::Location& posted_from, 92 Task(const tracked_objects::Location& posted_from,
78 base::OnceClosure task, 93 base::OnceClosure task,
79 base::TimeTicks desired_run_time, 94 base::TimeTicks desired_run_time,
80 EnqueueOrder sequence_number, 95 EnqueueOrder sequence_number,
81 bool nestable, 96 bool nestable,
82 EnqueueOrder enqueue_order); 97 EnqueueOrder enqueue_order);
83 98
99 DelayedWakeUp delayed_wake_up() const {
100 return DelayedWakeUp{delayed_run_time, sequence_num};
101 }
102
84 EnqueueOrder enqueue_order() const { 103 EnqueueOrder enqueue_order() const {
85 #ifndef NDEBUG 104 #ifndef NDEBUG
86 DCHECK(enqueue_order_set_); 105 DCHECK(enqueue_order_set_);
87 #endif 106 #endif
88 return enqueue_order_; 107 return enqueue_order_;
89 } 108 }
90 109
91 void set_enqueue_order(EnqueueOrder enqueue_order) { 110 void set_enqueue_order(EnqueueOrder enqueue_order) {
92 #ifndef NDEBUG 111 #ifndef NDEBUG
93 DCHECK(!enqueue_order_set_); 112 DCHECK(!enqueue_order_set_);
(...skipping 11 matching lines...) Expand all
105 bool enqueue_order_set_; 124 bool enqueue_order_set_;
106 #endif 125 #endif
107 // Similar to sequence number, but ultimately the |enqueue_order_| is what 126 // Similar to sequence number, but ultimately the |enqueue_order_| is what
108 // the scheduler uses for task ordering. For immediate tasks |enqueue_order| 127 // the scheduler uses for task ordering. For immediate tasks |enqueue_order|
109 // is set when posted, but for delayed tasks it's not defined until they are 128 // is set when posted, but for delayed tasks it's not defined until they are
110 // enqueued on the |delayed_work_queue_|. This is because otherwise delayed 129 // enqueued on the |delayed_work_queue_|. This is because otherwise delayed
111 // tasks could run before an immediate task posted after the delayed task. 130 // tasks could run before an immediate task posted after the delayed task.
112 EnqueueOrder enqueue_order_; 131 EnqueueOrder enqueue_order_;
113 }; 132 };
114 133
115 // Represents a time at which a task wants to run. Tasks scheduled for the
116 // same point in time will be ordered by their sequence numbers.
117 struct DelayedWakeUp {
118 base::TimeTicks time;
119 int sequence_num;
120
121 bool operator<=(const DelayedWakeUp& other) const {
122 if (time == other.time) {
123 DCHECK_NE(sequence_num, other.sequence_num);
124 return (sequence_num - other.sequence_num) < 0;
125 }
126 return time < other.time;
127 }
128 };
129
130 // TaskQueue implementation. 134 // TaskQueue implementation.
131 void UnregisterTaskQueue() override; 135 void UnregisterTaskQueue() override;
132 bool RunsTasksOnCurrentThread() const override; 136 bool RunsTasksOnCurrentThread() const override;
133 bool PostDelayedTask(const tracked_objects::Location& from_here, 137 bool PostDelayedTask(const tracked_objects::Location& from_here,
134 base::OnceClosure task, 138 base::OnceClosure task,
135 base::TimeDelta delay) override; 139 base::TimeDelta delay) override;
136 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, 140 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
137 base::OnceClosure task, 141 base::OnceClosure task,
138 base::TimeDelta delay) override; 142 base::TimeDelta delay) override;
139 std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() override; 143 std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() override;
140 bool IsQueueEnabled() const override; 144 bool IsQueueEnabled() const override;
141 bool IsEmpty() const override; 145 bool IsEmpty() const override;
142 size_t GetNumberOfPendingTasks() const override; 146 size_t GetNumberOfPendingTasks() const override;
143 bool HasPendingImmediateWork() const override; 147 bool HasPendingImmediateWork() const override;
144 base::Optional<base::TimeTicks> GetNextScheduledWakeUp() override; 148 base::Optional<base::TimeTicks> GetNextScheduledWakeUp() override;
145 void SetQueuePriority(QueuePriority priority) override; 149 void SetQueuePriority(QueuePriority priority) override;
146 QueuePriority GetQueuePriority() const override; 150 QueuePriority GetQueuePriority() const override;
147 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; 151 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override;
148 void RemoveTaskObserver( 152 void RemoveTaskObserver(
149 base::MessageLoop::TaskObserver* task_observer) override; 153 base::MessageLoop::TaskObserver* task_observer) override;
150 void SetTimeDomain(TimeDomain* time_domain) override; 154 void SetTimeDomain(TimeDomain* time_domain) override;
151 TimeDomain* GetTimeDomain() const override; 155 TimeDomain* GetTimeDomain() const override;
152 void SetBlameContext(base::trace_event::BlameContext* blame_context) override; 156 void SetBlameContext(base::trace_event::BlameContext* blame_context) override;
153 void InsertFence(InsertFencePosition position) override; 157 void InsertFence(InsertFencePosition position) override;
154 void RemoveFence() override; 158 void RemoveFence() override;
155 bool BlockedByFence() const override; 159 bool BlockedByFence() const override;
156 const char* GetName() const override; 160 const char* GetName() const override;
157 QueueType GetQueueType() const override; 161 QueueType GetQueueType() const override;
162 void SetObserver(Observer* observer) override;
158 163
159 // Returns true if a (potentially hypothetical) task with the specified 164 // Returns true if a (potentially hypothetical) task with the specified
160 // |enqueue_order| could run on the queue. Must be called from the main 165 // |enqueue_order| could run on the queue. Must be called from the main
161 // thread. 166 // thread.
162 bool CouldTaskRun(EnqueueOrder enqueue_order) const; 167 bool CouldTaskRun(EnqueueOrder enqueue_order) const;
163 168
164 // Must only be called from the thread this task queue was created on. 169 // Must only be called from the thread this task queue was created on.
165 void ReloadImmediateWorkQueueIfEmpty(); 170 void ReloadImmediateWorkQueueIfEmpty();
166 171
167 void AsValueInto(base::trace_event::TracedValue* state) const; 172 void AsValueInto(base::trace_event::TracedValue* state) const;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 247
243 enum class TaskType { 248 enum class TaskType {
244 NORMAL, 249 NORMAL,
245 NON_NESTABLE, 250 NON_NESTABLE,
246 }; 251 };
247 252
248 struct AnyThread { 253 struct AnyThread {
249 AnyThread(TaskQueueManager* task_queue_manager, TimeDomain* time_domain); 254 AnyThread(TaskQueueManager* task_queue_manager, TimeDomain* time_domain);
250 ~AnyThread(); 255 ~AnyThread();
251 256
252 // TaskQueueManager and TimeDomain are maintained in two copies: 257 // TaskQueueManager, TimeDomain and Observer are maintained in two copies:
253 // inside AnyThread and inside MainThreadOnly. They can be changed only from 258 // inside AnyThread and inside MainThreadOnly. They can be changed only from
254 // main thread, so it should be locked before accessing from other threads. 259 // main thread, so it should be locked before accessing from other threads.
255 TaskQueueManager* task_queue_manager; 260 TaskQueueManager* task_queue_manager;
256 TimeDomain* time_domain; 261 TimeDomain* time_domain;
262 Observer* observer;
257 }; 263 };
258 264
259 struct MainThreadOnly { 265 struct MainThreadOnly {
260 MainThreadOnly(TaskQueueManager* task_queue_manager, 266 MainThreadOnly(TaskQueueManager* task_queue_manager,
261 TaskQueueImpl* task_queue, 267 TaskQueueImpl* task_queue,
262 TimeDomain* time_domain); 268 TimeDomain* time_domain);
263 ~MainThreadOnly(); 269 ~MainThreadOnly();
264 270
265 // Another copy of TaskQueueManager and TimeDomain for lock-free access from 271 // Another copy of TaskQueueManager, TimeDomain and Observer
266 // the main thread. See description inside struct AnyThread for details. 272 // for lock-free access from the main thread.
273 // See description inside struct AnyThread for details.
267 TaskQueueManager* task_queue_manager; 274 TaskQueueManager* task_queue_manager;
268 TimeDomain* time_domain; 275 TimeDomain* time_domain;
276 Observer* observer;
269 277
270 std::unique_ptr<WorkQueue> delayed_work_queue; 278 std::unique_ptr<WorkQueue> delayed_work_queue;
271 std::unique_ptr<WorkQueue> immediate_work_queue; 279 std::unique_ptr<WorkQueue> immediate_work_queue;
272 std::priority_queue<Task> delayed_incoming_queue; 280 std::priority_queue<Task> delayed_incoming_queue;
273 base::ObserverList<base::MessageLoop::TaskObserver> task_observers; 281 base::ObserverList<base::MessageLoop::TaskObserver> task_observers;
274 size_t set_index; 282 size_t set_index;
275 HeapHandle heap_handle; 283 HeapHandle heap_handle;
276 int is_enabled_refcount; 284 int is_enabled_refcount;
277 int voter_refcount; 285 int voter_refcount;
278 base::trace_event::BlameContext* blame_context; // Not owned. 286 base::trace_event::BlameContext* blame_context; // Not owned.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 base::trace_event::TracedValue* state); 330 base::trace_event::TracedValue* state);
323 static void QueueAsValueInto(const std::priority_queue<Task>& queue, 331 static void QueueAsValueInto(const std::priority_queue<Task>& queue,
324 base::trace_event::TracedValue* state); 332 base::trace_event::TracedValue* state);
325 static void TaskAsValueInto(const Task& task, 333 static void TaskAsValueInto(const Task& task,
326 base::trace_event::TracedValue* state); 334 base::trace_event::TracedValue* state);
327 335
328 void RemoveQueueEnabledVoter(const QueueEnabledVoterImpl* voter); 336 void RemoveQueueEnabledVoter(const QueueEnabledVoterImpl* voter);
329 void OnQueueEnabledVoteChanged(bool enabled); 337 void OnQueueEnabledVoteChanged(bool enabled);
330 void EnableOrDisableWithSelector(bool enable); 338 void EnableOrDisableWithSelector(bool enable);
331 339
340 // Schedules delayed work on time domain and calls the observer.
341 void ScheduleDelayedWorkInTimeDomain(base::TimeTicks now);
342
343 void NotifyWakeUpChangedOnMainThread(base::TimeTicks wake_up);
344
332 const base::PlatformThreadId thread_id_; 345 const base::PlatformThreadId thread_id_;
333 346
334 mutable base::Lock any_thread_lock_; 347 mutable base::Lock any_thread_lock_;
335 AnyThread any_thread_; 348 AnyThread any_thread_;
336 struct AnyThread& any_thread() { 349 struct AnyThread& any_thread() {
337 any_thread_lock_.AssertAcquired(); 350 any_thread_lock_.AssertAcquired();
338 return any_thread_; 351 return any_thread_;
339 } 352 }
340 const struct AnyThread& any_thread() const { 353 const struct AnyThread& any_thread() const {
341 any_thread_lock_.AssertAcquired(); 354 any_thread_lock_.AssertAcquired();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 const bool should_report_when_execution_blocked_; 387 const bool should_report_when_execution_blocked_;
375 388
376 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); 389 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl);
377 }; 390 };
378 391
379 } // namespace internal 392 } // namespace internal
380 } // namespace scheduler 393 } // namespace scheduler
381 } // namespace blink 394 } // namespace blink
382 395
383 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ 396 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698