• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_NON_THREAD_SAFE_H_
6  #define BASE_THREADING_NON_THREAD_SAFE_H_
7  
8  // Classes deriving from NonThreadSafe may need to suppress MSVC warning 4275:
9  // non dll-interface class 'Bar' used as base for dll-interface class 'Foo'.
10  // There is a specific macro to do it: NON_EXPORTED_BASE(), defined in
11  // compiler_specific.h
12  #include "base/compiler_specific.h"
13  
14  // See comment at top of thread_checker.h
15  #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
16  #define ENABLE_NON_THREAD_SAFE 1
17  #else
18  #define ENABLE_NON_THREAD_SAFE 0
19  #endif
20  
21  #include "base/threading/non_thread_safe_impl.h"
22  
23  namespace base {
24  
25  // Do nothing implementation of NonThreadSafe, for release mode.
26  //
27  // Note: You should almost always use the NonThreadSafe class to get
28  // the right version of the class for your build configuration.
29  class NonThreadSafeDoNothing {
30   public:
CalledOnValidThread()31    bool CalledOnValidThread() const {
32      return true;
33    }
34  
35   protected:
~NonThreadSafeDoNothing()36    ~NonThreadSafeDoNothing() {}
DetachFromThread()37    void DetachFromThread() {}
38  };
39  
40  // NonThreadSafe is a helper class used to help verify that methods of a
41  // class are called from the same thread.  One can inherit from this class
42  // and use CalledOnValidThread() to verify.
43  //
44  // This is intended to be used with classes that appear to be thread safe, but
45  // aren't.  For example, a service or a singleton like the preferences system.
46  //
47  // Example:
48  // class MyClass : public base::NonThreadSafe {
49  //  public:
50  //   void Foo() {
51  //     DCHECK(CalledOnValidThread());
52  //     ... (do stuff) ...
53  //   }
54  // }
55  //
56  // Note that base::ThreadChecker offers identical functionality to
57  // NonThreadSafe, but does not require inheritance. In general, it is preferable
58  // to have a base::ThreadChecker as a member, rather than inherit from
59  // NonThreadSafe. For more details about when to choose one over the other, see
60  // the documentation for base::ThreadChecker.
61  #if ENABLE_NON_THREAD_SAFE
62  typedef NonThreadSafeImpl NonThreadSafe;
63  #else
64  typedef NonThreadSafeDoNothing NonThreadSafe;
65  #endif  // ENABLE_NON_THREAD_SAFE
66  
67  #undef ENABLE_NON_THREAD_SAFE
68  
69  }  // namespace base
70  
71  #endif  // BASE_THREADING_NON_THREAD_SAFE_H_
72