blob: cbf5053f9651c04bd60e04ef55bcf4ec69253d88 [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"
8
[email protected]399ed422012-12-27 19:58:009namespace base {
10
fdorayeed5fa72016-07-26 22:28:4511SequenceCheckerImpl::SequenceCheckerImpl() {
[email protected]d52426c2013-07-30 19:26:4012 AutoLock auto_lock(lock_);
13 EnsureSequenceTokenAssigned();
14}
[email protected]399ed422012-12-27 19:58:0015
fdorayeed5fa72016-07-26 22:28:4516SequenceCheckerImpl::~SequenceCheckerImpl() = default;
[email protected]399ed422012-12-27 19:58:0017
[email protected]d52426c2013-07-30 19:26:4018bool SequenceCheckerImpl::CalledOnValidSequencedThread() const {
[email protected]399ed422012-12-27 19:58:0019 AutoLock auto_lock(lock_);
[email protected]d52426c2013-07-30 19:26:4020 EnsureSequenceTokenAssigned();
21
fdorayeed5fa72016-07-26 22:28:4522 if (sequence_token_.IsValid())
23 return sequence_token_ == SequenceToken::GetForCurrentThread();
[email protected]d52426c2013-07-30 19:26:4024
fdorayeed5fa72016-07-26 22:28:4525 if (sequenced_worker_pool_token_.IsValid()) {
26 return sequenced_worker_pool_token_.Equals(
27 SequencedWorkerPool::GetSequenceTokenForCurrentThread());
28 }
29
30 // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid
31 // sequence token.
32 return thread_checker_.CalledOnValidThread();
[email protected]399ed422012-12-27 19:58:0033}
34
[email protected]d52426c2013-07-30 19:26:4035void SequenceCheckerImpl::DetachFromSequence() {
[email protected]399ed422012-12-27 19:58:0036 AutoLock auto_lock(lock_);
fdorayeed5fa72016-07-26 22:28:4537 is_assigned_ = false;
38 sequence_token_ = SequenceToken();
39 sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken();
[email protected]399ed422012-12-27 19:58:0040 thread_checker_.DetachFromThread();
[email protected]d52426c2013-07-30 19:26:4041}
42
43void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const {
44 lock_.AssertAcquired();
fdorayeed5fa72016-07-26 22:28:4545 if (is_assigned_)
[email protected]d52426c2013-07-30 19:26:4046 return;
47
fdorayeed5fa72016-07-26 22:28:4548 is_assigned_ = true;
49 sequence_token_ = SequenceToken::GetForCurrentThread();
50 sequenced_worker_pool_token_ =
51 SequencedWorkerPool::GetSequenceTokenForCurrentThread();
52
53 // SequencedWorkerPool doesn't use SequenceToken and code outside of
54 // SequenceWorkerPool doesn't set a SequencedWorkerPool token.
55 DCHECK(!sequence_token_.IsValid() || !sequenced_worker_pool_token_.IsValid());
[email protected]399ed422012-12-27 19:58:0056}
57
58} // namespace base