| Index: base/sequence_token.cc
|
| diff --git a/base/sequence_token.cc b/base/sequence_token.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dd4c8202f122cdd96658143f9adf96105751e535
|
| --- /dev/null
|
| +++ b/base/sequence_token.cc
|
| @@ -0,0 +1,58 @@
|
| +// 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 {
|
| +
|
| +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_ && token_ != kInvalidSequenceToken;
|
| +}
|
| +
|
| +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 base
|
|
|