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

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: Make sure blame context is initialized early enough 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 "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 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 } 606 }
605 607
606 void TaskQueueImpl::RemoveTaskObserver( 608 void TaskQueueImpl::RemoveTaskObserver(
607 base::MessageLoop::TaskObserver* task_observer) { 609 base::MessageLoop::TaskObserver* task_observer) {
608 main_thread_only().task_observers.RemoveObserver(task_observer); 610 main_thread_only().task_observers.RemoveObserver(task_observer);
609 } 611 }
610 612
611 void TaskQueueImpl::NotifyWillProcessTask( 613 void TaskQueueImpl::NotifyWillProcessTask(
612 const base::PendingTask& pending_task) { 614 const base::PendingTask& pending_task) {
613 DCHECK(should_notify_observers_); 615 DCHECK(should_notify_observers_);
616 if (main_thread_only().blame_context)
617 main_thread_only().blame_context->Enter();
614 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, 618 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver,
615 main_thread_only().task_observers, 619 main_thread_only().task_observers,
616 WillProcessTask(pending_task)); 620 WillProcessTask(pending_task));
617 } 621 }
618 622
619 void TaskQueueImpl::NotifyDidProcessTask( 623 void TaskQueueImpl::NotifyDidProcessTask(
620 const base::PendingTask& pending_task) { 624 const base::PendingTask& pending_task) {
621 DCHECK(should_notify_observers_); 625 DCHECK(should_notify_observers_);
622 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, 626 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver,
623 main_thread_only().task_observers, 627 main_thread_only().task_observers,
624 DidProcessTask(pending_task)); 628 DidProcessTask(pending_task));
629 if (main_thread_only().blame_context)
630 main_thread_only().blame_context->Leave();
625 } 631 }
626 632
627 void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) { 633 void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) {
628 base::AutoLock lock(any_thread_lock_); 634 base::AutoLock lock(any_thread_lock_);
629 DCHECK(time_domain); 635 DCHECK(time_domain);
630 // NOTE this is similar to checking |any_thread().task_queue_manager| but the 636 // NOTE this is similar to checking |any_thread().task_queue_manager| but the
631 // TaskQueueSelectorTests constructs TaskQueueImpl directly with a null 637 // TaskQueueSelectorTests constructs TaskQueueImpl directly with a null
632 // task_queue_manager. Instead we check |any_thread().time_domain| which is 638 // task_queue_manager. Instead we check |any_thread().time_domain| which is
633 // another way of asserting that UnregisterTaskQueue has not been called. 639 // another way of asserting that UnregisterTaskQueue has not been called.
634 DCHECK(any_thread().time_domain); 640 DCHECK(any_thread().time_domain);
635 if (!any_thread().time_domain) 641 if (!any_thread().time_domain)
636 return; 642 return;
637 DCHECK(main_thread_checker_.CalledOnValidThread()); 643 DCHECK(main_thread_checker_.CalledOnValidThread());
638 if (time_domain == main_thread_only().time_domain) 644 if (time_domain == main_thread_only().time_domain)
639 return; 645 return;
640 646
641 main_thread_only().time_domain->MigrateQueue(this, time_domain); 647 main_thread_only().time_domain->MigrateQueue(this, time_domain);
642 main_thread_only().time_domain = time_domain; 648 main_thread_only().time_domain = time_domain;
643 any_thread().time_domain = time_domain; 649 any_thread().time_domain = time_domain;
644 } 650 }
645 651
646 TimeDomain* TaskQueueImpl::GetTimeDomain() const { 652 TimeDomain* TaskQueueImpl::GetTimeDomain() const {
647 if (base::PlatformThread::CurrentId() == thread_id_) 653 if (base::PlatformThread::CurrentId() == thread_id_)
648 return main_thread_only().time_domain; 654 return main_thread_only().time_domain;
649 655
650 base::AutoLock lock(any_thread_lock_); 656 base::AutoLock lock(any_thread_lock_);
651 return any_thread().time_domain; 657 return any_thread().time_domain;
652 } 658 }
653 659
660 void TaskQueueImpl::SetBlameContext(
661 base::trace_event::BlameContext* blame_context) {
662 main_thread_only().blame_context = blame_context;
663 }
664
654 // static 665 // static
655 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, 666 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue,
656 base::trace_event::TracedValue* state) { 667 base::trace_event::TracedValue* state) {
657 std::queue<Task> queue_copy(queue); 668 std::queue<Task> queue_copy(queue);
658 while (!queue_copy.empty()) { 669 while (!queue_copy.empty()) {
659 TaskAsValueInto(queue_copy.front(), state); 670 TaskAsValueInto(queue_copy.front(), state);
660 queue_copy.pop(); 671 queue_copy.pop();
661 } 672 }
662 } 673 }
663 674
(...skipping 22 matching lines...) Expand all
686 state->SetBoolean("nestable", task.nestable); 697 state->SetBoolean("nestable", task.nestable);
687 state->SetBoolean("is_high_res", task.is_high_res); 698 state->SetBoolean("is_high_res", task.is_high_res);
688 state->SetDouble( 699 state->SetDouble(
689 "delayed_run_time", 700 "delayed_run_time",
690 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); 701 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L);
691 state->EndDictionary(); 702 state->EndDictionary();
692 } 703 }
693 704
694 } // namespace internal 705 } // namespace internal
695 } // namespace scheduler 706 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/base/task_queue_impl.h ('k') | components/scheduler/base/task_queue_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698