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