Index: base/sequence_token.cc |
diff --git a/base/sequence_token.cc b/base/sequence_token.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b3b57bd04c3f4f3e2287ef77dbe16de4de35561f |
--- /dev/null |
+++ b/base/sequence_token.cc |
@@ -0,0 +1,60 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/sequence_token.h" |
+ |
+#include "base/atomic_sequence_num.h" |
+#include "base/lazy_instance.h" |
+#include "base/logging.h" |
+#include "base/threading/thread_local.h" |
+ |
+namespace base { |
+namespace internal { |
+ |
+namespace { |
+ |
+base::StaticAtomicSequenceNumber g_sequence_token_generator; |
+ |
+LazyInstance<ThreadLocalPointer<ScopedSetCurrentSequenceToken>>::Leaky |
+ tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
+bool SequenceToken::operator==(const SequenceToken& other) const { |
+ return token_ == other.token_; |
+} |
+ |
+bool SequenceToken::operator!=(const SequenceToken& other) const { |
+ return !(*this == other); |
+} |
+ |
+bool SequenceToken::IsValid() const { |
+ return token_ != kInvalidSequenceToken; |
+} |
+ |
+SequenceToken SequenceToken::Create() { |
+ return SequenceToken(g_sequence_token_generator.GetNext()); |
+} |
+ |
+SequenceToken SequenceToken::GetCurrent() { |
+ const ScopedSetCurrentSequenceToken* current_sequence_token = |
+ tls_current_sequence_token.Get().Get(); |
+ return current_sequence_token ? current_sequence_token->token_ |
+ : SequenceToken(); |
+} |
+ |
+ScopedSetCurrentSequenceToken::ScopedSetCurrentSequenceToken( |
+ const SequenceToken& token) |
+ : token_(token) { |
+ DCHECK(!tls_current_sequence_token.Get().Get()); |
+ tls_current_sequence_token.Get().Set(this); |
+} |
+ |
+ScopedSetCurrentSequenceToken::~ScopedSetCurrentSequenceToken() { |
+ DCHECK_EQ(tls_current_sequence_token.Get().Get(), this); |
+ tls_current_sequence_token.Get().Set(nullptr); |
+} |
+ |
+} // namespace internal |
+} // namespace base |