| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/scheduler/base/task_queue_impl.h" | 5 #include "components/scheduler/base/task_queue_impl.h" |
| 6 | 6 |
| 7 #include "base/trace_event/blame_context.h" | 7 #include "base/trace_event/blame_context.h" |
| 8 #include "components/scheduler/base/task_queue_manager.h" | 8 #include "components/scheduler/base/task_queue_manager.h" |
| 9 #include "components/scheduler/base/task_queue_manager_delegate.h" | 9 #include "components/scheduler/base/task_queue_manager_delegate.h" |
| 10 #include "components/scheduler/base/time_domain.h" | 10 #include "components/scheduler/base/time_domain.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 base::TimeTicks time_domain_delayed_run_time = | 212 base::TimeTicks time_domain_delayed_run_time = |
| 213 any_thread().time_domain->ComputeDelayedRunTime(time_domain_now, delay); | 213 any_thread().time_domain->ComputeDelayedRunTime(time_domain_now, delay); |
| 214 PushOntoDelayedIncomingQueueLocked( | 214 PushOntoDelayedIncomingQueueLocked( |
| 215 Task(from_here, task, time_domain_delayed_run_time, sequence_number, | 215 Task(from_here, task, time_domain_delayed_run_time, sequence_number, |
| 216 task_type != TaskType::NON_NESTABLE)); | 216 task_type != TaskType::NON_NESTABLE)); |
| 217 } | 217 } |
| 218 return true; | 218 return true; |
| 219 } | 219 } |
| 220 | 220 |
| 221 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( | 221 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
| 222 const Task& pending_task, | 222 Task pending_task, |
| 223 base::TimeTicks now) { | 223 base::TimeTicks now) { |
| 224 main_thread_only().task_queue_manager->DidQueueTask(pending_task); | 224 main_thread_only().task_queue_manager->DidQueueTask(pending_task); |
| 225 | 225 |
| 226 // Schedule a later call to MoveReadyDelayedTasksToDelayedWorkQueue. | 226 // Schedule a later call to MoveReadyDelayedTasksToDelayedWorkQueue. |
| 227 main_thread_only().delayed_incoming_queue.push(pending_task); | 227 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
| 228 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
| 228 main_thread_only().time_domain->ScheduleDelayedWork( | 229 main_thread_only().time_domain->ScheduleDelayedWork( |
| 229 this, pending_task.delayed_run_time, now); | 230 this, delayed_run_time, now); |
| 230 TraceQueueSize(false); | 231 TraceQueueSize(false); |
| 231 } | 232 } |
| 232 | 233 |
| 233 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked( | 234 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { |
| 234 const Task& pending_task) { | |
| 235 any_thread().task_queue_manager->DidQueueTask(pending_task); | 235 any_thread().task_queue_manager->DidQueueTask(pending_task); |
| 236 | 236 |
| 237 int thread_hop_task_sequence_number = | 237 int thread_hop_task_sequence_number = |
| 238 any_thread().task_queue_manager->GetNextSequenceNumber(); | 238 any_thread().task_queue_manager->GetNextSequenceNumber(); |
| 239 PushOntoImmediateIncomingQueueLocked(Task( | 239 PushOntoImmediateIncomingQueueLocked(Task( |
| 240 FROM_HERE, | 240 FROM_HERE, |
| 241 base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, pending_task), | 241 base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
| 242 base::Passed(&pending_task)), |
| 242 base::TimeTicks(), thread_hop_task_sequence_number, false, | 243 base::TimeTicks(), thread_hop_task_sequence_number, false, |
| 243 thread_hop_task_sequence_number)); | 244 thread_hop_task_sequence_number)); |
| 244 } | 245 } |
| 245 | 246 |
| 246 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( | 247 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(Task pending_task) { |
| 247 const Task& pending_task) { | |
| 248 if (any_thread().immediate_incoming_queue.empty()) | 248 if (any_thread().immediate_incoming_queue.empty()) |
| 249 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); | 249 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); |
| 250 if (any_thread().pump_policy == PumpPolicy::AUTO && | 250 if (any_thread().pump_policy == PumpPolicy::AUTO && |
| 251 any_thread().immediate_incoming_queue.empty()) { | 251 any_thread().immediate_incoming_queue.empty()) { |
| 252 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); | 252 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
| 253 } | 253 } |
| 254 any_thread().task_queue_manager->DidQueueTask(pending_task); | 254 any_thread().task_queue_manager->DidQueueTask(pending_task); |
| 255 any_thread().immediate_incoming_queue.push(pending_task); | 255 any_thread().immediate_incoming_queue.push(std::move(pending_task)); |
| 256 TraceQueueSize(true); | 256 TraceQueueSize(true); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void TaskQueueImpl::ScheduleDelayedWorkTask(const Task& pending_task) { | 259 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { |
| 260 DCHECK(main_thread_checker_.CalledOnValidThread()); | 260 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 261 main_thread_only().delayed_incoming_queue.push(pending_task); | 261 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
| 262 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
| 262 main_thread_only().time_domain->ScheduleDelayedWork( | 263 main_thread_only().time_domain->ScheduleDelayedWork( |
| 263 this, pending_task.delayed_run_time, | 264 this, delayed_run_time, |
| 264 main_thread_only().time_domain->Now()); | 265 main_thread_only().time_domain->Now()); |
| 265 } | 266 } |
| 266 | 267 |
| 267 void TaskQueueImpl::SetQueueEnabled(bool enabled) { | 268 void TaskQueueImpl::SetQueueEnabled(bool enabled) { |
| 268 if (main_thread_only().is_enabled == enabled) | 269 if (main_thread_only().is_enabled == enabled) |
| 269 return; | 270 return; |
| 270 main_thread_only().is_enabled = enabled; | 271 main_thread_only().is_enabled = enabled; |
| 271 if (!main_thread_only().task_queue_manager) | 272 if (!main_thread_only().task_queue_manager) |
| 272 return; | 273 return; |
| 273 if (enabled) { | 274 if (enabled) { |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 } | 661 } |
| 661 | 662 |
| 662 void TaskQueueImpl::SetBlameContext( | 663 void TaskQueueImpl::SetBlameContext( |
| 663 base::trace_event::BlameContext* blame_context) { | 664 base::trace_event::BlameContext* blame_context) { |
| 664 main_thread_only().blame_context = blame_context; | 665 main_thread_only().blame_context = blame_context; |
| 665 } | 666 } |
| 666 | 667 |
| 667 // static | 668 // static |
| 668 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, | 669 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, |
| 669 base::trace_event::TracedValue* state) { | 670 base::trace_event::TracedValue* state) { |
| 670 std::queue<Task> queue_copy(queue); | 671 // Remove const to search |queue| in the destructive manner. Restore the |
| 671 while (!queue_copy.empty()) { | 672 // content from |visited| later. |
| 672 TaskAsValueInto(queue_copy.front(), state); | 673 std::queue<Task>* mutable_queue = const_cast<std::queue<Task>*>(&queue); |
| 673 queue_copy.pop(); | 674 std::queue<Task> visited; |
| 675 while (!mutable_queue->empty()) { |
| 676 TaskAsValueInto(mutable_queue->front(), state); |
| 677 visited.push(std::move(mutable_queue->front())); |
| 678 mutable_queue->pop(); |
| 674 } | 679 } |
| 680 *mutable_queue = std::move(visited); |
| 675 } | 681 } |
| 676 | 682 |
| 677 // static | 683 // static |
| 678 void TaskQueueImpl::QueueAsValueInto(const std::priority_queue<Task>& queue, | 684 void TaskQueueImpl::QueueAsValueInto(const std::priority_queue<Task>& queue, |
| 679 base::trace_event::TracedValue* state) { | 685 base::trace_event::TracedValue* state) { |
| 680 std::priority_queue<Task> queue_copy(queue); | 686 // Remove const to search |queue| in the destructive manner. Restore the |
| 681 while (!queue_copy.empty()) { | 687 // content from |visited| later. |
| 682 TaskAsValueInto(queue_copy.top(), state); | 688 std::priority_queue<Task>* mutable_queue = |
| 683 queue_copy.pop(); | 689 const_cast<std::priority_queue<Task>*>(&queue); |
| 690 std::priority_queue<Task> visited; |
| 691 while (!mutable_queue->empty()) { |
| 692 TaskAsValueInto(mutable_queue->top(), state); |
| 693 visited.push(std::move(const_cast<Task&>(mutable_queue->top()))); |
| 694 mutable_queue->pop(); |
| 684 } | 695 } |
| 696 *mutable_queue = std::move(visited); |
| 685 } | 697 } |
| 686 | 698 |
| 687 // static | 699 // static |
| 688 void TaskQueueImpl::TaskAsValueInto(const Task& task, | 700 void TaskQueueImpl::TaskAsValueInto(const Task& task, |
| 689 base::trace_event::TracedValue* state) { | 701 base::trace_event::TracedValue* state) { |
| 690 state->BeginDictionary(); | 702 state->BeginDictionary(); |
| 691 state->SetString("posted_from", task.posted_from.ToString()); | 703 state->SetString("posted_from", task.posted_from.ToString()); |
| 692 #ifndef NDEBUG | 704 #ifndef NDEBUG |
| 693 if (task.enqueue_order_set()) | 705 if (task.enqueue_order_set()) |
| 694 state->SetInteger("enqueue_order", task.enqueue_order()); | 706 state->SetInteger("enqueue_order", task.enqueue_order()); |
| 695 #else | 707 #else |
| 696 state->SetInteger("enqueue_order", task.enqueue_order()); | 708 state->SetInteger("enqueue_order", task.enqueue_order()); |
| 697 #endif | 709 #endif |
| 698 state->SetInteger("sequence_num", task.sequence_num); | 710 state->SetInteger("sequence_num", task.sequence_num); |
| 699 state->SetBoolean("nestable", task.nestable); | 711 state->SetBoolean("nestable", task.nestable); |
| 700 state->SetBoolean("is_high_res", task.is_high_res); | 712 state->SetBoolean("is_high_res", task.is_high_res); |
| 701 state->SetDouble( | 713 state->SetDouble( |
| 702 "delayed_run_time", | 714 "delayed_run_time", |
| 703 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 715 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
| 704 state->EndDictionary(); | 716 state->EndDictionary(); |
| 705 } | 717 } |
| 706 | 718 |
| 707 } // namespace internal | 719 } // namespace internal |
| 708 } // namespace scheduler | 720 } // namespace scheduler |
| OLD | NEW |