xref: /aosp_15_r20/external/libchrome/base/threading/thread_checker_impl.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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