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

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

Issue 2113893006: POC: Instrument task time tracker Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: undo delegate delete Created 4 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_manager.h" 5 #include "components/scheduler/base/task_queue_manager.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "components/scheduler/base/real_time_domain.h" 13 #include "components/scheduler/base/real_time_domain.h"
14 #include "components/scheduler/base/task_queue_impl.h" 14 #include "components/scheduler/base/task_queue_impl.h"
15 #include "components/scheduler/base/task_queue_manager_delegate.h" 15 #include "components/scheduler/base/task_queue_manager_delegate.h"
16 #include "components/scheduler/base/task_queue_selector.h" 16 #include "components/scheduler/base/task_queue_selector.h"
17 #include "components/scheduler/base/task_time_tracker.h"
17 #include "components/scheduler/base/work_queue.h" 18 #include "components/scheduler/base/work_queue.h"
18 #include "components/scheduler/base/work_queue_sets.h" 19 #include "components/scheduler/base/work_queue_sets.h"
19 20
20 namespace scheduler { 21 namespace scheduler {
21 22
22 namespace { 23 namespace {
23 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; 24 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10;
24 25
25 void RecordDelayedTaskLateness(base::TimeDelta lateness) { 26 void RecordDelayedTaskLateness(base::TimeDelta lateness) {
26 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", 27 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness",
27 lateness); 28 lateness);
28 } 29 }
29 30
30 void RecordImmediateTaskQueueingDuration(tracked_objects::Duration duration) { 31 void RecordImmediateTaskQueueingDuration(tracked_objects::Duration duration) {
31 UMA_HISTOGRAM_TIMES( 32 UMA_HISTOGRAM_TIMES(
32 "RendererScheduler.TaskQueueManager.ImmediateTaskQueueingDuration", 33 "RendererScheduler.TaskQueueManager.ImmediateTaskQueueingDuration",
33 base::TimeDelta::FromMilliseconds(duration.InMilliseconds())); 34 base::TimeDelta::FromMilliseconds(duration.InMilliseconds()));
34 } 35 }
35 } 36 }
36 37
37 TaskQueueManager::TaskQueueManager( 38 TaskQueueManager::TaskQueueManager(
38 scoped_refptr<TaskQueueManagerDelegate> delegate, 39 scoped_refptr<TaskQueueManagerDelegate> delegate,
39 const char* tracing_category, 40 const char* tracing_category,
40 const char* disabled_by_default_tracing_category, 41 const char* disabled_by_default_tracing_category,
41 const char* disabled_by_default_verbose_tracing_category) 42 const char* disabled_by_default_verbose_tracing_category,
43 TaskTimeTracker* task_time_tracker)
42 : real_time_domain_(new RealTimeDomain(tracing_category)), 44 : real_time_domain_(new RealTimeDomain(tracing_category)),
43 delegate_(delegate), 45 delegate_(delegate),
44 task_was_run_on_quiescence_monitored_queue_(false), 46 task_was_run_on_quiescence_monitored_queue_(false),
45 work_batch_size_(1), 47 work_batch_size_(1),
46 task_count_(0), 48 task_count_(0),
49 task_time_tracker_(new TaskTimeTracker()),
50 timer_(new base::DefaultTickClock()),
Sami 2016/07/04 09:56:49 You might be able to read the time from real_time_
51 next_task_start_time_(base::TimeTicks()),
47 tracing_category_(tracing_category), 52 tracing_category_(tracing_category),
48 disabled_by_default_tracing_category_( 53 disabled_by_default_tracing_category_(
49 disabled_by_default_tracing_category), 54 disabled_by_default_tracing_category),
50 disabled_by_default_verbose_tracing_category_( 55 disabled_by_default_verbose_tracing_category_(
51 disabled_by_default_verbose_tracing_category), 56 disabled_by_default_verbose_tracing_category),
52 currently_executing_task_queue_(nullptr), 57 currently_executing_task_queue_(nullptr),
53 observer_(nullptr), 58 observer_(nullptr),
54 deletion_sentinel_(new DeletionSentinel()), 59 deletion_sentinel_(new DeletionSentinel()),
55 weak_factory_(this) { 60 weak_factory_(this) {
56 DCHECK(delegate->RunsTasksOnCurrentThread()); 61 DCHECK(delegate->RunsTasksOnCurrentThread());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 } 190 }
186 191
187 if (!delegate_->IsNested()) 192 if (!delegate_->IsNested())
188 queues_to_delete_.clear(); 193 queues_to_delete_.clear();
189 194
190 // Pass false and nullptr to UpdateWorkQueues here to prevent waking up a 195 // Pass false and nullptr to UpdateWorkQueues here to prevent waking up a
191 // pump-after-wakeup queue. 196 // pump-after-wakeup queue.
192 UpdateWorkQueues(false, nullptr); 197 UpdateWorkQueues(false, nullptr);
193 198
194 internal::TaskQueueImpl::Task previous_task; 199 internal::TaskQueueImpl::Task previous_task;
200 base::TimeTicks task_start_time = timer_->NowTicks();
195 for (int i = 0; i < work_batch_size_; i++) { 201 for (int i = 0; i < work_batch_size_; i++) {
196 internal::WorkQueue* work_queue; 202 internal::WorkQueue* work_queue;
197 if (!SelectWorkQueueToService(&work_queue)) { 203 if (!SelectWorkQueueToService(&work_queue)) {
198 break; 204 break;
199 } 205 }
200 206
201 bool should_trigger_wakeup = work_queue->task_queue()->wakeup_policy() == 207 bool should_trigger_wakeup = work_queue->task_queue()->wakeup_policy() ==
202 TaskQueue::WakeupPolicy::CAN_WAKE_OTHER_QUEUES; 208 TaskQueue::WakeupPolicy::CAN_WAKE_OTHER_QUEUES;
203 switch (ProcessTaskFromWorkQueue(work_queue, &previous_task)) { 209 switch (ProcessTaskFromWorkQueue(work_queue, &previous_task)) {
204 case ProcessTaskResult::DEFERRED: 210 case ProcessTaskResult::DEFERRED:
205 // If a task was deferred, try again with another task. Note that this 211 // If a task was deferred, try again with another task. Note that this
206 // means deferred tasks (i.e. non-nestable tasks) will never trigger 212 // means deferred tasks (i.e. non-nestable tasks) will never trigger
207 // queue wake-ups. 213 // queue wake-ups.
208 continue; 214 continue;
209 case ProcessTaskResult::EXECUTED: 215 case ProcessTaskResult::EXECUTED:
210 break; 216 break;
211 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: 217 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED:
212 return; // The TaskQueueManager got deleted, we must bail out. 218 return; // The TaskQueueManager got deleted, we must bail out.
213 } 219 }
220 base::TimeTicks task_end_time = timer_->NowTicks();
221 task_time_tracker_->ReportTaskTime(task_start_time, task_end_time);
222 task_start_time = task_end_time;
223
214 work_queue = nullptr; // The queue may have been unregistered. 224 work_queue = nullptr; // The queue may have been unregistered.
215 225
216 UpdateWorkQueues(should_trigger_wakeup, &previous_task); 226 UpdateWorkQueues(should_trigger_wakeup, &previous_task);
217 227
218 // Only run a single task per batch in nested run loops so that we can 228 // Only run a single task per batch in nested run loops so that we can
219 // properly exit the nested loop when someone calls RunLoop::Quit(). 229 // properly exit the nested loop when someone calls RunLoop::Quit().
220 if (delegate_->IsNested()) 230 if (delegate_->IsNested())
221 break; 231 break;
222 } 232 }
223 233
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 internal::WorkQueue* work_queue) { 419 internal::WorkQueue* work_queue) {
410 DCHECK(main_thread_checker_.CalledOnValidThread()); 420 DCHECK(main_thread_checker_.CalledOnValidThread());
411 DCHECK(!work_queue->Empty()); 421 DCHECK(!work_queue->Empty());
412 if (observer_) { 422 if (observer_) {
413 observer_->OnTriedToExecuteBlockedTask(*work_queue->task_queue(), 423 observer_->OnTriedToExecuteBlockedTask(*work_queue->task_queue(),
414 *work_queue->GetFrontTask()); 424 *work_queue->GetFrontTask());
415 } 425 }
416 } 426 }
417 427
418 } // namespace scheduler 428 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/base/task_queue_manager.h ('k') | components/scheduler/base/task_time_tracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698