Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h |
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h |
index a50de1563f30f67241260e9d44d8430e1359fb42..e4297d792055175de6cae75118420e594a0c7faf 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h |
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h |
@@ -46,7 +46,7 @@ class WorkQueueSets; |
// immediate_work_queue is swapped with immediate_incoming_queue when |
// immediate_work_queue becomes empty. |
// |
-// Delayed tasks are initially posted to delayed_incoming_queue and a wakeup |
+// Delayed tasks are initially posted to delayed_incoming_queue and a wake-up |
// is scheduled with the TimeDomain. When the delay has elapsed, the TimeDomain |
// calls UpdateDelayedWorkQueue and ready delayed tasks are moved into the |
// delayed_work_queue. Note the EnqueueOrder (used for ordering) for a delayed |
@@ -65,6 +65,21 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
const char* disabled_by_default_tracing_category, |
const char* disabled_by_default_verbose_tracing_category); |
+ // Represents a time at which a task wants to run. Tasks scheduled for the |
+ // same point in time will be ordered by their sequence numbers. |
+ struct DelayedWakeUp { |
+ base::TimeTicks time; |
+ int sequence_num; |
+ |
+ bool operator<=(const DelayedWakeUp& other) const { |
+ if (time == other.time) { |
+ DCHECK_NE(sequence_num, other.sequence_num); |
+ return (sequence_num - other.sequence_num) < 0; |
+ } |
+ return time < other.time; |
+ } |
+ }; |
+ |
class BLINK_PLATFORM_EXPORT Task : public base::PendingTask { |
public: |
Task(); |
@@ -81,6 +96,10 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
bool nestable, |
EnqueueOrder enqueue_order); |
+ DelayedWakeUp delayed_wake_up() const { |
+ return DelayedWakeUp{delayed_run_time, sequence_num}; |
+ } |
+ |
EnqueueOrder enqueue_order() const { |
#ifndef NDEBUG |
DCHECK(enqueue_order_set_); |
@@ -112,21 +131,6 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
EnqueueOrder enqueue_order_; |
}; |
- // Represents a time at which a task wants to run. Tasks scheduled for the |
- // same point in time will be ordered by their sequence numbers. |
- struct DelayedWakeUp { |
- base::TimeTicks time; |
- int sequence_num; |
- |
- bool operator<=(const DelayedWakeUp& other) const { |
- if (time == other.time) { |
- DCHECK_NE(sequence_num, other.sequence_num); |
- return (sequence_num - other.sequence_num) < 0; |
- } |
- return time < other.time; |
- } |
- }; |
- |
// TaskQueue implementation. |
void UnregisterTaskQueue() override; |
bool RunsTasksOnCurrentThread() const override; |
@@ -155,6 +159,7 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
bool BlockedByFence() const override; |
const char* GetName() const override; |
QueueType GetQueueType() const override; |
+ void SetObserver(Observer* observer) override; |
// Returns true if a (potentially hypothetical) task with the specified |
// |enqueue_order| could run on the queue. Must be called from the main |
@@ -193,18 +198,18 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
} |
// Enqueues any delayed tasks which should be run now on the |
- // |delayed_work_queue|. Returns the subsequent wakeup that is required, if |
+ // |delayed_work_queue|. Returns the subsequent wake-up that is required, if |
// any. Must be called from the main thread. |
base::Optional<DelayedWakeUp> WakeUpForDelayedWork(LazyNow* lazy_now); |
- base::TimeTicks scheduled_time_domain_wakeup() const { |
- return main_thread_only().scheduled_time_domain_wakeup; |
+ base::TimeTicks scheduled_time_domain_wake_up() const { |
+ return main_thread_only().scheduled_time_domain_wake_up; |
} |
- void set_scheduled_time_domain_wakeup( |
- base::TimeTicks scheduled_time_domain_wakeup) { |
- main_thread_only().scheduled_time_domain_wakeup = |
- scheduled_time_domain_wakeup; |
+ void set_scheduled_time_domain_wake_up( |
+ base::TimeTicks scheduled_time_domain_wake_up) { |
+ main_thread_only().scheduled_time_domain_wake_up = |
+ scheduled_time_domain_wake_up; |
} |
HeapHandle heap_handle() const { return main_thread_only().heap_handle; } |
@@ -249,11 +254,12 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
AnyThread(TaskQueueManager* task_queue_manager, TimeDomain* time_domain); |
~AnyThread(); |
- // TaskQueueManager and TimeDomain are maintained in two copies: |
+ // TaskQueueManager, TimeDomain and Observer are maintained in two copies: |
// inside AnyThread and inside MainThreadOnly. They can be changed only from |
// main thread, so it should be locked before accessing from other threads. |
TaskQueueManager* task_queue_manager; |
TimeDomain* time_domain; |
+ Observer* observer; |
}; |
struct MainThreadOnly { |
@@ -262,10 +268,12 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
TimeDomain* time_domain); |
~MainThreadOnly(); |
- // Another copy of TaskQueueManager and TimeDomain for lock-free access from |
- // the main thread. See description inside struct AnyThread for details. |
+ // Another copy of TaskQueueManager, TimeDomain and Observer |
+ // for lock-free access from the main thread. |
+ // See description inside struct AnyThread for details. |
TaskQueueManager* task_queue_manager; |
TimeDomain* time_domain; |
+ Observer* observer; |
std::unique_ptr<WorkQueue> delayed_work_queue; |
std::unique_ptr<WorkQueue> immediate_work_queue; |
@@ -277,7 +285,7 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
int voter_refcount; |
base::trace_event::BlameContext* blame_context; // Not owned. |
EnqueueOrder current_fence; |
- base::TimeTicks scheduled_time_domain_wakeup; |
+ base::TimeTicks scheduled_time_domain_wake_up; |
}; |
~TaskQueueImpl() override; |
@@ -329,6 +337,11 @@ class BLINK_PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue { |
void OnQueueEnabledVoteChanged(bool enabled); |
void EnableOrDisableWithSelector(bool enable); |
+ // Schedules delayed work on time domain and calls the observer. |
+ void ScheduleDelayedWorkInTimeDomain(base::TimeTicks now); |
+ |
+ void NotifyWakeUpChangedOnMainThread(base::TimeTicks wake_up); |
+ |
const base::PlatformThreadId thread_id_; |
mutable base::Lock any_thread_lock_; |