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