Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| index 1ff9b277a137a9614c32bbad1885c0e61ad622db..4f8fb8ee084f22aacc08f35756ce975e39757f7f 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| @@ -110,38 +110,22 @@ TaskQueueImpl::Task::Task() |
| base::Closure(), |
| base::TimeTicks(), |
| true), |
| -#ifndef NDEBUG |
| - enqueue_order_set_(false), |
| -#endif |
| - enqueue_order_(0) { |
| + enqueue_order_({base::TimeTicks(), 0}) { |
| sequence_num = 0; |
| } |
| TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
| base::OnceClosure task, |
| - base::TimeTicks desired_run_time, |
| - EnqueueOrder sequence_number, |
| + EnqueueOrder enqueue_order, |
| bool nestable) |
| - : PendingTask(posted_from, std::move(task), desired_run_time, nestable), |
| -#ifndef NDEBUG |
| - enqueue_order_set_(false), |
| -#endif |
| - enqueue_order_(0) { |
| - sequence_num = sequence_number; |
| -} |
| - |
| -TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
| - base::OnceClosure task, |
| - base::TimeTicks desired_run_time, |
| - EnqueueOrder sequence_number, |
| - bool nestable, |
| - EnqueueOrder enqueue_order) |
| - : PendingTask(posted_from, std::move(task), desired_run_time, nestable), |
| -#ifndef NDEBUG |
| - enqueue_order_set_(true), |
| -#endif |
| + : PendingTask(posted_from, |
| + std::move(task), |
| + enqueue_order.delayed_run_time, |
| + nestable), |
| enqueue_order_(enqueue_order) { |
| - sequence_num = sequence_number; |
| + // Note: these properties are only used for tracing. |
| + sequence_num = static_cast<int>(enqueue_order.sequence_num); |
| + delayed_run_time = enqueue_order.delayed_run_time; |
| } |
| TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, |
| @@ -228,11 +212,11 @@ bool TaskQueueImpl::PostImmediateTaskImpl( |
| if (!any_thread().task_queue_manager) |
| return false; |
| - EnqueueOrder sequence_number = |
| - any_thread().task_queue_manager->GetNextSequenceNumber(); |
| + EnqueueOrder enqueue_order = |
| + any_thread().task_queue_manager->GetNextEnqueueOrder(base::TimeTicks()); |
| PushOntoImmediateIncomingQueueLocked(from_here, std::move(task), |
| - base::TimeTicks(), sequence_number, |
| + enqueue_order, |
| task_type != TaskType::NON_NESTABLE); |
| return true; |
| } |
| @@ -249,14 +233,14 @@ bool TaskQueueImpl::PostDelayedTaskImpl( |
| if (!main_thread_only().task_queue_manager) |
| return false; |
| - EnqueueOrder sequence_number = |
| - main_thread_only().task_queue_manager->GetNextSequenceNumber(); |
| - |
| base::TimeTicks time_domain_now = main_thread_only().time_domain->Now(); |
| base::TimeTicks time_domain_delayed_run_time = time_domain_now + delay; |
| + EnqueueOrder enqueue_order = |
| + main_thread_only().task_queue_manager->GetNextEnqueueOrder( |
| + time_domain_delayed_run_time); |
| PushOntoDelayedIncomingQueueFromMainThread( |
| - Task(from_here, std::move(task), time_domain_delayed_run_time, |
| - sequence_number, task_type != TaskType::NON_NESTABLE), |
| + Task(from_here, std::move(task), enqueue_order, |
| + task_type != TaskType::NON_NESTABLE), |
| time_domain_now); |
| } else { |
| // NOTE posting a delayed task from a different thread is not expected to |
| @@ -267,14 +251,14 @@ bool TaskQueueImpl::PostDelayedTaskImpl( |
| if (!any_thread().task_queue_manager) |
| return false; |
| - EnqueueOrder sequence_number = |
| - any_thread().task_queue_manager->GetNextSequenceNumber(); |
| - |
| base::TimeTicks time_domain_now = any_thread().time_domain->Now(); |
| base::TimeTicks time_domain_delayed_run_time = time_domain_now + delay; |
| + EnqueueOrder enqueue_order = |
| + any_thread().task_queue_manager->GetNextEnqueueOrder( |
| + time_domain_delayed_run_time); |
| PushOntoDelayedIncomingQueueLocked( |
| - Task(from_here, std::move(task), time_domain_delayed_run_time, |
| - sequence_number, task_type != TaskType::NON_NESTABLE)); |
| + Task(from_here, std::move(task), enqueue_order, |
| + task_type != TaskType::NON_NESTABLE)); |
| } |
| return true; |
| } |
| @@ -302,15 +286,13 @@ void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
| void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { |
| any_thread().task_queue_manager->DidQueueTask(pending_task); |
| - int thread_hop_task_sequence_number = |
|
alex clarke (OOO till 29th)
2017/04/13 07:46:00
Oh wow that's a nasty bug fixed here.
Sami
2017/04/18 10:47:49
You mean the overflow? Yeah :)
|
| - any_thread().task_queue_manager->GetNextSequenceNumber(); |
| + EnqueueOrder thread_hop_task_enqueue_order = |
| + any_thread().task_queue_manager->GetNextEnqueueOrder(base::TimeTicks()); |
| PushOntoImmediateIncomingQueueLocked( |
| - FROM_HERE, |
| - base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
| - base::Passed(&pending_task)), |
| - base::TimeTicks(), |
| - thread_hop_task_sequence_number, |
| - false); |
| + FROM_HERE, |
| + base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
| + base::Passed(&pending_task)), |
| + thread_hop_task_enqueue_order, false); |
| } |
| void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { |
| @@ -337,8 +319,7 @@ void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { |
| void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
| const tracked_objects::Location& posted_from, |
| base::OnceClosure task, |
| - base::TimeTicks desired_run_time, |
| - EnqueueOrder sequence_number, |
| + EnqueueOrder enqueue_order, |
| bool nestable) { |
| // If the |immediate_incoming_queue| is empty we need a DoWork posted to make |
| // it run. |
| @@ -348,8 +329,7 @@ void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
| base::AutoLock lock(immediate_incoming_queue_lock_); |
| was_immediate_incoming_queue_empty = immediate_incoming_queue().empty(); |
| immediate_incoming_queue().emplace_back(posted_from, std::move(task), |
| - desired_run_time, sequence_number, |
| - nestable, sequence_number); |
| + enqueue_order, nestable); |
| any_thread().task_queue_manager->DidQueueTask( |
| immediate_incoming_queue().back()); |
| } |
| @@ -361,9 +341,10 @@ void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
| RunsTasksOnCurrentThread() && |
| (!IsQueueEnabled() || main_thread_only().current_fence); |
| any_thread().task_queue_manager->OnQueueHasIncomingImmediateWork( |
| - this, sequence_number, queue_is_blocked); |
| + this, enqueue_order, queue_is_blocked); |
| if (any_thread().observer) |
| - any_thread().observer->OnQueueNextWakeUpChanged(this, desired_run_time); |
| + any_thread().observer->OnQueueNextWakeUpChanged( |
| + this, enqueue_order.delayed_run_time); |
| } |
| TraceQueueSize(); |
| @@ -446,8 +427,6 @@ TaskQueueImpl::WakeUpForDelayedWork(LazyNow* lazy_now) { |
| } |
| if (task.delayed_run_time > lazy_now->Now()) |
| break; |
| - task.set_enqueue_order( |
| - main_thread_only().task_queue_manager->GetNextSequenceNumber()); |
| main_thread_only().delayed_work_queue->Push(std::move(task)); |
|
alex clarke (OOO till 29th)
2017/04/13 07:46:00
Something for a future patch, but I wonder if we a
Sami
2017/04/18 10:47:49
Interesting point. We'd still need some way to rou
|
| main_thread_only().delayed_incoming_queue.pop(); |
| } |
| @@ -621,11 +600,14 @@ void TaskQueueImpl::InsertFence(TaskQueue::InsertFencePosition position) { |
| if (!main_thread_only().task_queue_manager) |
| return; |
| - EnqueueOrder previous_fence = main_thread_only().current_fence; |
| + uint64_t previous_fence = main_thread_only().current_fence; |
| main_thread_only().current_fence = |
| position == TaskQueue::InsertFencePosition::NOW |
| - ? main_thread_only().task_queue_manager->GetNextSequenceNumber() |
| - : static_cast<EnqueueOrder>(EnqueueOrderValues::BLOCKING_FENCE); |
| + ? main_thread_only() |
| + .task_queue_manager->GetNextEnqueueOrder(base::TimeTicks()) |
| + .sequence_num |
| + : static_cast<uint64_t>( |
| + EnqueueOrderSequenceNumberValues::BLOCKING_FENCE); |
| // Tasks posted after this point will have a strictly higher enqueue order |
| // and will be blocked from running. |
| @@ -638,8 +620,9 @@ void TaskQueueImpl::InsertFence(TaskQueue::InsertFencePosition position) { |
| previous_fence < main_thread_only().current_fence) { |
| base::AutoLock lock(immediate_incoming_queue_lock_); |
| if (!immediate_incoming_queue().empty() && |
| - immediate_incoming_queue().front().enqueue_order() > previous_fence && |
| - immediate_incoming_queue().front().enqueue_order() < |
| + immediate_incoming_queue().front().enqueue_order().sequence_num > |
| + previous_fence && |
| + immediate_incoming_queue().front().enqueue_order().sequence_num < |
| main_thread_only().current_fence) { |
| task_unblocked = true; |
| } |
| @@ -655,7 +638,7 @@ void TaskQueueImpl::RemoveFence() { |
| if (!main_thread_only().task_queue_manager) |
| return; |
| - EnqueueOrder previous_fence = main_thread_only().current_fence; |
| + uint64_t previous_fence = main_thread_only().current_fence; |
| main_thread_only().current_fence = 0; |
| bool task_unblocked = main_thread_only().immediate_work_queue->RemoveFence(); |
| @@ -664,7 +647,8 @@ void TaskQueueImpl::RemoveFence() { |
| if (!task_unblocked && previous_fence) { |
| base::AutoLock lock(immediate_incoming_queue_lock_); |
| if (!immediate_incoming_queue().empty() && |
| - immediate_incoming_queue().front().enqueue_order() > previous_fence) { |
| + immediate_incoming_queue().front().enqueue_order().sequence_num > |
| + previous_fence) { |
| task_unblocked = true; |
| } |
| } |
| @@ -688,7 +672,7 @@ bool TaskQueueImpl::BlockedByFence() const { |
| if (immediate_incoming_queue().empty()) |
| return true; |
| - return immediate_incoming_queue().front().enqueue_order() > |
| + return immediate_incoming_queue().front().enqueue_order().sequence_num > |
| main_thread_only().current_fence; |
| } |
| @@ -699,10 +683,10 @@ bool TaskQueueImpl::CouldTaskRun(EnqueueOrder enqueue_order) const { |
| if (!main_thread_only().current_fence) |
| return true; |
| - return enqueue_order < main_thread_only().current_fence; |
| + return enqueue_order.sequence_num < main_thread_only().current_fence; |
| } |
| -EnqueueOrder TaskQueueImpl::GetFenceForTest() const { |
| +uint64_t TaskQueueImpl::GetFenceForTest() const { |
| return main_thread_only().current_fence; |
| } |
| @@ -735,12 +719,10 @@ void TaskQueueImpl::TaskAsValueInto(const Task& task, |
| base::trace_event::TracedValue* state) { |
| state->BeginDictionary(); |
| state->SetString("posted_from", task.posted_from.ToString()); |
| -#ifndef NDEBUG |
| - if (task.enqueue_order_set()) |
| - state->SetInteger("enqueue_order", task.enqueue_order()); |
| -#else |
| - state->SetInteger("enqueue_order", task.enqueue_order()); |
| -#endif |
| + state->SetInteger("enqueue_order.delayed_run_time", |
| + task.enqueue_order().delayed_run_time.ToInternalValue()); |
| + state->SetInteger("enqueue_order.sequence_num", |
| + task.enqueue_order().sequence_num); |
| state->SetInteger("sequence_num", task.sequence_num); |
| state->SetBoolean("nestable", task.nestable); |
| state->SetBoolean("is_high_res", task.is_high_res); |