// 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" namespace base { SequenceCheckerImpl::SequenceCheckerImpl() : sequence_token_assigned_(false) { AutoLock auto_lock(lock_); EnsureSequenceTokenAssigned(); } SequenceCheckerImpl::~SequenceCheckerImpl() {} bool SequenceCheckerImpl::CalledOnValidSequencedThread() const { AutoLock auto_lock(lock_); EnsureSequenceTokenAssigned(); // If this thread is not associated with a SequencedWorkerPool, // SequenceChecker behaves as a ThreadChecker. See header for details. if (!sequence_token_.IsValid()) return thread_checker_.CalledOnValidThread(); return sequence_token_.Equals( SequencedWorkerPool::GetSequenceTokenForCurrentThread()); } void SequenceCheckerImpl::DetachFromSequence() { AutoLock auto_lock(lock_); thread_checker_.DetachFromThread(); sequence_token_assigned_ = false; sequence_token_ = SequencedWorkerPool::SequenceToken(); } void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { lock_.AssertAcquired(); if (sequence_token_assigned_) return; sequence_token_assigned_ = true; sequence_token_ = SequencedWorkerPool::GetSequenceTokenForCurrentThread(); } } // namespace base