// Copyright (c) 2012 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_checker_impl.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/sequence_token.h" #include "base/threading/thread_checker_impl.h" namespace base { class SequenceCheckerImpl::Core { public: Core() : sequence_token_(SequenceToken::GetForCurrentThread()) {} ~Core() = default; bool CalledOnValidSequence() const { if (sequence_token_.IsValid()) return sequence_token_ == SequenceToken::GetForCurrentThread(); // SequenceChecker behaves as a ThreadChecker when it is not bound to a // valid sequence token. return thread_checker_.CalledOnValidThread(); } private: SequenceToken sequence_token_; // Used when |sequence_token_| is invalid. ThreadCheckerImpl thread_checker_; }; SequenceCheckerImpl::SequenceCheckerImpl() : core_(std::make_unique<Core>()) {} SequenceCheckerImpl::~SequenceCheckerImpl() = default; bool SequenceCheckerImpl::CalledOnValidSequence() const { AutoLock auto_lock(lock_); if (!core_) core_ = std::make_unique<Core>(); return core_->CalledOnValidSequence(); } void SequenceCheckerImpl::DetachFromSequence() { AutoLock auto_lock(lock_); core_.reset(); } } // namespace base