Index: Source/platform/scheduler/Scheduler.h |
diff --git a/Source/platform/scheduler/Scheduler.h b/Source/platform/scheduler/Scheduler.h |
index ef8366eb75a52c5c898f7c763f678c971fa7d8f3..a2a15f4fc4bcd62bb4e6757cb0b3ed4bf3e3a94d 100644 |
--- a/Source/platform/scheduler/Scheduler.h |
+++ b/Source/platform/scheduler/Scheduler.h |
@@ -23,15 +23,15 @@ class PLATFORM_EXPORT Scheduler { |
WTF_MAKE_NONCOPYABLE(Scheduler); |
public: |
typedef Function<void()> Task; |
- // An IdleTask is passed an allotted time in CLOCK_MONOTONIC milliseconds and is expected to complete within this timeframe. |
- typedef Function<void(double allottedTimeMs)> IdleTask; |
+ // An IdleTask is passed a deadline in CLOCK_MONOTONIC seconds and is expected to complete before this deadline. |
+ typedef Function<void(double deadlineSeconds)> IdleTask; |
static Scheduler* shared(); |
static void initializeOnMainThread(); |
static void shutdown(); |
// Called to notify about the start of a new frame. |
- void willBeginFrame(const WebBeginFrameArgs&); |
+ void willBeginFrame(double estimatedNextBeginFrameSeconds); |
// Called to notify that a previously begun frame was committed. |
void didCommitFrameToCompositor(); |
@@ -42,7 +42,9 @@ public: |
void postCompositorTask(const TraceLocation&, const Task&); |
void postIpcTask(const TraceLocation&, const Task&); |
void postTask(const TraceLocation&, const Task&); // For generic (low priority) tasks. |
- void postIdleTask(const TraceLocation&, const IdleTask&); // For non-critical tasks which may be reordered relative to other task types. |
+ // For non-critical tasks which may be reordered relative to other task types and may be starved |
+ // for an arbitrarily long time if no idle time is available. |
+ void postIdleTask(const TraceLocation&, const IdleTask&); |
// Tells the scheduler that the system received an input event. This causes the scheduler to go into |
// Compositor Priority mode for a short duration. |
@@ -59,9 +61,14 @@ public: |
void setSharedTimerFireInterval(double); |
void stopSharedTimer(); |
+ // Returns the deadline, in CLOCK_MONOTONIC seconds, which an idle task should |
+ // finish by for the current frame. |
+ double currentFrameDeadlineForIdleTasks() const; |
+ |
protected: |
class MainThreadPendingTaskRunner; |
class MainThreadPendingHighPriorityTaskRunner; |
+ class MainThreadPendingIdleTaskRunner; |
friend class MainThreadPendingTaskRunner; |
friend class MainThreadPendingHighPriorityTaskRunner; |
@@ -73,8 +80,8 @@ protected: |
Scheduler(); |
virtual ~Scheduler(); |
- void scheduleIdleTask(const TraceLocation&, const IdleTask&); |
void postHighPriorityTaskInternal(const TraceLocation&, const Task&, const char* traceName); |
+ void postIdleTaskInternal(const TraceLocation&, const IdleTask&, const char* traceName); |
void didRunHighPriorityTask(); |
static void sharedTimerAdapter(); |
@@ -84,8 +91,16 @@ protected: |
// Only does work in CompositorPriority mode. Returns true if any work was done. |
bool runPendingHighPriorityTasksIfInCompositorPriority(); |
- // Returns true if any work was done. |
- bool executeHighPriorityTasks(Deque<TracedTask>&); |
+ // Returns true if an idle task was posted to the main thread for execution. |
+ bool maybePostMainThreadPendingIdleTask(); |
+ |
+ // Only does work if canRunIdleTask. Returns true if any work was done. |
+ bool maybeRunPendingIdleTask(); |
+ |
+ PassOwnPtr<internal::TracedIdleTask> takeFirstPendingIdleTask(); |
+ |
+ // Returns true if the scheduler can run idle tasks at this time. |
+ bool canRunIdleTask() const; |
// Return the current SchedulerPolicy. |
SchedulerPolicy schedulerPolicy() const; |
@@ -105,6 +120,12 @@ protected: |
WebThread* m_mainThread; |
+ // This mutex protects calls to the pending idle task queue. |
+ Mutex m_pendingIdleTasksMutex; |
+ Deque<OwnPtr<internal::TracedIdleTask>> m_pendingIdleTasks; |
+ |
+ bool m_currentFrameCommitted; |
+ double m_estimatedNextBeginFrameSeconds; |
// Declared volatile as it is atomically incremented. |
volatile int m_highPriorityTaskCount; |