1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/sequence_checker_impl.h" 6 7 #include "base/logging.h" 8 #include "base/memory/ptr_util.h" 9 #include "base/sequence_token.h" 10 #include "base/threading/sequenced_worker_pool.h" 11 #include "base/threading/thread_checker_impl.h" 12 13 namespace base { 14 15 class SequenceCheckerImpl::Core { 16 public: 17 Core() 18 : sequence_token_(SequenceToken::GetForCurrentThread()), 19 sequenced_worker_pool_token_( 20 SequencedWorkerPool::GetSequenceTokenForCurrentThread()) { 21 // SequencedWorkerPool doesn't use SequenceToken and code outside of 22 // SequenceWorkerPool doesn't set a SequencedWorkerPool token. 23 DCHECK(!sequence_token_.IsValid() || 24 !sequenced_worker_pool_token_.IsValid()); 25 } 26 27 ~Core() = default; 28 29 bool CalledOnValidSequence() const { 30 if (sequence_token_.IsValid()) 31 return sequence_token_ == SequenceToken::GetForCurrentThread(); 32 33 if (sequenced_worker_pool_token_.IsValid()) { 34 return sequenced_worker_pool_token_.Equals( 35 SequencedWorkerPool::GetSequenceTokenForCurrentThread()); 36 } 37 38 // SequenceChecker behaves as a ThreadChecker when it is not bound to a 39 // valid sequence token. 40 return thread_checker_.CalledOnValidThread(); 41 } 42 43 private: 44 SequenceToken sequence_token_; 45 46 // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of 47 // TaskScheduler. crbug.com/622400 48 SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_; 49 50 // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid. 51 ThreadCheckerImpl thread_checker_; 52 }; 53 54 SequenceCheckerImpl::SequenceCheckerImpl() : core_(MakeUnique<Core>()) {} 55 SequenceCheckerImpl::~SequenceCheckerImpl() = default; 56 57 bool SequenceCheckerImpl::CalledOnValidSequence() const { 58 AutoLock auto_lock(lock_); 59 if (!core_) 60 core_ = MakeUnique<Core>(); 61 return core_->CalledOnValidSequence(); 62 } 63 64 void SequenceCheckerImpl::DetachFromSequence() { 65 AutoLock auto_lock(lock_); 66 core_.reset(); 67 } 68 69 } // namespace base 70