xref: /aosp_15_r20/external/libchrome/base/sequence_checker_impl.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 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_SEQUENCE_CHECKER_IMPL_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_SEQUENCE_CHECKER_IMPL_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <memory>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace base {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker // Real implementation of SequenceChecker for use in debug mode or for temporary
18*635a8641SAndroid Build Coastguard Worker // use in release mode (e.g. to CHECK on a threading issue seen only in the
19*635a8641SAndroid Build Coastguard Worker // wild).
20*635a8641SAndroid Build Coastguard Worker //
21*635a8641SAndroid Build Coastguard Worker // Note: You should almost always use the SequenceChecker class to get the right
22*635a8641SAndroid Build Coastguard Worker // version for your build configuration.
23*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT SequenceCheckerImpl {
24*635a8641SAndroid Build Coastguard Worker  public:
25*635a8641SAndroid Build Coastguard Worker   SequenceCheckerImpl();
26*635a8641SAndroid Build Coastguard Worker   ~SequenceCheckerImpl();
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker   // Returns true if called in sequence with previous calls to this method and
29*635a8641SAndroid Build Coastguard Worker   // the constructor.
30*635a8641SAndroid Build Coastguard Worker   bool CalledOnValidSequence() const WARN_UNUSED_RESULT;
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker   // Unbinds the checker from the currently associated sequence. The checker
33*635a8641SAndroid Build Coastguard Worker   // will be re-bound on the next call to CalledOnValidSequence().
34*635a8641SAndroid Build Coastguard Worker   void DetachFromSequence();
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker  private:
37*635a8641SAndroid Build Coastguard Worker   class Core;
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker   // Guards all variables below.
40*635a8641SAndroid Build Coastguard Worker   mutable Lock lock_;
41*635a8641SAndroid Build Coastguard Worker   mutable std::unique_ptr<Core> core_;
42*635a8641SAndroid Build Coastguard Worker 
43*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(SequenceCheckerImpl);
44*635a8641SAndroid Build Coastguard Worker };
45*635a8641SAndroid Build Coastguard Worker 
46*635a8641SAndroid Build Coastguard Worker }  // namespace base
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker #endif  // BASE_SEQUENCE_CHECKER_IMPL_H_
49