xref: /aosp_15_r20/external/libchrome/base/sequence_token.cc (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 #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 Worker bool 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 Worker bool 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 Worker bool 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 Worker int 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 Worker SequenceToken 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 Worker SequenceToken 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 Worker bool 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 Worker bool 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 Worker bool 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 Worker TaskToken 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 Worker TaskToken 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 Worker ScopedSetSequenceTokenForCurrentThread::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