1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_THREADING_THREAD_CHECKER_IMPL_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_THREADING_THREAD_CHECKER_IMPL_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h" 9*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 10*635a8641SAndroid Build Coastguard Worker #include "base/sequence_token.h" 11*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 12*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h" 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker namespace base { 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker // Real implementation of ThreadChecker, for use in debug mode, or for temporary 17*635a8641SAndroid Build Coastguard Worker // use in release mode (e.g. to CHECK on a threading issue seen only in the 18*635a8641SAndroid Build Coastguard Worker // wild). 19*635a8641SAndroid Build Coastguard Worker // 20*635a8641SAndroid Build Coastguard Worker // Note: You should almost always use the ThreadChecker class to get the right 21*635a8641SAndroid Build Coastguard Worker // version for your build configuration. 22*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ThreadCheckerImpl { 23*635a8641SAndroid Build Coastguard Worker public: 24*635a8641SAndroid Build Coastguard Worker ThreadCheckerImpl(); 25*635a8641SAndroid Build Coastguard Worker ~ThreadCheckerImpl(); 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker bool CalledOnValidThread() const WARN_UNUSED_RESULT; 28*635a8641SAndroid Build Coastguard Worker 29*635a8641SAndroid Build Coastguard Worker // Changes the thread that is checked for in CalledOnValidThread. This may 30*635a8641SAndroid Build Coastguard Worker // be useful when an object may be created on one thread and then used 31*635a8641SAndroid Build Coastguard Worker // exclusively on another thread. 32*635a8641SAndroid Build Coastguard Worker void DetachFromThread(); 33*635a8641SAndroid Build Coastguard Worker 34*635a8641SAndroid Build Coastguard Worker private: 35*635a8641SAndroid Build Coastguard Worker void EnsureAssigned() const; 36*635a8641SAndroid Build Coastguard Worker 37*635a8641SAndroid Build Coastguard Worker // Members are mutable so that CalledOnValidThread() can set them. 38*635a8641SAndroid Build Coastguard Worker 39*635a8641SAndroid Build Coastguard Worker // Synchronizes access to all members. 40*635a8641SAndroid Build Coastguard Worker mutable base::Lock lock_; 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker // Thread on which CalledOnValidThread() may return true. 43*635a8641SAndroid Build Coastguard Worker mutable PlatformThreadRef thread_id_; 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker // TaskToken for which CalledOnValidThread() always returns true. This allows 46*635a8641SAndroid Build Coastguard Worker // CalledOnValidThread() to return true when called multiple times from the 47*635a8641SAndroid Build Coastguard Worker // same task, even if it's not running in a single-threaded context itself 48*635a8641SAndroid Build Coastguard Worker // (allowing usage of ThreadChecker objects on the stack in the scope of one- 49*635a8641SAndroid Build Coastguard Worker // off tasks). Note: CalledOnValidThread() may return true even if the current 50*635a8641SAndroid Build Coastguard Worker // TaskToken is not equal to this. 51*635a8641SAndroid Build Coastguard Worker mutable TaskToken task_token_; 52*635a8641SAndroid Build Coastguard Worker 53*635a8641SAndroid Build Coastguard Worker // SequenceToken for which CalledOnValidThread() may return true. Used to 54*635a8641SAndroid Build Coastguard Worker // ensure that CalledOnValidThread() doesn't return true for TaskScheduler 55*635a8641SAndroid Build Coastguard Worker // tasks that happen to run on the same thread but weren't posted to the same 56*635a8641SAndroid Build Coastguard Worker // SingleThreadTaskRunner. 57*635a8641SAndroid Build Coastguard Worker mutable SequenceToken sequence_token_; 58*635a8641SAndroid Build Coastguard Worker }; 59*635a8641SAndroid Build Coastguard Worker 60*635a8641SAndroid Build Coastguard Worker } // namespace base 61*635a8641SAndroid Build Coastguard Worker 62*635a8641SAndroid Build Coastguard Worker #endif // BASE_THREADING_THREAD_CHECKER_IMPL_H_ 63