xref: /aosp_15_r20/external/libchrome/base/sequence_token.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 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_TOKEN_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_SEQUENCE_TOKEN_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker namespace base {
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker // A token that identifies a series of sequenced tasks (i.e. tasks that run one
14*635a8641SAndroid Build Coastguard Worker // at a time in posting order).
15*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT SequenceToken {
16*635a8641SAndroid Build Coastguard Worker  public:
17*635a8641SAndroid Build Coastguard Worker   // Instantiates an invalid SequenceToken.
18*635a8641SAndroid Build Coastguard Worker   SequenceToken() = default;
19*635a8641SAndroid Build Coastguard Worker 
20*635a8641SAndroid Build Coastguard Worker   // Explicitly allow copy.
21*635a8641SAndroid Build Coastguard Worker   SequenceToken(const SequenceToken& other) = default;
22*635a8641SAndroid Build Coastguard Worker   SequenceToken& operator=(const SequenceToken& other) = default;
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker   // An invalid SequenceToken is not equal to any other SequenceToken, including
25*635a8641SAndroid Build Coastguard Worker   // other invalid SequenceTokens.
26*635a8641SAndroid Build Coastguard Worker   bool operator==(const SequenceToken& other) const;
27*635a8641SAndroid Build Coastguard Worker   bool operator!=(const SequenceToken& other) const;
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   // Returns true if this is a valid SequenceToken.
30*635a8641SAndroid Build Coastguard Worker   bool IsValid() const;
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker   // Returns the integer uniquely representing this SequenceToken. This method
33*635a8641SAndroid Build Coastguard Worker   // should only be used for tracing and debugging.
34*635a8641SAndroid Build Coastguard Worker   int ToInternalValue() const;
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker   // Returns a valid SequenceToken which isn't equal to any previously returned
37*635a8641SAndroid Build Coastguard Worker   // SequenceToken.
38*635a8641SAndroid Build Coastguard Worker   static SequenceToken Create();
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   // Returns the SequenceToken associated with the task running on the current
41*635a8641SAndroid Build Coastguard Worker   // thread, as determined by the active ScopedSetSequenceTokenForCurrentThread
42*635a8641SAndroid Build Coastguard Worker   // if any.
43*635a8641SAndroid Build Coastguard Worker   static SequenceToken GetForCurrentThread();
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker  private:
SequenceToken(int token)46*635a8641SAndroid Build Coastguard Worker   explicit SequenceToken(int token) : token_(token) {}
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker   static constexpr int kInvalidSequenceToken = -1;
49*635a8641SAndroid Build Coastguard Worker   int token_ = kInvalidSequenceToken;
50*635a8641SAndroid Build Coastguard Worker };
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker // A token that identifies a task.
53*635a8641SAndroid Build Coastguard Worker //
54*635a8641SAndroid Build Coastguard Worker // This is used by ThreadCheckerImpl to determine whether calls to
55*635a8641SAndroid Build Coastguard Worker // CalledOnValidThread() come from the same task and hence are deterministically
56*635a8641SAndroid Build Coastguard Worker // single-threaded (vs. calls coming from different sequenced or parallel tasks,
57*635a8641SAndroid Build Coastguard Worker // which may or may not run on the same thread).
58*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT TaskToken {
59*635a8641SAndroid Build Coastguard Worker  public:
60*635a8641SAndroid Build Coastguard Worker   // Instantiates an invalid TaskToken.
61*635a8641SAndroid Build Coastguard Worker   TaskToken() = default;
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker   // Explicitly allow copy.
64*635a8641SAndroid Build Coastguard Worker   TaskToken(const TaskToken& other) = default;
65*635a8641SAndroid Build Coastguard Worker   TaskToken& operator=(const TaskToken& other) = default;
66*635a8641SAndroid Build Coastguard Worker 
67*635a8641SAndroid Build Coastguard Worker   // An invalid TaskToken is not equal to any other TaskToken, including
68*635a8641SAndroid Build Coastguard Worker   // other invalid TaskTokens.
69*635a8641SAndroid Build Coastguard Worker   bool operator==(const TaskToken& other) const;
70*635a8641SAndroid Build Coastguard Worker   bool operator!=(const TaskToken& other) const;
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker   // Returns true if this is a valid TaskToken.
73*635a8641SAndroid Build Coastguard Worker   bool IsValid() const;
74*635a8641SAndroid Build Coastguard Worker 
75*635a8641SAndroid Build Coastguard Worker   // In the scope of a ScopedSetSequenceTokenForCurrentThread, returns a valid
76*635a8641SAndroid Build Coastguard Worker   // TaskToken which isn't equal to any TaskToken returned in the scope of a
77*635a8641SAndroid Build Coastguard Worker   // different ScopedSetSequenceTokenForCurrentThread. Otherwise, returns an
78*635a8641SAndroid Build Coastguard Worker   // invalid TaskToken.
79*635a8641SAndroid Build Coastguard Worker   static TaskToken GetForCurrentThread();
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker  private:
82*635a8641SAndroid Build Coastguard Worker   friend class ScopedSetSequenceTokenForCurrentThread;
83*635a8641SAndroid Build Coastguard Worker 
TaskToken(int token)84*635a8641SAndroid Build Coastguard Worker   explicit TaskToken(int token) : token_(token) {}
85*635a8641SAndroid Build Coastguard Worker 
86*635a8641SAndroid Build Coastguard Worker   // Returns a valid TaskToken which isn't equal to any previously returned
87*635a8641SAndroid Build Coastguard Worker   // TaskToken. This is private as it only meant to be instantiated by
88*635a8641SAndroid Build Coastguard Worker   // ScopedSetSequenceTokenForCurrentThread.
89*635a8641SAndroid Build Coastguard Worker   static TaskToken Create();
90*635a8641SAndroid Build Coastguard Worker 
91*635a8641SAndroid Build Coastguard Worker   static constexpr int kInvalidTaskToken = -1;
92*635a8641SAndroid Build Coastguard Worker   int token_ = kInvalidTaskToken;
93*635a8641SAndroid Build Coastguard Worker };
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker // Instantiate this in the scope where a single task runs.
96*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedSetSequenceTokenForCurrentThread {
97*635a8641SAndroid Build Coastguard Worker  public:
98*635a8641SAndroid Build Coastguard Worker   // Throughout the lifetime of the constructed object,
99*635a8641SAndroid Build Coastguard Worker   // SequenceToken::GetForCurrentThread() will return |sequence_token| and
100*635a8641SAndroid Build Coastguard Worker   // TaskToken::GetForCurrentThread() will return a TaskToken which is not equal
101*635a8641SAndroid Build Coastguard Worker   // to any TaskToken returned in the scope of another
102*635a8641SAndroid Build Coastguard Worker   // ScopedSetSequenceTokenForCurrentThread.
103*635a8641SAndroid Build Coastguard Worker   ScopedSetSequenceTokenForCurrentThread(const SequenceToken& sequence_token);
104*635a8641SAndroid Build Coastguard Worker   ~ScopedSetSequenceTokenForCurrentThread();
105*635a8641SAndroid Build Coastguard Worker 
106*635a8641SAndroid Build Coastguard Worker  private:
107*635a8641SAndroid Build Coastguard Worker   const SequenceToken sequence_token_;
108*635a8641SAndroid Build Coastguard Worker   const TaskToken task_token_;
109*635a8641SAndroid Build Coastguard Worker 
110*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedSetSequenceTokenForCurrentThread);
111*635a8641SAndroid Build Coastguard Worker };
112*635a8641SAndroid Build Coastguard Worker 
113*635a8641SAndroid Build Coastguard Worker }  // namespace base
114*635a8641SAndroid Build Coastguard Worker 
115*635a8641SAndroid Build Coastguard Worker #endif  // BASE_SEQUENCE_TOKEN_H_
116