| 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 53b95608089341615c3bcaf7ed958a35eb90907d..e6677bfb5c381f437b4f748ea12f6973825ad2a4 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"
|
|
|
| @@ -143,6 +145,10 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| // Removes all canceled delayed tasks.
|
| void SweepCanceledDelayedTasks();
|
|
|
| + // There is a small overhead to recording task delay histograms. If you don't
|
| + // need them, you can turn them off.
|
| + void SetRecordTaskDelayHistograms(bool record_task_delay_histograms);
|
| +
|
| private:
|
| friend class LazyNow;
|
| friend class internal::TaskQueueImpl;
|
| @@ -155,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:
|
| @@ -172,11 +175,18 @@ 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.
|
| - void UpdateWorkQueues(LazyNow lazy_now);
|
| + void UpdateWorkQueues(
|
| + const std::set<internal::TaskQueueImpl*>* queues_to_reload,
|
| + LazyNow* lazy_now);
|
|
|
| // Chooses the next work queue to service. Returns true if |out_queue|
|
| // indicates the queue from which the next task should be run, false to
|
| @@ -192,7 +202,8 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
| TASK_QUEUE_MANAGER_DELETED
|
| };
|
| ProcessTaskResult ProcessTaskFromWorkQueue(internal::WorkQueue* work_queue,
|
| - LazyNow*);
|
| + bool is_nested,
|
| + LazyNow* lazy_now);
|
|
|
| bool RunsTasksOnCurrentThread() const;
|
| bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
|
| @@ -201,9 +212,10 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
|
|
|
| internal::EnqueueOrder GetNextSequenceNumber();
|
|
|
| - // Calls MaybeAdvanceTime on all time domains and returns true if one of them
|
| - // was able to advance.
|
| - bool TryAdvanceTimeDomains();
|
| + // Calls DelayTillNextTask on all time domains and returns the smallest delay
|
| + // requested if any.
|
| + base::Optional<base::TimeDelta> ComputeDelayTillNextTaskLocked(
|
| + LazyNow* lazy_now);
|
|
|
| void MaybeRecordTaskDelayHistograms(
|
| const internal::TaskQueueImpl::Task& pending_task,
|
| @@ -213,6 +225,16 @@ 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 |has_incoming_immediate_work_| and if
|
| + // |ensure_do_work_posted| is true it calls MaybeScheduleImmediateWorkLocked.
|
| + // Can be called from any thread.
|
| + void OnQueueHasIncomingImmediateWork(internal::TaskQueueImpl* queue,
|
| + bool ensure_do_work_posted);
|
| +
|
| std::set<TimeDomain*> time_domains_;
|
| std::unique_ptr<RealTimeDomain> real_time_domain_;
|
|
|
| @@ -229,18 +251,35 @@ 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_;
|
|
|
| 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();
|
| +
|
| + int do_work_running_count;
|
| + int immediate_do_work_posted_count;
|
| + std::set<internal::TaskQueueImpl*> has_incoming_immediate_work;
|
| + bool is_nested; // Whether or not the message loop is currently nested.
|
| + };
|
| +
|
| + mutable base::Lock any_thread_lock_;
|
| + AnyThread any_thread_;
|
| + struct AnyThread& any_thread() {
|
| + any_thread_lock_.AssertAcquired();
|
| + return any_thread_;
|
| + }
|
| + const struct AnyThread& any_thread() const {
|
| + any_thread_lock_.AssertAcquired();
|
| + return any_thread_;
|
| + }
|
| +
|
| + bool record_task_delay_histograms_;
|
|
|
| - // Protects |other_thread_pending_wakeup_|.
|
| - mutable base::Lock other_thread_lock_;
|
| - bool other_thread_pending_wakeup_;
|
| + base::TimeTicks next_delayed_do_work_;
|
| + base::CancelableClosure cancelable_delayed_do_work_closure_;
|
|
|
| int work_batch_size_;
|
| size_t task_count_;
|
|
|