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