| Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
|
| index 801682779e7a8d1e5dae8293f92cfe8533691fc0..21c4aedc800ec0af9b8e848cf3d56a5873467575 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
|
| +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
|
| @@ -8,6 +8,7 @@
|
| #include <map>
|
|
|
| #include "base/atomic_sequence_num.h"
|
| +#include "base/cancelable_callback.h"
|
| #include "base/debug/task_annotator.h"
|
| #include "base/macros.h"
|
| #include "base/memory/weak_ptr.h"
|
| @@ -16,6 +17,7 @@
|
| #include "base/synchronization/lock.h"
|
| #include "base/threading/thread_checker.h"
|
| #include "platform/scheduler/base/enqueue_order.h"
|
| +#include "platform/scheduler/base/moveable_auto_lock.h"
|
| #include "platform/scheduler/base/task_queue_impl.h"
|
| #include "platform/scheduler/base/task_queue_selector.h"
|
|
|
| @@ -159,9 +161,6 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| };
|
|
|
| // Unregisters a TaskQueue previously created by |NewTaskQueue()|.
|
| - // NOTE we have to flush the queue from |newly_updatable_| which means as a
|
| - // side effect MoveNewlyUpdatableQueuesIntoUpdatableQueueSet is called by this
|
| - // function.
|
| void UnregisterTaskQueue(scoped_refptr<internal::TaskQueueImpl> task_queue);
|
|
|
| // TaskQueueSelector::Observer implementation:
|
| @@ -176,7 +175,12 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| void DidQueueTask(const internal::TaskQueueImpl::Task& pending_task);
|
|
|
| // Use the selector to choose a pending task and run it.
|
| - void DoWork(base::TimeTicks run_time, bool from_main_thread);
|
| + void DoWork(bool delayed);
|
| +
|
| + // Post a DoWork continuation if |next_delay| is not empty.
|
| + void PostDoWorkContinuationLocked(base::Optional<base::TimeDelta> next_delay,
|
| + LazyNow* lazy_now,
|
| + MoveableAutoLock&& lock);
|
|
|
| // Delayed Tasks with run_times <= Now() are enqueued onto the work queue and
|
| // reloads any empty work queues.
|
| @@ -212,7 +216,8 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
|
|
| // Calls DelayTillNextTask on all time domains and returns the smallest delay
|
| // requested if any.
|
| - base::Optional<base::TimeDelta> ComputeDelayTillNextTask(LazyNow* lazy_now);
|
| + base::Optional<base::TimeDelta> ComputeDelayTillNextTaskLocked(
|
| + LazyNow* lazy_now);
|
|
|
| void MaybeRecordTaskDelayHistograms(
|
| const internal::TaskQueueImpl::Task& pending_task,
|
| @@ -222,16 +227,24 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| AsValueWithSelectorResult(bool should_run,
|
| internal::WorkQueue* selected_work_queue) const;
|
|
|
| + void MaybeScheduleImmediateWorkLocked(
|
| + const tracked_objects::Location& from_here,
|
| + MoveableAutoLock&& lock);
|
| +
|
| // Adds |queue| to |any_thread().has_incoming_immediate_work_| and if
|
| // |queue_is_blocked| is false it makes sure a DoWork is posted.
|
| // Can be called from any thread.
|
| void OnQueueHasIncomingImmediateWork(internal::TaskQueueImpl* queue,
|
| + internal::EnqueueOrder enqueue_order,
|
| bool queue_is_blocked);
|
|
|
| + using IncomingImmediateWorkMap =
|
| + std::unordered_map<internal::TaskQueueImpl*, internal::EnqueueOrder>;
|
| +
|
| // Calls |ReloadImmediateWorkQueueIfEmpty| on all queues in
|
| // |queues_to_reload|.
|
| - void ReloadEmptyWorkQueues(const std::unordered_set<internal::TaskQueueImpl*>&
|
| - queues_to_reload) const;
|
| + void ReloadEmptyWorkQueues(
|
| + const IncomingImmediateWorkMap& queues_to_reload) const;
|
|
|
| std::set<TimeDomain*> time_domains_;
|
| std::unique_ptr<RealTimeDomain> real_time_domain_;
|
| @@ -249,22 +262,21 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| scoped_refptr<TaskQueueManagerDelegate> delegate_;
|
| internal::TaskQueueSelector selector_;
|
|
|
| - base::Closure from_main_thread_immediate_do_work_closure_;
|
| - base::Closure from_other_thread_immediate_do_work_closure_;
|
| + base::Closure immediate_do_work_closure_;
|
| + base::Closure delayed_do_work_closure_;
|
| + base::CancelableClosure cancelable_delayed_do_work_closure_;
|
|
|
| bool task_was_run_on_quiescence_monitored_queue_;
|
|
|
| - // To reduce locking overhead we track pending calls to DoWork separately for
|
| - // the main thread and other threads.
|
| - std::set<base::TimeTicks> main_thread_pending_wakeups_;
|
| -
|
| struct AnyThread {
|
| AnyThread();
|
|
|
| - // Set of task queues with newly available work on the incoming queue.
|
| - std::unordered_set<internal::TaskQueueImpl*> has_incoming_immediate_work;
|
| + // Task queues with newly available work on the incoming queue.
|
| + IncomingImmediateWorkMap has_incoming_immediate_work;
|
|
|
| - bool other_thread_pending_wakeup;
|
| + int do_work_running_count;
|
| + int immediate_do_work_posted_count;
|
| + bool is_nested; // Whether or not the message loop is currently nested.
|
| };
|
|
|
| // TODO(alexclarke): Add a MainThreadOnly struct too.
|
| @@ -281,6 +293,8 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| return any_thread_;
|
| }
|
|
|
| + base::TimeTicks next_scheduled_delayed_do_work_time_;
|
| +
|
| bool record_task_delay_histograms_;
|
|
|
| int work_batch_size_;
|
|
|