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

Side by Side Diff: cc/scheduler/delay_based_time_source.cc

Issue 17362002: cc: Remove FakeThread, use SingleThreadTaskRunner in scheduling classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rm-fakethread: rebase Created 7 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/scheduler/delay_based_time_source.h" 5 #include "cc/scheduler/delay_based_time_source.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/message_loop.h" 12 #include "base/single_thread_task_runner.h"
13 #include "cc/base/thread.h"
14 13
15 namespace cc { 14 namespace cc {
16 15
17 namespace { 16 namespace {
18 17
19 // kDoubleTickThreshold prevents ticks from running within the specified 18 // kDoubleTickThreshold prevents ticks from running within the specified
20 // fraction of an interval. This helps account for jitter in the timebase as 19 // fraction of an interval. This helps account for jitter in the timebase as
21 // well as quick timer reactivation. 20 // well as quick timer reactivation.
22 static const double kDoubleTickThreshold = 0.25; 21 static const double kDoubleTickThreshold = 0.25;
23 22
24 // kIntervalChangeThreshold is the fraction of the interval that will trigger an 23 // kIntervalChangeThreshold is the fraction of the interval that will trigger an
25 // immediate interval change. kPhaseChangeThreshold is the fraction of the 24 // immediate interval change. kPhaseChangeThreshold is the fraction of the
26 // interval that will trigger an immediate phase change. If the changes are 25 // interval that will trigger an immediate phase change. If the changes are
27 // within the thresholds, the change will take place on the next tick. If 26 // within the thresholds, the change will take place on the next tick. If
28 // either change is outside the thresholds, the next tick will be canceled and 27 // either change is outside the thresholds, the next tick will be canceled and
29 // reissued immediately. 28 // reissued immediately.
30 static const double kIntervalChangeThreshold = 0.25; 29 static const double kIntervalChangeThreshold = 0.25;
31 static const double kPhaseChangeThreshold = 0.25; 30 static const double kPhaseChangeThreshold = 0.25;
32 31
33 } // namespace 32 } // namespace
34 33
35 scoped_refptr<DelayBasedTimeSource> DelayBasedTimeSource::Create( 34 scoped_refptr<DelayBasedTimeSource> DelayBasedTimeSource::Create(
36 base::TimeDelta interval, 35 base::TimeDelta interval,
37 Thread* thread) { 36 base::SingleThreadTaskRunner* task_runner) {
38 return make_scoped_refptr(new DelayBasedTimeSource(interval, thread)); 37 return make_scoped_refptr(new DelayBasedTimeSource(interval, task_runner));
39 } 38 }
40 39
41 DelayBasedTimeSource::DelayBasedTimeSource(base::TimeDelta interval, 40 DelayBasedTimeSource::DelayBasedTimeSource(
42 Thread* thread) 41 base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner)
43 : client_(NULL), 42 : client_(NULL),
44 has_tick_target_(false), 43 has_tick_target_(false),
45 current_parameters_(interval, base::TimeTicks()), 44 current_parameters_(interval, base::TimeTicks()),
46 next_parameters_(interval, base::TimeTicks()), 45 next_parameters_(interval, base::TimeTicks()),
47 state_(STATE_INACTIVE), 46 state_(STATE_INACTIVE),
48 thread_(thread), 47 task_runner_(task_runner),
49 weak_factory_(this) {} 48 weak_factory_(this) {}
50 49
51 DelayBasedTimeSource::~DelayBasedTimeSource() {} 50 DelayBasedTimeSource::~DelayBasedTimeSource() {}
52 51
53 void DelayBasedTimeSource::SetActive(bool active) { 52 void DelayBasedTimeSource::SetActive(bool active) {
54 TRACE_EVENT1("cc", "DelayBasedTimeSource::SetActive", "active", active); 53 TRACE_EVENT1("cc", "DelayBasedTimeSource::SetActive", "active", active);
55 if (!active) { 54 if (!active) {
56 state_ = STATE_INACTIVE; 55 state_ = STATE_INACTIVE;
57 weak_factory_.InvalidateWeakPtrs(); 56 weak_factory_.InvalidateWeakPtrs();
58 return; 57 return;
59 } 58 }
60 59
61 if (state_ == STATE_STARTING || state_ == STATE_ACTIVE) 60 if (state_ == STATE_STARTING || state_ == STATE_ACTIVE)
62 return; 61 return;
63 62
64 if (!has_tick_target_) { 63 if (!has_tick_target_) {
65 // Becoming active the first time is deferred: we post a 0-delay task. 64 // Becoming active the first time is deferred: we post a 0-delay task.
66 // When it runs, we use that to establish the timebase, become truly 65 // When it runs, we use that to establish the timebase, become truly
67 // active, and fire the first tick. 66 // active, and fire the first tick.
68 state_ = STATE_STARTING; 67 state_ = STATE_STARTING;
69 thread_->PostTask(base::Bind(&DelayBasedTimeSource::OnTimerFired, 68 task_runner_->PostTask(FROM_HERE,
70 weak_factory_.GetWeakPtr())); 69 base::Bind(&DelayBasedTimeSource::OnTimerFired,
70 weak_factory_.GetWeakPtr()));
71 return; 71 return;
72 } 72 }
73 73
74 state_ = STATE_ACTIVE; 74 state_ = STATE_ACTIVE;
75 75
76 PostNextTickTask(Now()); 76 PostNextTickTask(Now());
77 } 77 }
78 78
79 bool DelayBasedTimeSource::Active() const { return state_ != STATE_INACTIVE; } 79 bool DelayBasedTimeSource::Active() const { return state_ != STATE_INACTIVE; }
80 80
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 } 231 }
232 232
233 void DelayBasedTimeSource::PostNextTickTask(base::TimeTicks now) { 233 void DelayBasedTimeSource::PostNextTickTask(base::TimeTicks now) {
234 base::TimeTicks new_tick_target = NextTickTarget(now); 234 base::TimeTicks new_tick_target = NextTickTarget(now);
235 235
236 // Post another task *before* the tick and update state 236 // Post another task *before* the tick and update state
237 base::TimeDelta delay = new_tick_target - now; 237 base::TimeDelta delay = new_tick_target - now;
238 DCHECK(delay.InMillisecondsF() <= 238 DCHECK(delay.InMillisecondsF() <=
239 next_parameters_.interval.InMillisecondsF() * 239 next_parameters_.interval.InMillisecondsF() *
240 (1.0 + kDoubleTickThreshold)); 240 (1.0 + kDoubleTickThreshold));
241 thread_->PostDelayedTask(base::Bind(&DelayBasedTimeSource::OnTimerFired, 241 task_runner_->PostDelayedTask(FROM_HERE,
242 weak_factory_.GetWeakPtr()), 242 base::Bind(&DelayBasedTimeSource::OnTimerFired,
243 delay); 243 weak_factory_.GetWeakPtr()),
244 delay);
244 245
245 next_parameters_.tick_target = new_tick_target; 246 next_parameters_.tick_target = new_tick_target;
246 current_parameters_ = next_parameters_; 247 current_parameters_ = next_parameters_;
247 } 248 }
248 249
249 } // namespace cc 250 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/delay_based_time_source.h ('k') | cc/scheduler/delay_based_time_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698