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

Unified Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h

Issue 2546423002: [Try # 3] Scheduler refactoring to virtually eliminate redundant DoWorks (Closed)
Patch Set: Rebased Created 4 years 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 side-by-side diff with in-line comments
Download patch
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 0fbfa7e12e62b6ad42849512d88b5ad089bbf1d9..073b1d1676319708435b3b1979e61d929befc8e4 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"
@@ -18,6 +19,7 @@
#include "platform/scheduler/base/enqueue_order.h"
#include "platform/scheduler/base/task_queue_impl.h"
#include "platform/scheduler/base/task_queue_selector.h"
+#include "wtf/SpinLock.h"
namespace base {
namespace trace_event {
@@ -140,6 +142,10 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
// Returns true if there is a task that could be executed immediately.
bool HasImmediateWorkForTesting() const;
+ // 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;
@@ -152,9 +158,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:
@@ -169,11 +172,15 @@ 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 PostDoWorkContinuation(base::Optional<base::TimeDelta> next_delay,
+ LazyNow* lazy_now);
// 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(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
@@ -198,9 +205,9 @@ 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> DelayTillNextTask(LazyNow* lazy_now);
void MaybeRecordTaskDelayHistograms(
const internal::TaskQueueImpl::Task& pending_task,
@@ -210,6 +217,21 @@ class BLINK_PLATFORM_EXPORT TaskQueueManager
AsValueWithSelectorResult(bool should_run,
internal::WorkQueue* selected_work_queue) const;
+ void MaybeScheduleImmediateWorkLocked(
+ const tracked_objects::Location& from_here);
+
+ void MaybeScheduleDelayedWorkInternal(
+ const tracked_objects::Location& from_here,
+ base::TimeTicks now,
+ base::TimeDelta delay);
+
+ // Adds |queue| to |has_incomming_immediate_work_| and if
+ // |ensure_do_work_posted| is true it calls MaybeScheduleImmediateWorkLocked.
+ void OnQueueHasImmediateWork(internal::TaskQueueImpl* queue,
+ bool ensure_do_work_posted);
+
+ void NotifyQueuesOfIncomingImmediateWorkOnMainThreadLocked();
+
std::set<TimeDomain*> time_domains_;
std::unique_ptr<RealTimeDomain> real_time_domain_;
@@ -226,18 +248,23 @@ 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_;
+ // Protects |do_work_running_count_|, |immediate_do_work_posted_count_|,
+ // |is_nested_| and |has_incomming_immediate_work_|.
+ mutable WTF::SpinLock do_work_pending_lock_;
Sami 2016/12/07 16:13:42 nit: I think this could just be base::subtle::Spin
alex clarke (OOO till 29th) 2016/12/08 17:38:49 I'm actually thinking we should initially use a mu
+ int do_work_running_count_;
Sami 2016/12/07 16:13:43 Should we wrap these into a struct like we do in t
alex clarke (OOO till 29th) 2016/12/08 17:38:48 Good idea. Done.
+ int immediate_do_work_posted_count_;
+ std::set<internal::TaskQueueImpl*> has_incomming_immediate_work_;
Sami 2016/12/07 16:13:43 typo: incoming
alex clarke (OOO till 29th) 2016/12/08 17:38:48 Done.
+ bool is_nested_; // Whether or not the message loop is currently nested.
+
+ 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_;

Powered by Google App Engine
This is Rietveld 408576698