Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 // Borrowed from Chromium's src/base/threading/thread_checker.h.
     12 
     13 #ifndef WEBRTC_BASE_THREAD_CHECKER_H_
     14 #define WEBRTC_BASE_THREAD_CHECKER_H_
     15 
     16 // Apart from debug builds, we also enable the thread checker in
     17 // builds with DCHECK_ALWAYS_ON so that trybots and waterfall bots
     18 // with this define will get the same level of thread checking as
     19 // debug bots.
     20 //
     21 // Note that this does not perfectly match situations where RTC_DCHECK is
     22 // enabled.  For example a non-official release build may have
     23 // DCHECK_ALWAYS_ON undefined (and therefore ThreadChecker would be
     24 // disabled) but have RTC_DCHECKs enabled at runtime.
     25 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
     26 #define ENABLE_THREAD_CHECKER 1
     27 #else
     28 #define ENABLE_THREAD_CHECKER 0
     29 #endif
     30 
     31 #include "webrtc/base/thread_checker_impl.h"
     32 
     33 namespace rtc {
     34 
     35 // Do nothing implementation, for use in release mode.
     36 //
     37 // Note: You should almost always use the ThreadChecker class to get the
     38 // right version for your build configuration.
     39 class ThreadCheckerDoNothing {
     40  public:
     41   bool CalledOnValidThread() const {
     42     return true;
     43   }
     44 
     45   void DetachFromThread() {}
     46 };
     47 
     48 // ThreadChecker is a helper class used to help verify that some methods of a
     49 // class are called from the same thread. It provides identical functionality to
     50 // base::NonThreadSafe, but it is meant to be held as a member variable, rather
     51 // than inherited from base::NonThreadSafe.
     52 //
     53 // While inheriting from base::NonThreadSafe may give a clear indication about
     54 // the thread-safety of a class, it may also lead to violations of the style
     55 // guide with regard to multiple inheritance. The choice between having a
     56 // ThreadChecker member and inheriting from base::NonThreadSafe should be based
     57 // on whether:
     58 //  - Derived classes need to know the thread they belong to, as opposed to
     59 //    having that functionality fully encapsulated in the base class.
     60 //  - Derived classes should be able to reassign the base class to another
     61 //    thread, via DetachFromThread.
     62 //
     63 // If neither of these are true, then having a ThreadChecker member and calling
     64 // CalledOnValidThread is the preferable solution.
     65 //
     66 // Example:
     67 // class MyClass {
     68 //  public:
     69 //   void Foo() {
     70 //     RTC_DCHECK(thread_checker_.CalledOnValidThread());
     71 //     ... (do stuff) ...
     72 //   }
     73 //
     74 //  private:
     75 //   ThreadChecker thread_checker_;
     76 // }
     77 //
     78 // In Release mode, CalledOnValidThread will always return true.
     79 #if ENABLE_THREAD_CHECKER
     80 class ThreadChecker : public ThreadCheckerImpl {
     81 };
     82 #else
     83 class ThreadChecker : public ThreadCheckerDoNothing {
     84 };
     85 #endif  // ENABLE_THREAD_CHECKER
     86 
     87 #undef ENABLE_THREAD_CHECKER
     88 
     89 }  // namespace rtc
     90 
     91 #endif  // WEBRTC_BASE_THREAD_CHECKER_H_
     92