OLD | NEW |
---|---|
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/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "cc/debug/devtools_instrumentation.h" | 11 #include "cc/debug/devtools_instrumentation.h" |
12 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
13 #include "cc/scheduler/delay_based_time_source.h" | |
13 #include "ui/gfx/frame_time.h" | 14 #include "ui/gfx/frame_time.h" |
14 | 15 |
15 namespace cc { | 16 namespace cc { |
16 | 17 |
17 Scheduler::Scheduler( | 18 Scheduler::Scheduler( |
18 SchedulerClient* client, | 19 SchedulerClient* client, |
19 const SchedulerSettings& scheduler_settings, | 20 const SchedulerSettings& scheduler_settings, |
20 int layer_tree_host_id, | 21 int layer_tree_host_id, |
21 const scoped_refptr<base::SequencedTaskRunner>& impl_task_runner) | 22 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) |
22 : settings_(scheduler_settings), | 23 : settings_(scheduler_settings), |
23 client_(client), | 24 client_(client), |
24 layer_tree_host_id_(layer_tree_host_id), | 25 layer_tree_host_id_(layer_tree_host_id), |
25 impl_task_runner_(impl_task_runner), | 26 impl_task_runner_(impl_task_runner), |
27 vsync_interval_(BeginFrameArgs::DefaultInterval()), | |
26 last_set_needs_begin_frame_(false), | 28 last_set_needs_begin_frame_(false), |
27 begin_retro_frame_posted_(false), | 29 begin_retro_frame_posted_(false), |
28 state_machine_(scheduler_settings), | 30 state_machine_(scheduler_settings), |
29 inside_process_scheduled_actions_(false), | 31 inside_process_scheduled_actions_(false), |
30 inside_action_(SchedulerStateMachine::ACTION_NONE), | 32 inside_action_(SchedulerStateMachine::ACTION_NONE), |
31 weak_factory_(this) { | 33 weak_factory_(this) { |
32 DCHECK(client_); | 34 DCHECK(client_); |
33 DCHECK(!state_machine_.BeginFrameNeeded()); | 35 DCHECK(!state_machine_.BeginFrameNeeded()); |
34 if (settings_.main_frame_before_activation_enabled) { | 36 if (settings_.main_frame_before_activation_enabled) { |
35 DCHECK(settings_.main_frame_before_draw_enabled); | 37 DCHECK(settings_.main_frame_before_draw_enabled); |
36 } | 38 } |
37 | 39 |
38 begin_retro_frame_closure_ = | 40 begin_retro_frame_closure_ = |
39 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); | 41 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
40 begin_impl_frame_deadline_closure_ = base::Bind( | 42 begin_impl_frame_deadline_closure_ = base::Bind( |
41 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); | 43 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); |
42 poll_for_draw_triggers_closure_ = base::Bind( | 44 poll_for_draw_triggers_closure_ = base::Bind( |
43 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); | 45 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); |
44 advance_commit_state_closure_ = base::Bind( | 46 advance_commit_state_closure_ = base::Bind( |
45 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); | 47 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); |
48 | |
49 if (!settings_.begin_frame_scheduling_enabled) { | |
50 SetupSyntheticBeginFrames(); | |
51 } | |
46 } | 52 } |
47 | 53 |
48 Scheduler::~Scheduler() {} | 54 Scheduler::~Scheduler() {} |
Sami
2014/04/08 13:46:01
Should probably stop the time source here.
brianderson
2014/04/09 02:52:05
The timesource cleans itself up, but it wouldn't h
brianderson
2014/04/10 23:45:58
Done.
| |
49 | 55 |
56 void Scheduler::SetupSyntheticBeginFrames() { | |
57 if (gfx::FrameTime::TimestampsAreHighRes()) { | |
58 time_source_for_synthetic_begin_frames_ = | |
59 DelayBasedTimeSourceHighRes::Create(vsync_interval_, | |
60 impl_task_runner_.get()); | |
61 } else { | |
62 time_source_for_synthetic_begin_frames_ = | |
63 DelayBasedTimeSource::Create(vsync_interval_, impl_task_runner_.get()); | |
64 } | |
65 time_source_for_synthetic_begin_frames_->SetClient(this); | |
66 } | |
67 | |
68 void Scheduler::OnTimerTick() { | |
69 DCHECK(!settings_.begin_frame_scheduling_enabled); | |
70 BeginFrameArgs synthentic_begin_frame_args(CreateSyntheticBeginFrameArgs( | |
71 time_source_for_synthetic_begin_frames_->LastTickTime())); | |
72 BeginFrame(synthentic_begin_frame_args); | |
73 } | |
74 | |
75 BeginFrameArgs Scheduler::CreateSyntheticBeginFrameArgs( | |
76 base::TimeTicks frame_time) { | |
77 base::TimeTicks deadline = | |
78 time_source_for_synthetic_begin_frames_->NextTickTime() - | |
79 estimated_parent_draw_time_; | |
80 return BeginFrameArgs::Create(frame_time, deadline, vsync_interval_); | |
81 } | |
82 | |
83 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, | |
84 base::TimeDelta interval) { | |
85 vsync_interval_ = interval; | |
86 if (!settings_.begin_frame_scheduling_enabled) | |
87 time_source_for_synthetic_begin_frames_->SetTimebaseAndInterval(timebase, | |
88 interval); | |
89 } | |
90 | |
91 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | |
92 estimated_parent_draw_time_ = draw_time; | |
93 } | |
94 | |
50 void Scheduler::SetCanStart() { | 95 void Scheduler::SetCanStart() { |
51 state_machine_.SetCanStart(); | 96 state_machine_.SetCanStart(); |
52 ProcessScheduledActions(); | 97 ProcessScheduledActions(); |
53 } | 98 } |
54 | 99 |
55 void Scheduler::SetVisible(bool visible) { | 100 void Scheduler::SetVisible(bool visible) { |
56 state_machine_.SetVisible(visible); | 101 state_machine_.SetVisible(visible); |
57 ProcessScheduledActions(); | 102 ProcessScheduledActions(); |
58 } | 103 } |
59 | 104 |
(...skipping 29 matching lines...) Expand all Loading... | |
89 void Scheduler::SetNeedsManageTiles() { | 134 void Scheduler::SetNeedsManageTiles() { |
90 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_MANAGE_TILES)); | 135 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_MANAGE_TILES)); |
91 state_machine_.SetNeedsManageTiles(); | 136 state_machine_.SetNeedsManageTiles(); |
92 ProcessScheduledActions(); | 137 ProcessScheduledActions(); |
93 } | 138 } |
94 | 139 |
95 void Scheduler::SetMaxSwapsPending(int max) { | 140 void Scheduler::SetMaxSwapsPending(int max) { |
96 state_machine_.SetMaxSwapsPending(max); | 141 state_machine_.SetMaxSwapsPending(max); |
97 } | 142 } |
98 | 143 |
99 void Scheduler::DidSwapBuffers() { state_machine_.DidSwapBuffers(); } | 144 void Scheduler::DidSwapBuffers() { |
145 DCHECK(state_machine_.HasInitializedOutputSurface()); | |
146 state_machine_.DidSwapBuffers(); | |
147 } | |
100 | 148 |
101 void Scheduler::SetSwapUsedIncompleteTile(bool used_incomplete_tile) { | 149 void Scheduler::SetSwapUsedIncompleteTile(bool used_incomplete_tile) { |
102 state_machine_.SetSwapUsedIncompleteTile(used_incomplete_tile); | 150 state_machine_.SetSwapUsedIncompleteTile(used_incomplete_tile); |
103 ProcessScheduledActions(); | 151 ProcessScheduledActions(); |
104 } | 152 } |
105 | 153 |
106 void Scheduler::OnSwapBuffersComplete() { | 154 void Scheduler::OnSwapBuffersComplete() { |
107 state_machine_.OnSwapBuffersComplete(); | 155 state_machine_.OnSwapBuffersComplete(); |
Sami
2014/04/08 13:46:01
That DCHECK in Scheduler::DidSwapBuffers could go
brianderson
2014/04/09 02:52:05
Good idea.
brianderson
2014/04/10 23:45:58
Done.
| |
108 ProcessScheduledActions(); | 156 ProcessScheduledActions(); |
109 } | 157 } |
110 | 158 |
111 void Scheduler::SetSmoothnessTakesPriority(bool smoothness_takes_priority) { | 159 void Scheduler::SetSmoothnessTakesPriority(bool smoothness_takes_priority) { |
112 state_machine_.SetSmoothnessTakesPriority(smoothness_takes_priority); | 160 state_machine_.SetSmoothnessTakesPriority(smoothness_takes_priority); |
113 ProcessScheduledActions(); | 161 ProcessScheduledActions(); |
114 } | 162 } |
115 | 163 |
116 void Scheduler::SetMainThreadNeedsLayerTextures() { | 164 void Scheduler::SetMainThreadNeedsLayerTextures() { |
117 state_machine_.SetMainThreadNeedsLayerTextures(); | 165 state_machine_.SetMainThreadNeedsLayerTextures(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 return timebase + (begin_impl_frame_args_.interval * intervals); | 215 return timebase + (begin_impl_frame_args_.interval * intervals); |
168 } | 216 } |
169 | 217 |
170 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 218 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
171 return begin_impl_frame_args_.frame_time; | 219 return begin_impl_frame_args_.frame_time; |
172 } | 220 } |
173 | 221 |
174 void Scheduler::SetupNextBeginFrameIfNeeded() { | 222 void Scheduler::SetupNextBeginFrameIfNeeded() { |
175 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); | 223 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); |
176 | 224 |
225 if (settings_.throttle_frame_production) { | |
226 SetupNextBeginFrameWhenVSyncEnabled(needs_begin_frame); | |
Sami
2014/04/08 13:46:01
bikeshed: s/VSync/Throttling/ to keep the terms a
brianderson
2014/04/09 02:52:05
I was afraid of confusing vsync throttling with sw
brianderson
2014/04/10 23:45:58
Done.
| |
227 } else { | |
228 SetupNextBeginFrameWhenVSyncDisabled(needs_begin_frame); | |
229 } | |
230 SetupPollingMechanisms(needs_begin_frame); | |
231 } | |
232 | |
233 // When we are throttling frame production, we request BeginFrames | |
234 // from the OutputSurface. | |
235 void Scheduler::SetupNextBeginFrameWhenVSyncEnabled(bool needs_begin_frame) { | |
177 bool at_end_of_deadline = | 236 bool at_end_of_deadline = |
178 state_machine_.begin_impl_frame_state() == | 237 state_machine_.begin_impl_frame_state() == |
179 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; | 238 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; |
180 | 239 |
181 bool should_call_set_needs_begin_frame = | 240 bool should_call_set_needs_begin_frame = |
182 // Always request the BeginFrame immediately if it wasn't needed before. | 241 // Always request the BeginFrame immediately if it wasn't needed before. |
183 (needs_begin_frame && !last_set_needs_begin_frame_) || | 242 (needs_begin_frame && !last_set_needs_begin_frame_) || |
184 // We always need to explicitly request our next BeginFrame. | 243 // Only stop requesting BeginFrames after a deadline. |
185 at_end_of_deadline; | 244 (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); |
186 | 245 |
187 if (should_call_set_needs_begin_frame) { | 246 if (should_call_set_needs_begin_frame) { |
188 client_->SetNeedsBeginFrame(needs_begin_frame); | 247 if (settings_.begin_frame_scheduling_enabled) { |
248 client_->SetNeedsBeginFrame(needs_begin_frame); | |
249 } else { | |
250 base::TimeTicks missed_tick_time = | |
251 time_source_for_synthetic_begin_frames_->SetActive(needs_begin_frame); | |
252 if (!missed_tick_time.is_null()) { | |
253 begin_retro_frame_args_.push_back( | |
254 CreateSyntheticBeginFrameArgs(missed_tick_time)); | |
255 } | |
256 } | |
189 last_set_needs_begin_frame_ = needs_begin_frame; | 257 last_set_needs_begin_frame_ = needs_begin_frame; |
190 } | 258 } |
191 | 259 |
192 // Handle retroactive BeginFrames. | |
193 if (needs_begin_frame) | 260 if (needs_begin_frame) |
194 PostBeginRetroFrameIfNeeded(); | 261 PostBeginRetroFrameIfNeeded(); |
262 } | |
195 | 263 |
264 // When we aren't throttling frame production, we create our own | |
265 // BeginImplFrames as soon as we go idle, using the BeginRetroFrame logic. | |
266 void Scheduler::SetupNextBeginFrameWhenVSyncDisabled(bool needs_begin_frame) { | |
267 last_set_needs_begin_frame_ = needs_begin_frame; | |
268 | |
269 if (!needs_begin_frame || begin_retro_frame_posted_) | |
270 return; | |
271 | |
272 if (state_machine_.begin_impl_frame_state() != | |
273 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE && | |
274 state_machine_.begin_impl_frame_state() != | |
275 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { | |
276 return; | |
277 } | |
278 | |
279 base::TimeTicks now = gfx::FrameTime::Now(); | |
280 base::TimeDelta interval = vsync_interval_ > base::TimeDelta() | |
281 ? vsync_interval_ | |
282 : BeginFrameArgs::DefaultInterval(); | |
283 | |
284 DCHECK(begin_retro_frame_args_.empty()); | |
285 begin_retro_frame_args_.push_back( | |
286 BeginFrameArgs::Create(now, now + interval, interval)); | |
287 PostBeginRetroFrame(); | |
288 } | |
289 | |
290 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { | |
196 bool needs_advance_commit_state_timer = false; | 291 bool needs_advance_commit_state_timer = false; |
197 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but | 292 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but |
198 // aren't expecting any more BeginFrames. This should only be needed by | 293 // aren't expecting any more BeginFrames. This should only be needed by |
199 // the synchronous compositor when BeginFrameNeeded is false. | 294 // the synchronous compositor when BeginFrameNeeded is false. |
200 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { | 295 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { |
201 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); | 296 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); |
202 DCHECK(!needs_begin_frame); | 297 DCHECK(!needs_begin_frame); |
203 if (poll_for_draw_triggers_task_.IsCancelled()) { | 298 if (poll_for_draw_triggers_task_.IsCancelled()) { |
204 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); | 299 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); |
205 base::TimeDelta delay = begin_impl_frame_args_.IsValid() | 300 base::TimeDelta delay = begin_impl_frame_args_.IsValid() |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
249 | 344 |
250 if (state_machine_.begin_impl_frame_state() != | 345 if (state_machine_.begin_impl_frame_state() != |
251 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) | 346 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) |
252 return; | 347 return; |
253 | 348 |
254 begin_retro_frame_posted_ = true; | 349 begin_retro_frame_posted_ = true; |
255 impl_task_runner_->PostTask(FROM_HERE, begin_retro_frame_closure_); | 350 impl_task_runner_->PostTask(FROM_HERE, begin_retro_frame_closure_); |
256 } | 351 } |
257 | 352 |
258 void Scheduler::BeginFrame(const BeginFrameArgs& args) { | 353 void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
354 DCHECK(settings_.throttle_frame_production); | |
259 if (settings_.using_synchronous_renderer_compositor || | 355 if (settings_.using_synchronous_renderer_compositor || |
260 (last_set_needs_begin_frame_ && begin_retro_frame_args_.empty() && | 356 (last_set_needs_begin_frame_ && begin_retro_frame_args_.empty() && |
261 state_machine_.begin_impl_frame_state() == | 357 state_machine_.begin_impl_frame_state() == |
262 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE)) { | 358 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE)) { |
263 BeginImplFrame(args); | 359 BeginImplFrame(args); |
264 } else { | 360 } else { |
265 begin_retro_frame_args_.push_back(args); | 361 begin_retro_frame_args_.push_back(args); |
266 TRACE_EVENT_INSTANT0( | 362 TRACE_EVENT_INSTANT0( |
267 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); | 363 "cc", "Scheduler::BeginFrame deferred", TRACE_EVENT_SCOPE_THREAD); |
268 } | 364 } |
269 } | 365 } |
270 | 366 |
367 void Scheduler::PostBeginRetroFrame() { | |
368 begin_retro_frame_posted_ = true; | |
369 impl_task_runner_->PostTask(FROM_HERE, begin_retro_frame_closure_); | |
370 } | |
371 | |
271 void Scheduler::BeginRetroFrame() { | 372 void Scheduler::BeginRetroFrame() { |
272 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); | 373 TRACE_EVENT0("cc", "Scheduler::BeginRetroFrame"); |
273 DCHECK(begin_retro_frame_posted_); | 374 DCHECK(begin_retro_frame_posted_); |
274 DCHECK(!begin_retro_frame_args_.empty()); | 375 DCHECK(!begin_retro_frame_args_.empty()); |
275 | 376 |
276 // Discard expired BeginRetroFrames | 377 // Discard expired BeginRetroFrames |
277 base::TimeTicks now = gfx::FrameTime::Now(); | 378 // Not if frame production isn't throttled though, since all frames will be |
Sami
2014/04/08 13:46:01
This is getting a little confusing. Should we perh
brianderson
2014/04/09 02:52:05
This is for the unthrottled (vsync disabled) frame
brianderson
2014/04/10 23:45:58
Added a BeginUnthrottledFrame with a separate clos
| |
278 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); | 379 // BeginRetroFrames. |
279 while (!begin_retro_frame_args_.empty() && | 380 if (settings_.throttle_frame_production) { |
280 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), | 381 base::TimeTicks now = gfx::FrameTime::Now(); |
281 draw_duration_estimate)) { | 382 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); |
282 begin_retro_frame_args_.pop_front(); | 383 while (!begin_retro_frame_args_.empty() && |
384 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), | |
385 draw_duration_estimate)) { | |
386 begin_retro_frame_args_.pop_front(); | |
387 } | |
283 } | 388 } |
284 | 389 |
285 if (begin_retro_frame_args_.empty()) { | 390 if (begin_retro_frame_args_.empty()) { |
391 DCHECK(settings_.throttle_frame_production); | |
286 TRACE_EVENT_INSTANT0( | 392 TRACE_EVENT_INSTANT0( |
287 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); | 393 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); |
288 } else { | 394 } else { |
289 BeginImplFrame(begin_retro_frame_args_.front()); | 395 BeginImplFrame(begin_retro_frame_args_.front()); |
290 begin_retro_frame_args_.pop_front(); | 396 begin_retro_frame_args_.pop_front(); |
291 } | 397 } |
292 | 398 |
293 begin_retro_frame_posted_ = false; | 399 begin_retro_frame_posted_ = false; |
294 } | 400 } |
295 | 401 |
296 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { | 402 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { |
297 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame"); | |
298 DCHECK(state_machine_.begin_impl_frame_state() == | 403 DCHECK(state_machine_.begin_impl_frame_state() == |
299 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 404 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
300 DCHECK(state_machine_.HasInitializedOutputSurface()); | 405 DCHECK(state_machine_.HasInitializedOutputSurface()); |
301 | 406 |
302 advance_commit_state_task_.Cancel(); | 407 advance_commit_state_task_.Cancel(); |
303 | 408 |
304 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); | 409 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); |
305 begin_impl_frame_args_ = args; | 410 begin_impl_frame_args_ = args; |
306 begin_impl_frame_args_.deadline -= draw_duration_estimate; | 411 begin_impl_frame_args_.deadline -= draw_duration_estimate; |
307 | 412 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
546 } | 651 } |
547 | 652 |
548 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 653 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
549 return (state_machine_.commit_state() == | 654 return (state_machine_.commit_state() == |
550 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 655 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
551 state_machine_.commit_state() == | 656 state_machine_.commit_state() == |
552 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 657 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
553 } | 658 } |
554 | 659 |
555 } // namespace cc | 660 } // namespace cc |
OLD | NEW |