Commit 0edf4370 authored by Alexander Timin's avatar Alexander Timin Committed by Commit Bot

[scheduler] Plumb task reference to RendererScheduler::OnTaskCompleted.

Make renderer scheduler aware of a completed task. This will enable
us to record per-task metrics.

R=alexclarke@chromium.org
BUG=702318

Change-Id: Iaff9ca2c8f8398847c854dfc569db90176cdb7c6
Reviewed-on: https://chromium-review.googlesource.com/574538Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Commit-Queue: Alexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487126}
parent ef1ed17b
...@@ -14,6 +14,12 @@ TaskQueue::TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl) ...@@ -14,6 +14,12 @@ TaskQueue::TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl)
TaskQueue::~TaskQueue() {} TaskQueue::~TaskQueue() {}
TaskQueue::Task::Task(const tracked_objects::Location& posted_from,
base::OnceClosure task,
base::TimeTicks desired_run_time,
bool nestable)
: PendingTask(posted_from, std::move(task), desired_run_time, nestable) {}
void TaskQueue::UnregisterTaskQueue() { void TaskQueue::UnregisterTaskQueue() {
impl_->UnregisterTaskQueue(this); impl_->UnregisterTaskQueue(this);
} }
......
...@@ -115,6 +115,15 @@ class PLATFORM_EXPORT TaskQueue : public base::SingleThreadTaskRunner { ...@@ -115,6 +115,15 @@ class PLATFORM_EXPORT TaskQueue : public base::SingleThreadTaskRunner {
bool should_report_when_execution_blocked; bool should_report_when_execution_blocked;
}; };
// Interface to pass per-task metadata to RendererScheduler.
class PLATFORM_EXPORT Task : public base::PendingTask {
public:
Task(const tracked_objects::Location& posted_from,
base::OnceClosure task,
base::TimeTicks desired_run_time,
bool nestable);
};
// An interface that lets the owner vote on whether or not the associated // An interface that lets the owner vote on whether or not the associated
// TaskQueue should be enabled. // TaskQueue should be enabled.
class QueueEnabledVoter { class QueueEnabledVoter {
......
...@@ -67,10 +67,10 @@ TaskQueueImpl::~TaskQueueImpl() { ...@@ -67,10 +67,10 @@ TaskQueueImpl::~TaskQueueImpl() {
} }
TaskQueueImpl::Task::Task() TaskQueueImpl::Task::Task()
: PendingTask(tracked_objects::Location(), : TaskQueue::Task(tracked_objects::Location(),
base::Closure(), base::Closure(),
base::TimeTicks(), base::TimeTicks(),
true), true),
#ifndef NDEBUG #ifndef NDEBUG
enqueue_order_set_(false), enqueue_order_set_(false),
#endif #endif
...@@ -83,7 +83,7 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, ...@@ -83,7 +83,7 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from,
base::TimeTicks desired_run_time, base::TimeTicks desired_run_time,
EnqueueOrder sequence_number, EnqueueOrder sequence_number,
bool nestable) bool nestable)
: PendingTask(posted_from, std::move(task), desired_run_time, nestable), : TaskQueue::Task(posted_from, std::move(task), desired_run_time, nestable),
#ifndef NDEBUG #ifndef NDEBUG
enqueue_order_set_(false), enqueue_order_set_(false),
#endif #endif
...@@ -97,7 +97,7 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, ...@@ -97,7 +97,7 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from,
EnqueueOrder sequence_number, EnqueueOrder sequence_number,
bool nestable, bool nestable,
EnqueueOrder enqueue_order) EnqueueOrder enqueue_order)
: PendingTask(posted_from, std::move(task), desired_run_time, nestable), : TaskQueue::Task(posted_from, std::move(task), desired_run_time, nestable),
#ifndef NDEBUG #ifndef NDEBUG
enqueue_order_set_(true), enqueue_order_set_(true),
#endif #endif
...@@ -906,10 +906,11 @@ void TaskQueueImpl::SetOnTaskCompletedHandler( ...@@ -906,10 +906,11 @@ void TaskQueueImpl::SetOnTaskCompletedHandler(
main_thread_only().on_task_completed_handler = std::move(handler); main_thread_only().on_task_completed_handler = std::move(handler);
} }
void TaskQueueImpl::OnTaskCompleted(base::TimeTicks start, void TaskQueueImpl::OnTaskCompleted(const TaskQueue::Task& task,
base::TimeTicks start,
base::TimeTicks end) { base::TimeTicks end) {
if (!main_thread_only().on_task_completed_handler.is_null()) if (!main_thread_only().on_task_completed_handler.is_null())
main_thread_only().on_task_completed_handler.Run(start, end); main_thread_only().on_task_completed_handler.Run(task, start, end);
} }
void TaskQueueImpl::SetQueueEnabledForTest(bool enabled) { void TaskQueueImpl::SetQueueEnabledForTest(bool enabled) {
......
...@@ -82,7 +82,7 @@ class PLATFORM_EXPORT TaskQueueImpl { ...@@ -82,7 +82,7 @@ class PLATFORM_EXPORT TaskQueueImpl {
} }
}; };
class PLATFORM_EXPORT Task : public base::PendingTask { class PLATFORM_EXPORT Task : public TaskQueue::Task {
public: public:
Task(); Task();
Task(const tracked_objects::Location& posted_from, Task(const tracked_objects::Location& posted_from,
...@@ -134,8 +134,8 @@ class PLATFORM_EXPORT TaskQueueImpl { ...@@ -134,8 +134,8 @@ class PLATFORM_EXPORT TaskQueueImpl {
}; };
using OnNextWakeUpChangedCallback = base::Callback<void(base::TimeTicks)>; using OnNextWakeUpChangedCallback = base::Callback<void(base::TimeTicks)>;
using OnTaskCompletedHandler = using OnTaskCompletedHandler = base::Callback<
base::Callback<void(base::TimeTicks, base::TimeTicks)>; void(const TaskQueue::Task&, base::TimeTicks, base::TimeTicks)>;
// TaskQueue implementation. // TaskQueue implementation.
const char* GetName() const; const char* GetName() const;
...@@ -262,7 +262,9 @@ class PLATFORM_EXPORT TaskQueueImpl { ...@@ -262,7 +262,9 @@ class PLATFORM_EXPORT TaskQueueImpl {
// Allows wrapping TaskQueue to set a handler to subscribe for notifications // Allows wrapping TaskQueue to set a handler to subscribe for notifications
// about completed tasks. // about completed tasks.
void SetOnTaskCompletedHandler(OnTaskCompletedHandler handler); void SetOnTaskCompletedHandler(OnTaskCompletedHandler handler);
void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end); void OnTaskCompleted(const TaskQueue::Task& task,
base::TimeTicks start,
base::TimeTicks end);
// Disables queue for testing purposes, when a QueueEnabledVoter can't be // Disables queue for testing purposes, when a QueueEnabledVoter can't be
// constructed due to not having TaskQueue. // constructed due to not having TaskQueue.
......
...@@ -544,6 +544,7 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue( ...@@ -544,6 +544,7 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue(
task_end_time = MonotonicTimeInSeconds(*time_after_task); task_end_time = MonotonicTimeInSeconds(*time_after_task);
queue->OnTaskCompleted( queue->OnTaskCompleted(
pending_task,
base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time), base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time),
base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time)); base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time));
......
...@@ -89,9 +89,10 @@ MainThreadTaskQueue::MainThreadTaskQueue( ...@@ -89,9 +89,10 @@ MainThreadTaskQueue::MainThreadTaskQueue(
MainThreadTaskQueue::~MainThreadTaskQueue() {} MainThreadTaskQueue::~MainThreadTaskQueue() {}
void MainThreadTaskQueue::OnTaskCompleted(base::TimeTicks start, void MainThreadTaskQueue::OnTaskCompleted(const TaskQueue::Task& task,
base::TimeTicks start,
base::TimeTicks end) { base::TimeTicks end) {
renderer_scheduler_->OnTaskCompleted(this, start, end); renderer_scheduler_->OnTaskCompleted(this, task, start, end);
} }
void MainThreadTaskQueue::UnregisterTaskQueue() { void MainThreadTaskQueue::UnregisterTaskQueue() {
......
...@@ -113,7 +113,9 @@ class PLATFORM_EXPORT MainThreadTaskQueue : public TaskQueue { ...@@ -113,7 +113,9 @@ class PLATFORM_EXPORT MainThreadTaskQueue : public TaskQueue {
bool CanBeSuspended() const { return can_be_suspended_; } bool CanBeSuspended() const { return can_be_suspended_; }
void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end); void OnTaskCompleted(const TaskQueue::Task& task,
base::TimeTicks start,
base::TimeTicks end);
// Override base method to notify RendererScheduler about unregistered queue. // Override base method to notify RendererScheduler about unregistered queue.
void UnregisterTaskQueue() override; void UnregisterTaskQueue() override;
......
...@@ -1951,6 +1951,7 @@ void RendererSchedulerImpl::DidProcessTask(double start_time, double end_time) { ...@@ -1951,6 +1951,7 @@ void RendererSchedulerImpl::DidProcessTask(double start_time, double end_time) {
} }
void RendererSchedulerImpl::OnTaskCompleted(MainThreadTaskQueue* queue, void RendererSchedulerImpl::OnTaskCompleted(MainThreadTaskQueue* queue,
const TaskQueue::Task& task,
base::TimeTicks start, base::TimeTicks start,
base::TimeTicks end) { base::TimeTicks end) {
task_queue_throttler()->OnTaskRunTimeReported(queue, start, end); task_queue_throttler()->OnTaskRunTimeReported(queue, start, end);
......
...@@ -236,6 +236,7 @@ class PLATFORM_EXPORT RendererSchedulerImpl ...@@ -236,6 +236,7 @@ class PLATFORM_EXPORT RendererSchedulerImpl
void OnUnregisterTaskQueue(const scoped_refptr<MainThreadTaskQueue>& queue); void OnUnregisterTaskQueue(const scoped_refptr<MainThreadTaskQueue>& queue);
void OnTaskCompleted(MainThreadTaskQueue* queue, void OnTaskCompleted(MainThreadTaskQueue* queue,
const TaskQueue::Task& task,
base::TimeTicks start, base::TimeTicks start,
base::TimeTicks end); base::TimeTicks end);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment