blob: d41c08608c96a12d17c7a4d0da40d52607f81854 [file] [log] [blame]
[email protected]81c309c2012-06-25 20:43:171// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commitd7cae122008-07-26 21:49:384
[email protected]c9177502011-01-01 04:48:495#ifndef BASE_THREADING_NON_THREAD_SAFE_H_
6#define BASE_THREADING_NON_THREAD_SAFE_H_
initial.commitd7cae122008-07-26 21:49:387
[email protected]a571ce852012-06-27 03:13:358// Classes deriving from NonThreadSafe may need to suppress MSVC warning 4275:
[email protected]13677b82011-05-18 18:29:369// 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
[email protected]a571ce852012-06-27 03:13:3514// 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
[email protected]40064482011-03-03 23:38:5121#include "base/threading/non_thread_safe_impl.h"
initial.commitd7cae122008-07-26 21:49:3822
[email protected]c9177502011-01-01 04:48:4923namespace base {
24
[email protected]40064482011-03-03 23:38:5125// 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:
[email protected]cb932482012-06-26 06:23:0036 ~NonThreadSafeDoNothing() {}
[email protected]40064482011-03-03 23:38:5137 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.
initial.commitd7cae122008-07-26 21:49:3843//
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:
[email protected]c9177502011-01-01 04:48:4948// class MyClass : public base::NonThreadSafe {
initial.commitd7cae122008-07-26 21:49:3849// public:
50// void Foo() {
51// DCHECK(CalledOnValidThread());
52// ... (do stuff) ...
53// }
54// }
55//
[email protected]81c309c2012-06-25 20:43:1756// Note that base::ThreadChecker offers identical functionality to
[email protected]600cdb7c2013-11-05 04:24:5857// NonThreadSafe, but does not require inheritance. In general, it is preferable
[email protected]81c309c2012-06-25 20:43:1758// 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.
[email protected]a571ce852012-06-27 03:13:3561#if ENABLE_NON_THREAD_SAFE
[email protected]95bbcc72012-07-11 00:07:5462typedef NonThreadSafeImpl NonThreadSafe;
initial.commitd7cae122008-07-26 21:49:3863#else
[email protected]95bbcc72012-07-11 00:07:5464typedef NonThreadSafeDoNothing NonThreadSafe;
[email protected]a571ce852012-06-27 03:13:3565#endif // ENABLE_NON_THREAD_SAFE
66
67#undef ENABLE_NON_THREAD_SAFE
initial.commitd7cae122008-07-26 21:49:3868
[email protected]c9177502011-01-01 04:48:4969} // namespace base
70
[email protected]587b80e2014-02-15 20:47:5871#endif // BASE_THREADING_NON_THREAD_SAFE_H_