1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_checker_impl.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_task_runner_handle.h" 8*635a8641SAndroid Build Coastguard Worker 9*635a8641SAndroid Build Coastguard Worker namespace base { 10*635a8641SAndroid Build Coastguard Worker ThreadCheckerImpl()11*635a8641SAndroid Build Coastguard WorkerThreadCheckerImpl::ThreadCheckerImpl() { 12*635a8641SAndroid Build Coastguard Worker AutoLock auto_lock(lock_); 13*635a8641SAndroid Build Coastguard Worker EnsureAssigned(); 14*635a8641SAndroid Build Coastguard Worker } 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker ThreadCheckerImpl::~ThreadCheckerImpl() = default; 17*635a8641SAndroid Build Coastguard Worker CalledOnValidThread() const18*635a8641SAndroid Build Coastguard Workerbool ThreadCheckerImpl::CalledOnValidThread() const { 19*635a8641SAndroid Build Coastguard Worker AutoLock auto_lock(lock_); 20*635a8641SAndroid Build Coastguard Worker EnsureAssigned(); 21*635a8641SAndroid Build Coastguard Worker 22*635a8641SAndroid Build Coastguard Worker // Always return true when called from the task from which this 23*635a8641SAndroid Build Coastguard Worker // ThreadCheckerImpl was assigned to a thread. 24*635a8641SAndroid Build Coastguard Worker if (task_token_ == TaskToken::GetForCurrentThread()) 25*635a8641SAndroid Build Coastguard Worker return true; 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker // If this ThreadCheckerImpl is bound to a valid SequenceToken, it must be 28*635a8641SAndroid Build Coastguard Worker // equal to the current SequenceToken and there must be a registered 29*635a8641SAndroid Build Coastguard Worker // ThreadTaskRunnerHandle. Otherwise, the fact that the current task runs on 30*635a8641SAndroid Build Coastguard Worker // the thread to which this ThreadCheckerImpl is bound is fortuitous. 31*635a8641SAndroid Build Coastguard Worker if (sequence_token_.IsValid() && 32*635a8641SAndroid Build Coastguard Worker (sequence_token_ != SequenceToken::GetForCurrentThread() || 33*635a8641SAndroid Build Coastguard Worker !ThreadTaskRunnerHandle::IsSet())) { 34*635a8641SAndroid Build Coastguard Worker return false; 35*635a8641SAndroid Build Coastguard Worker } 36*635a8641SAndroid Build Coastguard Worker 37*635a8641SAndroid Build Coastguard Worker return thread_id_ == PlatformThread::CurrentRef(); 38*635a8641SAndroid Build Coastguard Worker } 39*635a8641SAndroid Build Coastguard Worker DetachFromThread()40*635a8641SAndroid Build Coastguard Workervoid ThreadCheckerImpl::DetachFromThread() { 41*635a8641SAndroid Build Coastguard Worker AutoLock auto_lock(lock_); 42*635a8641SAndroid Build Coastguard Worker thread_id_ = PlatformThreadRef(); 43*635a8641SAndroid Build Coastguard Worker task_token_ = TaskToken(); 44*635a8641SAndroid Build Coastguard Worker sequence_token_ = SequenceToken(); 45*635a8641SAndroid Build Coastguard Worker } 46*635a8641SAndroid Build Coastguard Worker EnsureAssigned() const47*635a8641SAndroid Build Coastguard Workervoid ThreadCheckerImpl::EnsureAssigned() const { 48*635a8641SAndroid Build Coastguard Worker lock_.AssertAcquired(); 49*635a8641SAndroid Build Coastguard Worker if (!thread_id_.is_null()) 50*635a8641SAndroid Build Coastguard Worker return; 51*635a8641SAndroid Build Coastguard Worker 52*635a8641SAndroid Build Coastguard Worker thread_id_ = PlatformThread::CurrentRef(); 53*635a8641SAndroid Build Coastguard Worker task_token_ = TaskToken::GetForCurrentThread(); 54*635a8641SAndroid Build Coastguard Worker sequence_token_ = SequenceToken::GetForCurrentThread(); 55*635a8641SAndroid Build Coastguard Worker } 56*635a8641SAndroid Build Coastguard Worker 57*635a8641SAndroid Build Coastguard Worker } // namespace base 58