Chromium Code Reviews| Index: Source/platform/scheduler/Scheduler.h |
| diff --git a/Source/platform/scheduler/Scheduler.h b/Source/platform/scheduler/Scheduler.h |
| index c492e580aa17268afe30b6c439a9c08acd08638f..69ad86d00abdbe0a24c7d90ef6d0837e742e0370 100644 |
| --- a/Source/platform/scheduler/Scheduler.h |
| +++ b/Source/platform/scheduler/Scheduler.h |
| @@ -6,8 +6,12 @@ |
| #define Scheduler_h |
| #include "platform/PlatformExport.h" |
| +#include "platform/TraceLocation.h" |
| +#include "platform/scheduler/AtomicRingbuffer.h" |
| +#include "wtf/Deque.h" |
| #include "wtf/Functional.h" |
| #include "wtf/Noncopyable.h" |
| +#include "wtf/ThreadingPrimitives.h" |
| namespace blink { |
| class WebThread; |
| @@ -35,9 +39,11 @@ public: |
| // to be run on the main thread. They can be called from any thread. |
| void postInputTask(const TraceLocation&, const Task&); |
| void postCompositorTask(const TraceLocation&, const Task&); |
| - void postTask(const TraceLocation&, const Task&); // For generic (low priority) tasks. |
| void postIdleTask(const IdleTask&); // For non-critical tasks which may be reordered relative to other task types. |
| + // For generic (low priority) tasks, can only be called from the main thread. |
| + void postTask(const TraceLocation&, const Task&); |
| + |
| // Returns true if there is high priority work pending on the main thread |
| // and the caller should yield to let the scheduler service that work. |
| // Can be called on the main thread. |
| @@ -49,11 +55,13 @@ public: |
| void setSharedTimerFireInterval(double); |
| void stopSharedTimer(); |
| + void runPendingTasks(); |
| + void allowMainThreadTaskPosting(); |
| + |
| private: |
| Scheduler(); |
| ~Scheduler(); |
| - void scheduleTask(const TraceLocation&, const Task&); |
| void scheduleIdleTask(const IdleTask&); |
| static void sharedTimerAdapter(); |
| @@ -62,6 +70,31 @@ private: |
| static Scheduler* s_sharedScheduler; |
| blink::WebThread* m_mainThread; |
| + class TracedTask { |
| + public: |
| + TracedTask(Task task, TraceLocation location) : m_task(task), m_location(location) { } |
|
Sami
2014/08/06 10:19:52
nit: Initializer style.
alexclarke
2014/08/07 12:08:06
Done.
|
| + |
| + void run(); |
| + |
| + private: |
| + Task m_task; |
| + TraceLocation m_location; |
| + }; |
| + |
| + // The input and compositor task queues can be posted to from any thread. |
| + AtomicRingBuffer<TracedTask, 128> m_pendingInputTasks; |
|
Sami
2014/08/06 10:19:52
One pattern we could steal from cc/ is to put memb
alexclarke
2014/08/07 12:08:06
I quite like that pattern, however I don't think w
|
| + AtomicRingBuffer<TracedTask, 128> m_pendingCompositorTasks; |
| + |
| + // Blink tasks can only be posted on the main thread. |
| + WTF::Deque<TracedTask> m_pendingBlinkTasks; |
|
Sami
2014/08/06 10:19:52
m_pendingLowPriorityTasks or something?
alexclarke
2014/08/07 12:08:06
Done.
|
| + |
| + volatile int m_mainThreadTaskPosted; |
| + volatile int m_blinkShouldNotYield; |
| + |
| + void setBlinkShouldYield(); |
|
Sami
2014/08/06 10:19:52
How about setHighPriorityWorkPending to match shou
alexclarke
2014/08/07 12:08:06
I've decided not to use atomics, nailing down all
|
| + void clearBlinkShouldYield(); |
| + void maybePostTaskLoopOnMainThread(); |
| + |
| void (*m_sharedTimerFunction)(); |
| }; |