Home | History | Annotate | Download | only in base
      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