|  | // 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 |