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_THREADING_THREAD_CHECKER_H_
6#define BASE_THREADING_THREAD_CHECKER_H_
7
8// Apart from debug builds, we also enable the thread checker in
9// builds with DCHECK_ALWAYS_ON so that trybots and waterfall bots
10// with this define will get the same level of thread checking as
11// debug bots.
12//
13// Note that this does not perfectly match situations where DCHECK is
14// enabled.  For example a non-official release build may have
15// DCHECK_ALWAYS_ON undefined (and therefore ThreadChecker would be
16// disabled) but have DCHECKs enabled at runtime.
17#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
18#define ENABLE_THREAD_CHECKER 1
19#else
20#define ENABLE_THREAD_CHECKER 0
21#endif
22
23#if ENABLE_THREAD_CHECKER
24#include "base/threading/thread_checker_impl.h"
25#endif
26
27namespace base {
28
29// Do nothing implementation, for use in release mode.
30//
31// Note: You should almost always use the ThreadChecker class to get the
32// right version for your build configuration.
33class ThreadCheckerDoNothing {
34 public:
35  bool CalledOnValidThread() const {
36    return true;
37  }
38
39  void DetachFromThread() {}
40};
41
42// ThreadChecker is a helper class used to help verify that some methods of a
43// class are called from the same thread. It provides identical functionality to
44// base::NonThreadSafe, but it is meant to be held as a member variable, rather
45// than inherited from base::NonThreadSafe.
46//
47// While inheriting from base::NonThreadSafe may give a clear indication about
48// the thread-safety of a class, it may also lead to violations of the style
49// guide with regard to multiple inheritance. The choice between having a
50// ThreadChecker member and inheriting from base::NonThreadSafe should be based
51// on whether:
52//  - Derived classes need to know the thread they belong to, as opposed to
53//    having that functionality fully encapsulated in the base class.
54//  - Derived classes should be able to reassign the base class to another
55//    thread, via DetachFromThread.
56//
57// If neither of these are true, then having a ThreadChecker member and calling
58// CalledOnValidThread is the preferable solution.
59//
60// Example:
61// class MyClass {
62//  public:
63//   void Foo() {
64//     DCHECK(thread_checker_.CalledOnValidThread());
65//     ... (do stuff) ...
66//   }
67//
68//  private:
69//   ThreadChecker thread_checker_;
70// }
71//
72// In Release mode, CalledOnValidThread will always return true.
73#if ENABLE_THREAD_CHECKER
74class ThreadChecker : public ThreadCheckerImpl {
75};
76#else
77class ThreadChecker : public ThreadCheckerDoNothing {
78};
79#endif  // ENABLE_THREAD_CHECKER
80
81#undef ENABLE_THREAD_CHECKER
82
83}  // namespace base
84
85#endif  // BASE_THREADING_THREAD_CHECKER_H_
86