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
23namespace 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.
29class NonThreadSafeDoNothing {
30 public:
31  bool CalledOnValidThread() const {
32    return true;
33  }
34
35 protected:
36  ~NonThreadSafeDoNothing() {}
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
62typedef NonThreadSafeImpl NonThreadSafe;
63#else
64typedef 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