OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/scheduler/child/single_thread_idle_task_runner.h" | |
6 | |
7 #include "base/location.h" | |
8 #include "base/trace_event/blame_context.h" | |
9 #include "base/trace_event/trace_event.h" | |
10 | |
11 namespace scheduler { | |
12 | |
13 SingleThreadIdleTaskRunner::SingleThreadIdleTaskRunner( | |
14 scoped_refptr<base::SingleThreadTaskRunner> idle_priority_task_runner, | |
15 scoped_refptr<base::SingleThreadTaskRunner> after_wakeup_task_runner, | |
16 Delegate* delegate, | |
17 const char* tracing_category) | |
18 : idle_priority_task_runner_(idle_priority_task_runner), | |
19 after_wakeup_task_runner_(after_wakeup_task_runner), | |
20 delegate_(delegate), | |
21 tracing_category_(tracing_category), | |
22 blame_context_(nullptr), | |
23 weak_factory_(this) { | |
24 DCHECK(!idle_priority_task_runner_ || | |
25 idle_priority_task_runner_->RunsTasksOnCurrentThread()); | |
26 DCHECK(!after_wakeup_task_runner_ || | |
27 after_wakeup_task_runner_->RunsTasksOnCurrentThread()); | |
28 weak_scheduler_ptr_ = weak_factory_.GetWeakPtr(); | |
29 } | |
30 | |
31 SingleThreadIdleTaskRunner::~SingleThreadIdleTaskRunner() { | |
32 } | |
33 | |
34 SingleThreadIdleTaskRunner::Delegate::Delegate() { | |
35 } | |
36 | |
37 SingleThreadIdleTaskRunner::Delegate::~Delegate() { | |
38 } | |
39 | |
40 bool SingleThreadIdleTaskRunner::RunsTasksOnCurrentThread() const { | |
41 return idle_priority_task_runner_->RunsTasksOnCurrentThread(); | |
42 } | |
43 | |
44 void SingleThreadIdleTaskRunner::PostIdleTask( | |
45 const tracked_objects::Location& from_here, | |
46 const IdleTask& idle_task) { | |
47 delegate_->OnIdleTaskPosted(); | |
48 idle_priority_task_runner_->PostTask( | |
49 from_here, base::Bind(&SingleThreadIdleTaskRunner::RunTask, | |
50 weak_scheduler_ptr_, idle_task)); | |
51 } | |
52 | |
53 void SingleThreadIdleTaskRunner::PostNonNestableIdleTask( | |
54 const tracked_objects::Location& from_here, | |
55 const IdleTask& idle_task) { | |
56 delegate_->OnIdleTaskPosted(); | |
57 idle_priority_task_runner_->PostNonNestableTask( | |
58 from_here, base::Bind(&SingleThreadIdleTaskRunner::RunTask, | |
59 weak_scheduler_ptr_, idle_task)); | |
60 } | |
61 | |
62 void SingleThreadIdleTaskRunner::PostIdleTaskAfterWakeup( | |
63 const tracked_objects::Location& from_here, | |
64 const IdleTask& idle_task) { | |
65 // Don't signal posting of idle task to the delegate here, wait until the | |
66 // after-wakeup task posts the real idle task. | |
67 after_wakeup_task_runner_->PostTask( | |
68 FROM_HERE, base::Bind(&SingleThreadIdleTaskRunner::PostIdleTask, | |
69 weak_scheduler_ptr_, from_here, idle_task)); | |
70 } | |
71 | |
72 void SingleThreadIdleTaskRunner::RunTask(IdleTask idle_task) { | |
73 base::TimeTicks deadline = delegate_->WillProcessIdleTask(); | |
74 TRACE_EVENT1(tracing_category_, "SingleThreadIdleTaskRunner::RunTask", | |
75 "allotted_time_ms", | |
76 (deadline - base::TimeTicks::Now()).InMillisecondsF()); | |
77 if (blame_context_) | |
78 blame_context_->Enter(); | |
79 idle_task.Run(deadline); | |
80 if (blame_context_) | |
81 blame_context_->Leave(); | |
82 delegate_->DidProcessIdleTask(); | |
83 } | |
84 | |
85 void SingleThreadIdleTaskRunner::SetBlameContext( | |
86 base::trace_event::BlameContext* blame_context) { | |
87 blame_context_ = blame_context; | |
88 } | |
89 | |
90 } // namespace scheduler | |
OLD | NEW |