sequence_checker.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 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#ifndef BASE_SEQUENCE_CHECKER_H_ 6#define BASE_SEQUENCE_CHECKER_H_ 7 8#include "base/memory/ref_counted.h" 9 10// See comments for the similar block in thread_checker.h. 11#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) 12#define ENABLE_SEQUENCE_CHECKER 1 13#else 14#define ENABLE_SEQUENCE_CHECKER 0 15#endif 16 17#if ENABLE_SEQUENCE_CHECKER 18#include "base/sequence_checker_impl.h" 19#endif 20 21namespace base { 22 23class SequencedTaskRunner; 24 25// Do nothing implementation, for use in release mode. 26// 27// Note: You should almost always use the SequenceChecker class to get 28// the right version for your build configuration. 29class SequenceCheckerDoNothing { 30 public: 31 bool CalledOnValidSequence() const { 32 return true; 33 } 34 35 void ChangeSequence( 36 const scoped_refptr<SequencedTaskRunner>& sequenced_task_runner) {} 37}; 38 39// SequenceChecker is a helper class used to help verify that some 40// methods of a class are called in sequence -- that is, called from 41// the same SequencedTaskRunner. It is a generalization of 42// ThreadChecker; see comments in sequence_checker_impl.h for details. 43// 44// Example: 45// class MyClass { 46// public: 47// explicit MyClass( 48// const scoped_refptr<SequencedTaskRunner>& sequenced_task_runner) 49// : sequence_checker_(sequenced_task_runner) {} 50// 51// void Foo() { 52// DCHECK(sequence_checker_.CalledOnValidSequence()); 53// ... (do stuff) ... 54// } 55// 56// private: 57// SequenceChecker sequence_checker_; 58// } 59// 60// In Release mode, CalledOnValidSequence will always return true. 61#if ENABLE_SEQUENCE_CHECKER 62class SequenceChecker : public SequenceCheckerImpl { 63 public: 64 explicit SequenceChecker( 65 const scoped_refptr<SequencedTaskRunner>& sequenced_task_runner) 66 : SequenceCheckerImpl(sequenced_task_runner) {} 67}; 68#else 69class SequenceChecker : public SequenceCheckerDoNothing { 70 public: 71 explicit SequenceChecker( 72 const scoped_refptr<SequencedTaskRunner>& sequenced_task_runner) {} 73}; 74#endif // ENABLE_SEQUENCE_CHECKER 75 76#undef ENABLE_SEQUENCE_CHECKER 77 78} // namespace base 79 80#endif // BASE_SEQUENCE_CHECKER_H_ 81