Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: components/scheduler/base/task_queue_impl.cc

Issue 1886453003: Make PendingTask move-only and pass it by value on retaining params (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: disable WorkQueue copy Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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();
Nico 2016/04/22 15:32:16 this loop pop()s from mutable_queue, the one in th
tzik 2016/04/25 11:36:26 eOn 2016/04/22 15:32:16, Nico wrote:
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(base::PopOutFromPriorityQueue(mutable_queue));
684 } 694 }
695 *mutable_queue = std::move(visited);
685 } 696 }
686 697
687 // static 698 // static
688 void TaskQueueImpl::TaskAsValueInto(const Task& task, 699 void TaskQueueImpl::TaskAsValueInto(const Task& task,
689 base::trace_event::TracedValue* state) { 700 base::trace_event::TracedValue* state) {
690 state->BeginDictionary(); 701 state->BeginDictionary();
691 state->SetString("posted_from", task.posted_from.ToString()); 702 state->SetString("posted_from", task.posted_from.ToString());
692 #ifndef NDEBUG 703 #ifndef NDEBUG
693 if (task.enqueue_order_set()) 704 if (task.enqueue_order_set())
694 state->SetInteger("enqueue_order", task.enqueue_order()); 705 state->SetInteger("enqueue_order", task.enqueue_order());
695 #else 706 #else
696 state->SetInteger("enqueue_order", task.enqueue_order()); 707 state->SetInteger("enqueue_order", task.enqueue_order());
697 #endif 708 #endif
698 state->SetInteger("sequence_num", task.sequence_num); 709 state->SetInteger("sequence_num", task.sequence_num);
699 state->SetBoolean("nestable", task.nestable); 710 state->SetBoolean("nestable", task.nestable);
700 state->SetBoolean("is_high_res", task.is_high_res); 711 state->SetBoolean("is_high_res", task.is_high_res);
701 state->SetDouble( 712 state->SetDouble(
702 "delayed_run_time", 713 "delayed_run_time",
703 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); 714 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L);
704 state->EndDictionary(); 715 state->EndDictionary();
705 } 716 }
706 717
707 } // namespace internal 718 } // namespace internal
708 } // namespace scheduler 719 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698