OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
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 "base/lazy_instance.h" | |
9 #include "base/logging.h" | |
10 #include "base/threading/thread_local.h" | |
11 | |
12 namespace base { | |
13 | |
14 namespace { | |
15 | |
16 base::StaticAtomicSequenceNumber g_sequence_token_generator; | |
17 | |
18 LazyInstance<ThreadLocalPointer<ScopedSetSequenceTokenForCurrentThread>>::Leaky | |
19 tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; | |
20 | |
21 } // namespace | |
22 | |
23 bool SequenceToken::operator==(const SequenceToken& other) const { | |
24 return token_ == other.token_ && token_ != kInvalidSequenceToken; | |
25 } | |
26 | |
27 bool SequenceToken::operator!=(const SequenceToken& other) const { | |
28 return !(*this == other); | |
29 } | |
30 | |
31 bool SequenceToken::IsValid() const { | |
32 return token_ != kInvalidSequenceToken; | |
33 } | |
34 | |
35 SequenceToken SequenceToken::Create() { | |
36 return SequenceToken(g_sequence_token_generator.GetNext()); | |
37 } | |
38 | |
39 SequenceToken SequenceToken::GetForCurrentThread() { | |
40 const ScopedSetSequenceTokenForCurrentThread* current_sequence_token = | |
41 tls_current_sequence_token.Get().Get(); | |
42 return current_sequence_token ? current_sequence_token->token_ | |
43 : SequenceToken(); | |
44 } | |
45 | |
46 ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( | |
47 const SequenceToken& token) | |
48 : token_(token) { | |
49 DCHECK(!tls_current_sequence_token.Get().Get()); | |
50 tls_current_sequence_token.Get().Set(this); | |
51 } | |
52 | |
53 ScopedSetSequenceTokenForCurrentThread:: | |
54 ~ScopedSetSequenceTokenForCurrentThread() { | |
55 DCHECK_EQ(tls_current_sequence_token.Get().Get(), this); | |
56 tls_current_sequence_token.Get().Set(nullptr); | |
57 } | |
58 | |
59 } // namespace base | |
OLD | NEW |