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

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

Issue 1447563002: Implement frame attribution (FrameBlamer) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup. Created 4 years, 9 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/debug/blame_context.h"
7 #include "components/scheduler/base/task_queue_manager.h" 8 #include "components/scheduler/base/task_queue_manager.h"
8 #include "components/scheduler/base/task_queue_manager_delegate.h" 9 #include "components/scheduler/base/task_queue_manager_delegate.h"
9 #include "components/scheduler/base/time_domain.h" 10 #include "components/scheduler/base/time_domain.h"
10 #include "components/scheduler/base/work_queue.h" 11 #include "components/scheduler/base/work_queue.h"
11 12
12 namespace scheduler { 13 namespace scheduler {
13 namespace internal { 14 namespace internal {
14 15
15 TaskQueueImpl::TaskQueueImpl( 16 TaskQueueImpl::TaskQueueImpl(
16 TaskQueueManager* task_queue_manager, 17 TaskQueueManager* task_queue_manager,
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 TaskQueueManager* task_queue_manager, 103 TaskQueueManager* task_queue_manager,
103 PumpPolicy pump_policy, 104 PumpPolicy pump_policy,
104 TaskQueueImpl* task_queue, 105 TaskQueueImpl* task_queue,
105 TimeDomain* time_domain) 106 TimeDomain* time_domain)
106 : task_queue_manager(task_queue_manager), 107 : task_queue_manager(task_queue_manager),
107 pump_policy(pump_policy), 108 pump_policy(pump_policy),
108 time_domain(time_domain), 109 time_domain(time_domain),
109 delayed_work_queue(new WorkQueue(task_queue, "delayed")), 110 delayed_work_queue(new WorkQueue(task_queue, "delayed")),
110 immediate_work_queue(new WorkQueue(task_queue, "immediate")), 111 immediate_work_queue(new WorkQueue(task_queue, "immediate")),
111 set_index(0), 112 set_index(0),
112 is_enabled(true) {} 113 is_enabled(true),
114 blame_context(nullptr) {}
113 115
114 TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {} 116 TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {}
115 117
116 void TaskQueueImpl::UnregisterTaskQueue() { 118 void TaskQueueImpl::UnregisterTaskQueue() {
117 base::AutoLock lock(any_thread_lock_); 119 base::AutoLock lock(any_thread_lock_);
118 if (main_thread_only().time_domain) 120 if (main_thread_only().time_domain)
119 main_thread_only().time_domain->UnregisterQueue(this); 121 main_thread_only().time_domain->UnregisterQueue(this);
120 if (!any_thread().task_queue_manager) 122 if (!any_thread().task_queue_manager)
121 return; 123 return;
122 any_thread().time_domain = nullptr; 124 any_thread().time_domain = nullptr;
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 } 599 }
598 600
599 void TaskQueueImpl::RemoveTaskObserver( 601 void TaskQueueImpl::RemoveTaskObserver(
600 base::MessageLoop::TaskObserver* task_observer) { 602 base::MessageLoop::TaskObserver* task_observer) {
601 main_thread_only().task_observers.RemoveObserver(task_observer); 603 main_thread_only().task_observers.RemoveObserver(task_observer);
602 } 604 }
603 605
604 void TaskQueueImpl::NotifyWillProcessTask( 606 void TaskQueueImpl::NotifyWillProcessTask(
605 const base::PendingTask& pending_task) { 607 const base::PendingTask& pending_task) {
606 DCHECK(should_notify_observers_); 608 DCHECK(should_notify_observers_);
609 if (main_thread_only().blame_context)
610 main_thread_only().blame_context->Enter();
607 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, 611 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver,
608 main_thread_only().task_observers, 612 main_thread_only().task_observers,
609 WillProcessTask(pending_task)); 613 WillProcessTask(pending_task));
610 } 614 }
611 615
612 void TaskQueueImpl::NotifyDidProcessTask( 616 void TaskQueueImpl::NotifyDidProcessTask(
613 const base::PendingTask& pending_task) { 617 const base::PendingTask& pending_task) {
614 DCHECK(should_notify_observers_); 618 DCHECK(should_notify_observers_);
615 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, 619 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver,
616 main_thread_only().task_observers, 620 main_thread_only().task_observers,
617 DidProcessTask(pending_task)); 621 DidProcessTask(pending_task));
622 if (main_thread_only().blame_context)
623 main_thread_only().blame_context->Leave();
618 } 624 }
619 625
620 void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) { 626 void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) {
621 base::AutoLock lock(any_thread_lock_); 627 base::AutoLock lock(any_thread_lock_);
622 DCHECK(time_domain); 628 DCHECK(time_domain);
623 // NOTE this is similar to checking |any_thread().task_queue_manager| but the 629 // NOTE this is similar to checking |any_thread().task_queue_manager| but the
624 // TaskQueueSelectorTests constructs TaskQueueImpl directly with a null 630 // TaskQueueSelectorTests constructs TaskQueueImpl directly with a null
625 // task_queue_manager. Instead we check |any_thread().time_domain| which is 631 // task_queue_manager. Instead we check |any_thread().time_domain| which is
626 // another way of asserting that UnregisterTaskQueue has not been called. 632 // another way of asserting that UnregisterTaskQueue has not been called.
627 DCHECK(any_thread().time_domain); 633 DCHECK(any_thread().time_domain);
628 if (!any_thread().time_domain) 634 if (!any_thread().time_domain)
629 return; 635 return;
630 DCHECK(main_thread_checker_.CalledOnValidThread()); 636 DCHECK(main_thread_checker_.CalledOnValidThread());
631 if (time_domain == main_thread_only().time_domain) 637 if (time_domain == main_thread_only().time_domain)
632 return; 638 return;
633 639
634 main_thread_only().time_domain->MigrateQueue(this, time_domain); 640 main_thread_only().time_domain->MigrateQueue(this, time_domain);
635 main_thread_only().time_domain = time_domain; 641 main_thread_only().time_domain = time_domain;
636 any_thread().time_domain = time_domain; 642 any_thread().time_domain = time_domain;
637 } 643 }
638 644
639 TimeDomain* TaskQueueImpl::GetTimeDomain() const { 645 TimeDomain* TaskQueueImpl::GetTimeDomain() const {
640 if (base::PlatformThread::CurrentId() == thread_id_) 646 if (base::PlatformThread::CurrentId() == thread_id_)
641 return main_thread_only().time_domain; 647 return main_thread_only().time_domain;
642 648
643 base::AutoLock lock(any_thread_lock_); 649 base::AutoLock lock(any_thread_lock_);
644 return any_thread().time_domain; 650 return any_thread().time_domain;
645 } 651 }
646 652
653 void TaskQueueImpl::SetBlameContext(
654 base::debug::BlameContextBase* blame_context) {
655 main_thread_only().blame_context = blame_context;
656 }
657
647 // static 658 // static
648 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, 659 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue,
649 base::trace_event::TracedValue* state) { 660 base::trace_event::TracedValue* state) {
650 std::queue<Task> queue_copy(queue); 661 std::queue<Task> queue_copy(queue);
651 while (!queue_copy.empty()) { 662 while (!queue_copy.empty()) {
652 TaskAsValueInto(queue_copy.front(), state); 663 TaskAsValueInto(queue_copy.front(), state);
653 queue_copy.pop(); 664 queue_copy.pop();
654 } 665 }
655 } 666 }
656 667
(...skipping 22 matching lines...) Expand all
679 state->SetBoolean("nestable", task.nestable); 690 state->SetBoolean("nestable", task.nestable);
680 state->SetBoolean("is_high_res", task.is_high_res); 691 state->SetBoolean("is_high_res", task.is_high_res);
681 state->SetDouble( 692 state->SetDouble(
682 "delayed_run_time", 693 "delayed_run_time",
683 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); 694 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L);
684 state->EndDictionary(); 695 state->EndDictionary();
685 } 696 }
686 697
687 } // namespace internal 698 } // namespace internal
688 } // namespace scheduler 699 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698