blob: df2a8cb24fef58b68633745afd723705ac1455f7 [file] [log] [blame]
[email protected]399ed422012-12-27 19:58:001// 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
fdorayeed5fa72016-07-26 22:28:457#include "base/logging.h"
tzik0c2fcf52017-02-16 08:52:318#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"
fdorayeed5fa72016-07-26 22:28:4512
[email protected]399ed422012-12-27 19:58:0013namespace base {
14
tzik0c2fcf52017-02-16 08:52:3115class 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 }
[email protected]399ed422012-12-27 19:58:0026
tzik0c2fcf52017-02-16 08:52:3127 ~Core() = default;
28
29 bool CalledOnValidThread() 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
54SequenceCheckerImpl::SequenceCheckerImpl() : core_(MakeUnique<Core>()) {}
fdorayeed5fa72016-07-26 22:28:4555SequenceCheckerImpl::~SequenceCheckerImpl() = default;
[email protected]399ed422012-12-27 19:58:0056
fdoraye2b19a12016-07-29 02:30:1657bool SequenceCheckerImpl::CalledOnValidSequence() const {
[email protected]399ed422012-12-27 19:58:0058 AutoLock auto_lock(lock_);
tzik0c2fcf52017-02-16 08:52:3159 if (!core_)
60 core_ = MakeUnique<Core>();
61 return core_->CalledOnValidThread();
[email protected]399ed422012-12-27 19:58:0062}
63
[email protected]d52426c2013-07-30 19:26:4064void SequenceCheckerImpl::DetachFromSequence() {
[email protected]399ed422012-12-27 19:58:0065 AutoLock auto_lock(lock_);
tzik0c2fcf52017-02-16 08:52:3166 core_.reset();
[email protected]399ed422012-12-27 19:58:0067}
68
69} // namespace base