Chromium Code Reviews| 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 "platform/scheduler/base/task_queue_impl.h" | 5 #include "platform/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 "platform/scheduler/base/task_queue_manager.h" | 8 #include "platform/scheduler/base/task_queue_manager.h" |
| 9 #include "platform/scheduler/base/task_queue_manager_delegate.h" | 9 #include "platform/scheduler/base/task_queue_manager_delegate.h" |
| 10 #include "platform/scheduler/base/time_domain.h" | 10 #include "platform/scheduler/base/time_domain.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 | 43 |
| 44 namespace internal { | 44 namespace internal { |
| 45 | 45 |
| 46 TaskQueueImpl::TaskQueueImpl( | 46 TaskQueueImpl::TaskQueueImpl( |
| 47 TaskQueueManager* task_queue_manager, | 47 TaskQueueManager* task_queue_manager, |
| 48 TimeDomain* time_domain, | 48 TimeDomain* time_domain, |
| 49 const Spec& spec, | 49 const Spec& spec, |
| 50 const char* disabled_by_default_tracing_category, | 50 const char* disabled_by_default_tracing_category, |
| 51 const char* disabled_by_default_verbose_tracing_category) | 51 const char* disabled_by_default_verbose_tracing_category) |
| 52 : thread_id_(base::PlatformThread::CurrentId()), | 52 : thread_id_(base::PlatformThread::CurrentId()), |
| 53 any_thread_(task_queue_manager, spec.pump_policy, time_domain), | 53 any_thread_(task_queue_manager, time_domain), |
| 54 name_(spec.name), | 54 name_(spec.name), |
| 55 disabled_by_default_tracing_category_( | 55 disabled_by_default_tracing_category_( |
| 56 disabled_by_default_tracing_category), | 56 disabled_by_default_tracing_category), |
| 57 disabled_by_default_verbose_tracing_category_( | 57 disabled_by_default_verbose_tracing_category_( |
| 58 disabled_by_default_verbose_tracing_category), | 58 disabled_by_default_verbose_tracing_category), |
| 59 main_thread_only_(task_queue_manager, | 59 main_thread_only_(task_queue_manager, this, time_domain), |
| 60 spec.pump_policy, | |
| 61 this, | |
| 62 time_domain), | |
| 63 wakeup_policy_(spec.wakeup_policy), | |
| 64 should_monitor_quiescence_(spec.should_monitor_quiescence), | 60 should_monitor_quiescence_(spec.should_monitor_quiescence), |
| 65 should_notify_observers_(spec.should_notify_observers), | 61 should_notify_observers_(spec.should_notify_observers), |
| 66 should_report_when_execution_blocked_( | 62 should_report_when_execution_blocked_( |
| 67 spec.should_report_when_execution_blocked) { | 63 spec.should_report_when_execution_blocked) { |
| 68 DCHECK(time_domain); | 64 DCHECK(time_domain); |
| 69 time_domain->RegisterQueue(this); | 65 time_domain->RegisterQueue(this); |
| 70 } | 66 } |
| 71 | 67 |
| 72 TaskQueueImpl::~TaskQueueImpl() { | 68 TaskQueueImpl::~TaskQueueImpl() { |
| 73 #if DCHECK_IS_ON() | 69 #if DCHECK_IS_ON() |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 | 160 |
| 165 if (a.delayed_run_time > b.delayed_run_time) | 161 if (a.delayed_run_time > b.delayed_run_time) |
| 166 return false; | 162 return false; |
| 167 | 163 |
| 168 // If the times happen to match, then we use the sequence number to decide. | 164 // If the times happen to match, then we use the sequence number to decide. |
| 169 // Compare the difference to support integer roll-over. | 165 // Compare the difference to support integer roll-over. |
| 170 return (a.sequence_num - b.sequence_num) < 0; | 166 return (a.sequence_num - b.sequence_num) < 0; |
| 171 } | 167 } |
| 172 | 168 |
| 173 TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, | 169 TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, |
| 174 PumpPolicy pump_policy, | |
| 175 TimeDomain* time_domain) | 170 TimeDomain* time_domain) |
| 176 : task_queue_manager(task_queue_manager), | 171 : task_queue_manager(task_queue_manager), |
| 177 pump_policy(pump_policy), | |
| 178 time_domain(time_domain), | 172 time_domain(time_domain), |
| 179 immediate_incoming_queue(&TaskQueueImpl::Task::EnqueueOrderComparatorFn) { | 173 immediate_incoming_queue(&TaskQueueImpl::Task::EnqueueOrderComparatorFn) { |
| 180 } | 174 } |
| 181 | 175 |
| 182 TaskQueueImpl::AnyThread::~AnyThread() {} | 176 TaskQueueImpl::AnyThread::~AnyThread() {} |
| 183 | 177 |
| 184 TaskQueueImpl::MainThreadOnly::MainThreadOnly( | 178 TaskQueueImpl::MainThreadOnly::MainThreadOnly( |
| 185 TaskQueueManager* task_queue_manager, | 179 TaskQueueManager* task_queue_manager, |
| 186 PumpPolicy pump_policy, | |
| 187 TaskQueueImpl* task_queue, | 180 TaskQueueImpl* task_queue, |
| 188 TimeDomain* time_domain) | 181 TimeDomain* time_domain) |
| 189 : task_queue_manager(task_queue_manager), | 182 : task_queue_manager(task_queue_manager), |
| 190 pump_policy(pump_policy), | |
| 191 time_domain(time_domain), | 183 time_domain(time_domain), |
| 192 delayed_work_queue( | 184 delayed_work_queue( |
| 193 new WorkQueue(task_queue, | 185 new WorkQueue(task_queue, |
| 194 "delayed", | 186 "delayed", |
| 195 &TaskQueueImpl::Task::DelayedRunTimeComparatorFn)), | 187 &TaskQueueImpl::Task::DelayedRunTimeComparatorFn)), |
| 196 immediate_work_queue( | 188 immediate_work_queue( |
| 197 new WorkQueue(task_queue, | 189 new WorkQueue(task_queue, |
| 198 "immediate", | 190 "immediate", |
| 199 &TaskQueueImpl::Task::EnqueueOrderComparatorFn)), | 191 &TaskQueueImpl::Task::EnqueueOrderComparatorFn)), |
| 200 set_index(0), | 192 set_index(0), |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 442 PushOntoImmediateIncomingQueueLocked( | 434 PushOntoImmediateIncomingQueueLocked( |
| 443 Task(FROM_HERE, base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, | 435 Task(FROM_HERE, base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
| 444 base::Passed(&pending_task)), | 436 base::Passed(&pending_task)), |
| 445 base::TimeTicks(), thread_hop_task_sequence_number, false, | 437 base::TimeTicks(), thread_hop_task_sequence_number, false, |
| 446 thread_hop_task_sequence_number)); | 438 thread_hop_task_sequence_number)); |
| 447 } | 439 } |
| 448 | 440 |
| 449 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(Task pending_task) { | 441 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(Task pending_task) { |
| 450 if (any_thread().immediate_incoming_queue.empty()) | 442 if (any_thread().immediate_incoming_queue.empty()) |
| 451 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); | 443 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); |
| 452 if (any_thread().pump_policy == PumpPolicy::AUTO && | 444 if (any_thread().immediate_incoming_queue.empty()) { |
|
Sami
2016/08/25 15:54:12
I was trying to work out if we get extra DoWorks b
alex clarke (OOO till 29th)
2016/08/26 13:29:08
As discussed offline we can avoid posting DoWorks
| |
| 453 any_thread().immediate_incoming_queue.empty()) { | |
| 454 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); | 445 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
| 455 } | 446 } |
| 456 any_thread().task_queue_manager->DidQueueTask(pending_task); | 447 any_thread().task_queue_manager->DidQueueTask(pending_task); |
| 457 // We expect |pending_task| to be inserted at the end. Amoritized O(1). | 448 // We expect |pending_task| to be inserted at the end. Amoritized O(1). |
| 458 any_thread().immediate_incoming_queue.insert( | 449 any_thread().immediate_incoming_queue.insert( |
| 459 any_thread().immediate_incoming_queue.end(), | 450 any_thread().immediate_incoming_queue.end(), |
| 460 std::move(pending_task)); | 451 std::move(pending_task)); |
| 461 DCHECK_EQ(pending_task.enqueue_order(), | 452 DCHECK_EQ(pending_task.enqueue_order(), |
| 462 any_thread().immediate_incoming_queue.rbegin()->enqueue_order()); | 453 any_thread().immediate_incoming_queue.rbegin()->enqueue_order()); |
| 463 TraceQueueSize(true); | 454 TraceQueueSize(true); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 !main_thread_only().immediate_work_queue->Empty()) { | 495 !main_thread_only().immediate_work_queue->Empty()) { |
| 505 return false; | 496 return false; |
| 506 } | 497 } |
| 507 | 498 |
| 508 base::AutoLock lock(any_thread_lock_); | 499 base::AutoLock lock(any_thread_lock_); |
| 509 return any_thread().immediate_incoming_queue.empty() && | 500 return any_thread().immediate_incoming_queue.empty() && |
| 510 main_thread_only().delayed_incoming_queue.empty(); | 501 main_thread_only().delayed_incoming_queue.empty(); |
| 511 } | 502 } |
| 512 | 503 |
| 513 bool TaskQueueImpl::HasPendingImmediateWork() const { | 504 bool TaskQueueImpl::HasPendingImmediateWork() const { |
| 505 // Any work queue tasks count as immediate work. | |
| 514 if (!main_thread_only().delayed_work_queue->Empty() || | 506 if (!main_thread_only().delayed_work_queue->Empty() || |
| 515 !main_thread_only().immediate_work_queue->Empty()) { | 507 !main_thread_only().immediate_work_queue->Empty()) { |
| 516 return true; | 508 return true; |
| 517 } | 509 } |
| 518 | 510 |
| 519 return NeedsPumping(); | 511 // Tasks on |delayed_incoming_queue| that could run now, count as |
| 520 } | 512 // immediate work. |
| 521 | 513 if (!main_thread_only().delayed_incoming_queue.empty() && |
| 522 bool TaskQueueImpl::NeedsPumping() const { | 514 main_thread_only().delayed_incoming_queue.begin()->delayed_run_time <= |
| 523 if (!main_thread_only().immediate_work_queue->Empty()) | 515 main_thread_only().time_domain->CreateLazyNow().Now()) { |
| 524 return false; | |
| 525 | |
| 526 base::AutoLock lock(any_thread_lock_); | |
| 527 if (!any_thread().immediate_incoming_queue.empty()) | |
| 528 return true; | |
| 529 | |
| 530 // If there's no immediate Incoming work then we only need pumping if there | |
| 531 // is a delayed task that should be running now. | |
| 532 if (main_thread_only().delayed_incoming_queue.empty()) | |
| 533 return false; | |
| 534 | |
| 535 return main_thread_only().delayed_incoming_queue.begin()->delayed_run_time <= | |
| 536 main_thread_only().time_domain->CreateLazyNow().Now(); | |
| 537 } | |
| 538 | |
| 539 bool TaskQueueImpl::TaskIsOlderThanQueuedImmediateTasksLocked( | |
| 540 const Task* task) { | |
| 541 // A null task is passed when UpdateQueue is called before any task is run. | |
| 542 // In this case we don't want to pump an after_wakeup queue, so return true | |
| 543 // here. | |
| 544 if (!task) | |
| 545 return true; | |
| 546 | |
| 547 // Return false if task is newer than the oldest immediate task. | |
| 548 if (!any_thread().immediate_incoming_queue.empty() && | |
| 549 task->enqueue_order() > | |
| 550 any_thread().immediate_incoming_queue.begin()->enqueue_order()) { | |
| 551 return false; | |
| 552 } | |
| 553 return true; | |
| 554 } | |
| 555 | |
| 556 bool TaskQueueImpl::TaskIsOlderThanQueuedDelayedTasks(const Task* task) { | |
| 557 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
| 558 // A null task is passed when UpdateQueue is called before any task is run. | |
| 559 // In this case we don't want to pump an after_wakeup queue, so return true | |
| 560 // here. | |
| 561 if (!task) | |
| 562 return true; | |
| 563 | |
| 564 EnqueueOrder enqueue_order; | |
| 565 if (!main_thread_only().delayed_work_queue->GetFrontTaskEnqueueOrder( | |
| 566 &enqueue_order)) { | |
| 567 return true; | 516 return true; |
| 568 } | 517 } |
| 569 | 518 |
| 570 return task->enqueue_order() < enqueue_order; | 519 // Finally tasks on |immediate_incoming_queue| count as immediate work. |
| 571 } | 520 base::AutoLock lock(any_thread_lock_); |
| 572 | 521 return !any_thread().immediate_incoming_queue.empty(); |
| 573 bool TaskQueueImpl::ShouldAutoPumpImmediateQueueLocked( | |
| 574 bool should_trigger_wakeup, | |
| 575 const Task* previous_task) { | |
| 576 if (main_thread_only().pump_policy == PumpPolicy::MANUAL) | |
| 577 return false; | |
| 578 if (main_thread_only().pump_policy == PumpPolicy::AFTER_WAKEUP && | |
| 579 (!should_trigger_wakeup || | |
| 580 TaskIsOlderThanQueuedImmediateTasksLocked(previous_task))) | |
| 581 return false; | |
| 582 return true; | |
| 583 } | |
| 584 | |
| 585 bool TaskQueueImpl::ShouldAutoPumpDelayedQueue(bool should_trigger_wakeup, | |
| 586 const Task* previous_task) { | |
| 587 if (main_thread_only().pump_policy == PumpPolicy::MANUAL) | |
| 588 return false; | |
| 589 if (main_thread_only().pump_policy == PumpPolicy::AFTER_WAKEUP && | |
| 590 (!should_trigger_wakeup || | |
| 591 TaskIsOlderThanQueuedDelayedTasks(previous_task))) | |
| 592 return false; | |
| 593 return true; | |
| 594 } | 522 } |
| 595 | 523 |
| 596 void TaskQueueImpl::MoveReadyDelayedTasksToDelayedWorkQueue(LazyNow* lazy_now) { | 524 void TaskQueueImpl::MoveReadyDelayedTasksToDelayedWorkQueue(LazyNow* lazy_now) { |
| 597 // Enqueue all delayed tasks that should be running now. | 525 // Enqueue all delayed tasks that should be running now. |
| 598 while (!main_thread_only().delayed_incoming_queue.empty()) { | 526 while (!main_thread_only().delayed_incoming_queue.empty()) { |
| 599 DelayedRunTimeQueue::iterator next_task = | 527 DelayedRunTimeQueue::iterator next_task = |
| 600 main_thread_only().delayed_incoming_queue.begin(); | 528 main_thread_only().delayed_incoming_queue.begin(); |
| 601 if (next_task->delayed_run_time > lazy_now->Now()) | 529 if (next_task->delayed_run_time > lazy_now->Now()) |
| 602 break; | 530 break; |
| 603 // TODO(alexclarke): Use extract() when C++17 is allowed. | 531 // TODO(alexclarke): Use extract() when C++17 is allowed. |
| 604 Task& task = const_cast<Task&>(*next_task); | 532 Task& task = const_cast<Task&>(*next_task); |
| 605 task.set_enqueue_order( | 533 task.set_enqueue_order( |
| 606 main_thread_only().task_queue_manager->GetNextSequenceNumber()); | 534 main_thread_only().task_queue_manager->GetNextSequenceNumber()); |
| 607 main_thread_only().delayed_work_queue->Push(std::move(task)); | 535 main_thread_only().delayed_work_queue->Push(std::move(task)); |
| 608 main_thread_only().delayed_incoming_queue.erase(next_task); | 536 main_thread_only().delayed_incoming_queue.erase(next_task); |
| 609 } | 537 } |
| 610 } | 538 } |
| 611 | 539 |
| 612 void TaskQueueImpl::UpdateDelayedWorkQueue(LazyNow* lazy_now, | 540 void TaskQueueImpl::UpdateDelayedWorkQueue(LazyNow* lazy_now) { |
| 613 bool should_trigger_wakeup, | |
| 614 const Task* previous_task) { | |
| 615 if (!main_thread_only().task_queue_manager) | 541 if (!main_thread_only().task_queue_manager) |
| 616 return; | 542 return; |
| 617 if (!ShouldAutoPumpDelayedQueue(should_trigger_wakeup, previous_task)) | |
| 618 return; | |
| 619 MoveReadyDelayedTasksToDelayedWorkQueue(lazy_now); | 543 MoveReadyDelayedTasksToDelayedWorkQueue(lazy_now); |
| 620 TraceQueueSize(false); | 544 TraceQueueSize(false); |
| 621 } | 545 } |
| 622 | 546 |
| 623 void TaskQueueImpl::UpdateImmediateWorkQueue(bool should_trigger_wakeup, | 547 void TaskQueueImpl::UpdateImmediateWorkQueue() { |
| 624 const Task* previous_task) { | |
| 625 DCHECK(main_thread_only().immediate_work_queue->Empty()); | 548 DCHECK(main_thread_only().immediate_work_queue->Empty()); |
| 626 base::AutoLock lock(any_thread_lock_); | 549 base::AutoLock lock(any_thread_lock_); |
| 627 if (!main_thread_only().task_queue_manager) | 550 if (!main_thread_only().task_queue_manager) |
| 628 return; | 551 return; |
| 629 if (!ShouldAutoPumpImmediateQueueLocked(should_trigger_wakeup, previous_task)) | |
| 630 return; | |
| 631 | 552 |
| 632 main_thread_only().immediate_work_queue->SwapLocked( | 553 main_thread_only().immediate_work_queue->SwapLocked( |
| 633 any_thread().immediate_incoming_queue); | 554 any_thread().immediate_incoming_queue); |
| 634 | 555 |
| 635 // |any_thread().immediate_incoming_queue| is now empty so | 556 // |any_thread().immediate_incoming_queue| is now empty so |
| 636 // TimeDomain::UpdateQueues no longer needs to consider this queue for | 557 // TimeDomain::UpdateQueues no longer needs to consider this queue for |
| 637 // reloading. | 558 // reloading. |
| 638 main_thread_only().time_domain->UnregisterAsUpdatableTaskQueue(this); | 559 main_thread_only().time_domain->UnregisterAsUpdatableTaskQueue(this); |
| 639 } | 560 } |
| 640 | 561 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 656 any_thread_lock_.AssertAcquired(); | 577 any_thread_lock_.AssertAcquired(); |
| 657 TRACE_COUNTER1(disabled_by_default_tracing_category_, GetName(), | 578 TRACE_COUNTER1(disabled_by_default_tracing_category_, GetName(), |
| 658 any_thread().immediate_incoming_queue.size() + | 579 any_thread().immediate_incoming_queue.size() + |
| 659 main_thread_only().immediate_work_queue->Size() + | 580 main_thread_only().immediate_work_queue->Size() + |
| 660 main_thread_only().delayed_work_queue->Size() + | 581 main_thread_only().delayed_work_queue->Size() + |
| 661 main_thread_only().delayed_incoming_queue.size()); | 582 main_thread_only().delayed_incoming_queue.size()); |
| 662 if (!is_locked) | 583 if (!is_locked) |
| 663 any_thread_lock_.Release(); | 584 any_thread_lock_.Release(); |
| 664 } | 585 } |
| 665 | 586 |
| 666 void TaskQueueImpl::SetPumpPolicy(PumpPolicy pump_policy) { | |
| 667 base::AutoLock lock(any_thread_lock_); | |
| 668 if (pump_policy == PumpPolicy::AUTO && | |
| 669 any_thread().pump_policy != PumpPolicy::AUTO) { | |
| 670 LazyNow lazy_now(main_thread_only().time_domain->CreateLazyNow()); | |
| 671 PumpQueueLocked(&lazy_now, true); | |
| 672 } | |
| 673 any_thread().pump_policy = pump_policy; | |
| 674 main_thread_only().pump_policy = pump_policy; | |
| 675 } | |
| 676 | |
| 677 TaskQueue::PumpPolicy TaskQueueImpl::GetPumpPolicy() const { | |
| 678 return main_thread_only().pump_policy; | |
| 679 } | |
| 680 | |
| 681 void TaskQueueImpl::PumpQueueLocked(LazyNow* lazy_now, bool may_post_dowork) { | |
| 682 TRACE_EVENT1(disabled_by_default_tracing_category_, | |
| 683 "TaskQueueImpl::PumpQueueLocked", "queue", name_); | |
| 684 TaskQueueManager* task_queue_manager = any_thread().task_queue_manager; | |
| 685 if (!task_queue_manager) | |
| 686 return; | |
| 687 | |
| 688 MoveReadyDelayedTasksToDelayedWorkQueue(lazy_now); | |
| 689 | |
| 690 while (!any_thread().immediate_incoming_queue.empty()) { | |
| 691 ComparatorQueue::iterator it = | |
| 692 any_thread().immediate_incoming_queue.begin(); | |
| 693 main_thread_only().immediate_work_queue->Push( | |
| 694 std::move(const_cast<Task&>(*it))); | |
| 695 any_thread().immediate_incoming_queue.erase(it); | |
| 696 } | |
| 697 | |
| 698 // |immediate_incoming_queue| is now empty so TimeDomain::UpdateQueues no | |
| 699 // longer needs to consider this queue for reloading. | |
| 700 main_thread_only().time_domain->UnregisterAsUpdatableTaskQueue(this); | |
| 701 | |
| 702 if (main_thread_only().immediate_work_queue->Empty() && | |
| 703 main_thread_only().delayed_work_queue->Empty()) { | |
| 704 return; | |
| 705 } | |
| 706 | |
| 707 if (may_post_dowork) | |
| 708 task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); | |
| 709 } | |
| 710 | |
| 711 void TaskQueueImpl::PumpQueue(LazyNow* lazy_now, bool may_post_dowork) { | |
| 712 base::AutoLock lock(any_thread_lock_); | |
| 713 PumpQueueLocked(lazy_now, may_post_dowork); | |
| 714 } | |
| 715 | |
| 716 const char* TaskQueueImpl::GetName() const { | 587 const char* TaskQueueImpl::GetName() const { |
| 717 return name_; | 588 return name_; |
| 718 } | 589 } |
| 719 | 590 |
| 720 void TaskQueueImpl::SetQueuePriority(QueuePriority priority) { | 591 void TaskQueueImpl::SetQueuePriority(QueuePriority priority) { |
| 721 if (!main_thread_only().task_queue_manager || priority == GetQueuePriority()) | 592 if (!main_thread_only().task_queue_manager || priority == GetQueuePriority()) |
| 722 return; | 593 return; |
| 723 main_thread_only().task_queue_manager->selector_.SetQueuePriority(this, | 594 main_thread_only().task_queue_manager->selector_.SetQueuePriority(this, |
| 724 priority); | 595 priority); |
| 725 } | 596 } |
| 726 | 597 |
| 727 TaskQueueImpl::QueuePriority TaskQueueImpl::GetQueuePriority() const { | 598 TaskQueueImpl::QueuePriority TaskQueueImpl::GetQueuePriority() const { |
| 728 size_t set_index = immediate_work_queue()->work_queue_set_index(); | 599 size_t set_index = immediate_work_queue()->work_queue_set_index(); |
| 729 DCHECK_EQ(set_index, delayed_work_queue()->work_queue_set_index()); | 600 DCHECK_EQ(set_index, delayed_work_queue()->work_queue_set_index()); |
| 730 return static_cast<TaskQueue::QueuePriority>(set_index); | 601 return static_cast<TaskQueue::QueuePriority>(set_index); |
| 731 } | 602 } |
| 732 | 603 |
| 733 // static | 604 // static |
| 734 const char* TaskQueueImpl::PumpPolicyToString( | |
| 735 TaskQueue::PumpPolicy pump_policy) { | |
| 736 switch (pump_policy) { | |
| 737 case TaskQueue::PumpPolicy::AUTO: | |
| 738 return "auto"; | |
| 739 case TaskQueue::PumpPolicy::AFTER_WAKEUP: | |
| 740 return "after_wakeup"; | |
| 741 case TaskQueue::PumpPolicy::MANUAL: | |
| 742 return "manual"; | |
| 743 default: | |
| 744 NOTREACHED(); | |
| 745 return nullptr; | |
| 746 } | |
| 747 } | |
| 748 | |
| 749 // static | |
| 750 const char* TaskQueueImpl::WakeupPolicyToString( | |
| 751 TaskQueue::WakeupPolicy wakeup_policy) { | |
| 752 switch (wakeup_policy) { | |
| 753 case TaskQueue::WakeupPolicy::CAN_WAKE_OTHER_QUEUES: | |
| 754 return "can_wake_other_queues"; | |
| 755 case TaskQueue::WakeupPolicy::DONT_WAKE_OTHER_QUEUES: | |
| 756 return "dont_wake_other_queues"; | |
| 757 default: | |
| 758 NOTREACHED(); | |
| 759 return nullptr; | |
| 760 } | |
| 761 } | |
| 762 | |
| 763 // static | |
| 764 const char* TaskQueueImpl::PriorityToString(QueuePriority priority) { | 605 const char* TaskQueueImpl::PriorityToString(QueuePriority priority) { |
| 765 switch (priority) { | 606 switch (priority) { |
| 766 case CONTROL_PRIORITY: | 607 case CONTROL_PRIORITY: |
| 767 return "control"; | 608 return "control"; |
| 768 case HIGH_PRIORITY: | 609 case HIGH_PRIORITY: |
| 769 return "high"; | 610 return "high"; |
| 770 case NORMAL_PRIORITY: | 611 case NORMAL_PRIORITY: |
| 771 return "normal"; | 612 return "normal"; |
| 772 case BEST_EFFORT_PRIORITY: | 613 case BEST_EFFORT_PRIORITY: |
| 773 return "best_effort"; | 614 return "best_effort"; |
| 774 default: | 615 default: |
| 775 NOTREACHED(); | 616 NOTREACHED(); |
| 776 return nullptr; | 617 return nullptr; |
| 777 } | 618 } |
| 778 } | 619 } |
| 779 | 620 |
| 780 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const { | 621 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const { |
| 781 base::AutoLock lock(any_thread_lock_); | 622 base::AutoLock lock(any_thread_lock_); |
| 782 state->BeginDictionary(); | 623 state->BeginDictionary(); |
| 783 state->SetString("name", GetName()); | 624 state->SetString("name", GetName()); |
| 784 state->SetBoolean("enabled", main_thread_only().is_enabled); | 625 state->SetBoolean("enabled", main_thread_only().is_enabled); |
| 785 state->SetString("time_domain_name", | 626 state->SetString("time_domain_name", |
| 786 main_thread_only().time_domain->GetName()); | 627 main_thread_only().time_domain->GetName()); |
| 787 state->SetString("pump_policy", PumpPolicyToString(any_thread().pump_policy)); | |
| 788 state->SetString("wakeup_policy", WakeupPolicyToString(wakeup_policy_)); | |
| 789 bool verbose_tracing_enabled = false; | 628 bool verbose_tracing_enabled = false; |
| 790 TRACE_EVENT_CATEGORY_GROUP_ENABLED( | 629 TRACE_EVENT_CATEGORY_GROUP_ENABLED( |
| 791 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); | 630 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); |
| 792 state->SetInteger("immediate_incoming_queue_size", | 631 state->SetInteger("immediate_incoming_queue_size", |
| 793 any_thread().immediate_incoming_queue.size()); | 632 any_thread().immediate_incoming_queue.size()); |
| 794 state->SetInteger("delayed_incoming_queue_size", | 633 state->SetInteger("delayed_incoming_queue_size", |
| 795 main_thread_only().delayed_incoming_queue.size()); | 634 main_thread_only().delayed_incoming_queue.size()); |
| 796 state->SetInteger("immediate_work_queue_size", | 635 state->SetInteger("immediate_work_queue_size", |
| 797 main_thread_only().immediate_work_queue->Size()); | 636 main_thread_only().immediate_work_queue->Size()); |
| 798 state->SetInteger("delayed_work_queue_size", | 637 state->SetInteger("delayed_work_queue_size", |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 916 state->SetBoolean("is_high_res", task.is_high_res); | 755 state->SetBoolean("is_high_res", task.is_high_res); |
| 917 state->SetDouble( | 756 state->SetDouble( |
| 918 "delayed_run_time", | 757 "delayed_run_time", |
| 919 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 758 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
| 920 state->EndDictionary(); | 759 state->EndDictionary(); |
| 921 } | 760 } |
| 922 | 761 |
| 923 } // namespace internal | 762 } // namespace internal |
| 924 } // namespace scheduler | 763 } // namespace scheduler |
| 925 } // namespace blink | 764 } // namespace blink |
| OLD | NEW |