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 #include "base/sequence_token.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include "base/atomic_sequence_num.h" 8*635a8641SAndroid Build Coastguard Worker #include "base/lazy_instance.h" 9*635a8641SAndroid Build Coastguard Worker #include "base/logging.h" 10*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_local.h" 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker namespace base { 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker namespace { 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker base::AtomicSequenceNumber g_sequence_token_generator; 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker base::AtomicSequenceNumber g_task_token_generator; 19*635a8641SAndroid Build Coastguard Worker 20*635a8641SAndroid Build Coastguard Worker LazyInstance<ThreadLocalPointer<const SequenceToken>>::Leaky 21*635a8641SAndroid Build Coastguard Worker tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard Worker LazyInstance<ThreadLocalPointer<const TaskToken>>::Leaky 24*635a8641SAndroid Build Coastguard Worker tls_current_task_token = LAZY_INSTANCE_INITIALIZER; 25*635a8641SAndroid Build Coastguard Worker 26*635a8641SAndroid Build Coastguard Worker } // namespace 27*635a8641SAndroid Build Coastguard Worker operator ==(const SequenceToken & other) const28*635a8641SAndroid Build Coastguard Workerbool SequenceToken::operator==(const SequenceToken& other) const { 29*635a8641SAndroid Build Coastguard Worker return token_ == other.token_ && IsValid(); 30*635a8641SAndroid Build Coastguard Worker } 31*635a8641SAndroid Build Coastguard Worker operator !=(const SequenceToken & other) const32*635a8641SAndroid Build Coastguard Workerbool SequenceToken::operator!=(const SequenceToken& other) const { 33*635a8641SAndroid Build Coastguard Worker return !(*this == other); 34*635a8641SAndroid Build Coastguard Worker } 35*635a8641SAndroid Build Coastguard Worker IsValid() const36*635a8641SAndroid Build Coastguard Workerbool SequenceToken::IsValid() const { 37*635a8641SAndroid Build Coastguard Worker return token_ != kInvalidSequenceToken; 38*635a8641SAndroid Build Coastguard Worker } 39*635a8641SAndroid Build Coastguard Worker ToInternalValue() const40*635a8641SAndroid Build Coastguard Workerint SequenceToken::ToInternalValue() const { 41*635a8641SAndroid Build Coastguard Worker return token_; 42*635a8641SAndroid Build Coastguard Worker } 43*635a8641SAndroid Build Coastguard Worker Create()44*635a8641SAndroid Build Coastguard WorkerSequenceToken SequenceToken::Create() { 45*635a8641SAndroid Build Coastguard Worker return SequenceToken(g_sequence_token_generator.GetNext()); 46*635a8641SAndroid Build Coastguard Worker } 47*635a8641SAndroid Build Coastguard Worker GetForCurrentThread()48*635a8641SAndroid Build Coastguard WorkerSequenceToken SequenceToken::GetForCurrentThread() { 49*635a8641SAndroid Build Coastguard Worker const SequenceToken* current_sequence_token = 50*635a8641SAndroid Build Coastguard Worker tls_current_sequence_token.Get().Get(); 51*635a8641SAndroid Build Coastguard Worker return current_sequence_token ? *current_sequence_token : SequenceToken(); 52*635a8641SAndroid Build Coastguard Worker } 53*635a8641SAndroid Build Coastguard Worker operator ==(const TaskToken & other) const54*635a8641SAndroid Build Coastguard Workerbool TaskToken::operator==(const TaskToken& other) const { 55*635a8641SAndroid Build Coastguard Worker return token_ == other.token_ && IsValid(); 56*635a8641SAndroid Build Coastguard Worker } 57*635a8641SAndroid Build Coastguard Worker operator !=(const TaskToken & other) const58*635a8641SAndroid Build Coastguard Workerbool TaskToken::operator!=(const TaskToken& other) const { 59*635a8641SAndroid Build Coastguard Worker return !(*this == other); 60*635a8641SAndroid Build Coastguard Worker } 61*635a8641SAndroid Build Coastguard Worker IsValid() const62*635a8641SAndroid Build Coastguard Workerbool TaskToken::IsValid() const { 63*635a8641SAndroid Build Coastguard Worker return token_ != kInvalidTaskToken; 64*635a8641SAndroid Build Coastguard Worker } 65*635a8641SAndroid Build Coastguard Worker Create()66*635a8641SAndroid Build Coastguard WorkerTaskToken TaskToken::Create() { 67*635a8641SAndroid Build Coastguard Worker return TaskToken(g_task_token_generator.GetNext()); 68*635a8641SAndroid Build Coastguard Worker } 69*635a8641SAndroid Build Coastguard Worker GetForCurrentThread()70*635a8641SAndroid Build Coastguard WorkerTaskToken TaskToken::GetForCurrentThread() { 71*635a8641SAndroid Build Coastguard Worker const TaskToken* current_task_token = tls_current_task_token.Get().Get(); 72*635a8641SAndroid Build Coastguard Worker return current_task_token ? *current_task_token : TaskToken(); 73*635a8641SAndroid Build Coastguard Worker } 74*635a8641SAndroid Build Coastguard Worker ScopedSetSequenceTokenForCurrentThread(const SequenceToken & sequence_token)75*635a8641SAndroid Build Coastguard WorkerScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( 76*635a8641SAndroid Build Coastguard Worker const SequenceToken& sequence_token) 77*635a8641SAndroid Build Coastguard Worker : sequence_token_(sequence_token), task_token_(TaskToken::Create()) { 78*635a8641SAndroid Build Coastguard Worker DCHECK(!tls_current_sequence_token.Get().Get()); 79*635a8641SAndroid Build Coastguard Worker DCHECK(!tls_current_task_token.Get().Get()); 80*635a8641SAndroid Build Coastguard Worker tls_current_sequence_token.Get().Set(&sequence_token_); 81*635a8641SAndroid Build Coastguard Worker tls_current_task_token.Get().Set(&task_token_); 82*635a8641SAndroid Build Coastguard Worker } 83*635a8641SAndroid Build Coastguard Worker 84*635a8641SAndroid Build Coastguard Worker ScopedSetSequenceTokenForCurrentThread:: ~ScopedSetSequenceTokenForCurrentThread()85*635a8641SAndroid Build Coastguard Worker ~ScopedSetSequenceTokenForCurrentThread() { 86*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(tls_current_sequence_token.Get().Get(), &sequence_token_); 87*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(tls_current_task_token.Get().Get(), &task_token_); 88*635a8641SAndroid Build Coastguard Worker tls_current_sequence_token.Get().Set(nullptr); 89*635a8641SAndroid Build Coastguard Worker tls_current_task_token.Get().Set(nullptr); 90*635a8641SAndroid Build Coastguard Worker } 91*635a8641SAndroid Build Coastguard Worker 92*635a8641SAndroid Build Coastguard Worker } // namespace base 93