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