1 // Copyright 2016 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/sequence_token.h" 6 7 #include "base/atomic_sequence_num.h" 8 #include "third_party/abseil-cpp/absl/base/attributes.h" 9 10 namespace base { 11 12 namespace { 13 14 base::AtomicSequenceNumber g_sequence_token_generator; 15 16 base::AtomicSequenceNumber g_task_token_generator; 17 18 ABSL_CONST_INIT thread_local SequenceToken current_sequence_token; 19 ABSL_CONST_INIT thread_local TaskToken current_task_token; 20 21 } // namespace 22 operator ==(const SequenceToken & other) const23bool SequenceToken::operator==(const SequenceToken& other) const { 24 return token_ == other.token_ && IsValid(); 25 } 26 operator !=(const SequenceToken & other) const27bool SequenceToken::operator!=(const SequenceToken& other) const { 28 return !(*this == other); 29 } 30 IsValid() const31bool SequenceToken::IsValid() const { 32 return token_ != kInvalidSequenceToken; 33 } 34 ToInternalValue() const35int SequenceToken::ToInternalValue() const { 36 return token_; 37 } 38 Create()39SequenceToken SequenceToken::Create() { 40 return SequenceToken(g_sequence_token_generator.GetNext()); 41 } 42 GetForCurrentThread()43SequenceToken SequenceToken::GetForCurrentThread() { 44 return current_sequence_token; 45 } 46 operator ==(const TaskToken & other) const47bool TaskToken::operator==(const TaskToken& other) const { 48 return token_ == other.token_ && IsValid(); 49 } 50 operator !=(const TaskToken & other) const51bool TaskToken::operator!=(const TaskToken& other) const { 52 return !(*this == other); 53 } 54 IsValid() const55bool TaskToken::IsValid() const { 56 return token_ != kInvalidTaskToken; 57 } 58 Create()59TaskToken TaskToken::Create() { 60 return TaskToken(g_task_token_generator.GetNext()); 61 } 62 GetForCurrentThread()63TaskToken TaskToken::GetForCurrentThread() { 64 return current_task_token; 65 } 66 ScopedSetSequenceTokenForCurrentThread(const SequenceToken & sequence_token)67ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( 68 const SequenceToken& sequence_token) 69 // The lambdas here exist because invalid tokens don't compare equal, so 70 // passing invalid sequence/task tokens as the third args to AutoReset 71 // constructors doesn't work. 72 : sequence_token_resetter_(¤t_sequence_token, 73 [&sequence_token]() { 74 DCHECK(!current_sequence_token.IsValid()); 75 return sequence_token; 76 }()), __anon240c14760302null77 task_token_resetter_(¤t_task_token, [] { 78 DCHECK(!current_task_token.IsValid()); 79 return TaskToken::Create(); 80 }()) {} 81 82 ScopedSetSequenceTokenForCurrentThread:: 83 ~ScopedSetSequenceTokenForCurrentThread() = default; 84 85 } // namespace base 86