[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 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 | |||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 7 | #include "base/logging.h" |
8 | |||||
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 9 | namespace base { |
10 | |||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 11 | SequenceCheckerImpl::SequenceCheckerImpl() { |
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 12 | AutoLock auto_lock(lock_); |
13 | EnsureSequenceTokenAssigned(); | ||||
14 | } | ||||
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 15 | |
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 16 | SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 17 | |
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 18 | bool SequenceCheckerImpl::CalledOnValidSequencedThread() const { |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 19 | AutoLock auto_lock(lock_); |
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 20 | EnsureSequenceTokenAssigned(); |
21 | |||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 22 | if (sequence_token_.IsValid()) |
23 | return sequence_token_ == SequenceToken::GetForCurrentThread(); | ||||
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 24 | |
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 25 | 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] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 33 | } |
34 | |||||
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 35 | void SequenceCheckerImpl::DetachFromSequence() { |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 36 | AutoLock auto_lock(lock_); |
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 37 | is_assigned_ = false; |
38 | sequence_token_ = SequenceToken(); | ||||
39 | sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); | ||||
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 40 | thread_checker_.DetachFromThread(); |
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 41 | } |
42 | |||||
43 | void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { | ||||
44 | lock_.AssertAcquired(); | ||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 45 | if (is_assigned_) |
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 46 | return; |
47 | |||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame^] | 48 | 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] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 56 | } |
57 | |||||
58 | } // namespace base |