scheduler_state_machine.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_SCHEDULER_SCHEDULER_STATE_MACHINE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_SCHEDULER_SCHEDULER_STATE_MACHINE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/scheduler_settings.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The SchedulerStateMachine decides how to coordinate main thread activites 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// like painting/running javascript with rendering and input activities on the 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// impl thread. 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The state machine tracks internal state but is also influenced by external 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// state. Internal state includes things like whether a frame has been 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// requested, while external state includes things like the current time being 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// near to the vblank time. 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The scheduler seperates "what to do next" from the updating of its internal 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// state to make testing cleaner. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT SchedulerStateMachine { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // settings must be valid for the lifetime of this class. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulerStateMachine(const SchedulerSettings& settings); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum CommitState { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMMIT_STATE_IDLE, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMMIT_STATE_FRAME_IN_PROGRESS, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMMIT_STATE_READY_TO_COMMIT, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMMIT_STATE_WAITING_FOR_FIRST_DRAW, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum TextureState { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAYER_TEXTURE_STATE_UNLOCKED, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum OutputSurfaceState { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OUTPUT_SURFACE_ACTIVE, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OUTPUT_SURFACE_LOST, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OUTPUT_SURFACE_RECREATING, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool CommitPending() const { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return commit_state_ == COMMIT_STATE_FRAME_IN_PROGRESS || 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) commit_state_ == COMMIT_STATE_READY_TO_COMMIT; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RedrawPending() const { return needs_redraw_; } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Action { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_NONE, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_BEGIN_FRAME, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_COMMIT, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_CHECK_FOR_COMPLETED_TILE_UPLOADS, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_DRAW_IF_POSSIBLE, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_DRAW_FORCED, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_BEGIN_OUTPUT_SURFACE_RECREATION, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Action NextAction() const; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateState(Action action); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether the scheduler needs a vsync callback in order to make 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // progress. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool VSyncCallbackNeeded() const; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates that the system has entered and left a vsync callback. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The scheduler will not draw more than once in a given vsync callback. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidEnterVSync(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidLeaveVSync(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether the LayerTreeHostImpl is visible. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetVisible(bool visible); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates that a redraw is required, either due to the impl tree changing 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the screen being damaged and simply needing redisplay. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNeedsRedraw(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // As SetNeedsRedraw(), but ensures the draw will definitely happen even if 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we are not visible. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNeedsForcedRedraw(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates that a redraw is required because we are currently rendering 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with a low resolution or checkerboarded tile. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidSwapUseIncompleteTile(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether ACTION_DRAW_IF_POSSIBLE drew to the screen or not. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidDrawIfPossibleCompleted(bool success); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates that a new commit flow needs to be performed, either to pull 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // updates from the main thread to the impl, or to push deltas from the impl 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread to main. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNeedsCommit(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // As SetNeedsCommit(), but ensures the BeginFrame will definitely happen even 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if we are not visible. After this call we expect to go through the forced 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // commit flow and then return to waiting for a non-forced BeginFrame to 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // finish. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNeedsForcedCommit(); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call this only in response to receiving an ACTION_BEGIN_FRAME 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from NextAction. Indicates that all painting is complete. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void BeginFrameComplete(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call this only in response to receiving an ACTION_BEGIN_FRAME 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from NextAction if the client rejects the BeginFrame message. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void BeginFrameAborted(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Request exclusive access to the textures that back single buffered 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layers on behalf of the main thread. Upon acquisition, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ACTION_DRAW_IF_POSSIBLE will not draw until the main thread releases the 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // textures to the impl thread by committing the layers. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetMainThreadNeedsLayerTextures(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether we can successfully begin a frame at this time. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetCanBeginFrame(bool can) { can_begin_frame_ = can; } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether drawing would, at this time, make sense. 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CanDraw can be used to supress flashes or checkerboarding 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when such behavior would be undesirable. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetCanDraw(bool can); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether or not there is a pending tree. This influences 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // whether or not we can succesfully commit at this time. If the 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last commit is still being processed (but not blocking), it may not 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be possible to take another commit yet. This overrides force commit, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as a commit is already still in flight. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetHasPendingTree(bool has_pending_tree); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_pending_tree() const { return has_pending_tree_; } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidLoseOutputSurface(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidRecreateOutputSurface(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Exposed for testing purposes. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetMaximumNumberOfFailedDrawsBeforeDrawIsForced(int num_draws); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ToString(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldDrawForced() const; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DrawSuspendedUntilCommit() const; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ScheduledToDraw() const; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldDraw() const; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldAttemptTreeActivation() const; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldAcquireLayerTexturesForMainThread() const; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShouldCheckForCompletedTileUploads() const; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasDrawnThisFrame() const; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasAttemptedTreeActivationThisFrame() const; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasCheckedForCompletedTileUploadsThisFrame() const; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SchedulerSettings settings_; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommitState commit_state_; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int current_frame_number_; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_frame_number_where_draw_was_called_; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_frame_number_where_tree_activation_attempted_; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_frame_number_where_check_for_completed_tile_uploads_called_; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int consecutive_failed_draws_; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int maximum_number_of_failed_draws_before_draw_is_forced_; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_redraw_; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool swap_used_incomplete_tile_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_forced_redraw_; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_forced_redraw_after_next_commit_; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_commit_; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_forced_commit_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expect_immediate_begin_frame_; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool main_thread_needs_layer_textures_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool inside_vsync_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_begin_frame_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_draw_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_pending_tree_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool draw_if_possible_failed_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureState texture_state_; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OutputSurfaceState output_surface_state_; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SchedulerStateMachine); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_SCHEDULER_SCHEDULER_STATE_MACHINE_H_ 194