Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/sequence_checker_impl.h" | 5 #include "base/sequence_checker_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 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" | |
| 8 | 12 |
| 9 namespace base { | 13 namespace base { |
| 10 | 14 |
| 15 class SequenceCheckerImpl::Core { | |
| 16 public: | |
| 17 Core() { | |
| 18 sequence_token_ = SequenceToken::GetForCurrentThread(); | |
| 19 sequenced_worker_pool_token_ = | |
| 20 SequencedWorkerPool::GetSequenceTokenForCurrentThread(); | |
| 21 | |
| 22 // SequencedWorkerPool doesn't use SequenceToken and code outside of | |
| 23 // SequenceWorkerPool doesn't set a SequencedWorkerPool token. | |
| 24 DCHECK(!sequence_token_.IsValid() || | |
| 25 !sequenced_worker_pool_token_.IsValid()); | |
| 26 } | |
| 27 | |
| 28 ~Core() = default; | |
| 29 | |
| 30 bool CalledOnValidThread() const { | |
| 31 if (sequence_token_.IsValid()) | |
| 32 return sequence_token_ == SequenceToken::GetForCurrentThread(); | |
| 33 | |
| 34 if (sequenced_worker_pool_token_.IsValid()) { | |
| 35 return sequenced_worker_pool_token_.Equals( | |
| 36 SequencedWorkerPool::GetSequenceTokenForCurrentThread()); | |
| 37 } | |
| 38 | |
| 39 // SequenceChecker behaves as a ThreadChecker when it is not bound to a | |
| 40 // valid | |
| 41 // sequence token. | |
|
gab
2017/02/13 15:26:39
nit: wrap
tzik
2017/02/14 09:14:36
Done.
| |
| 42 return thread_checker_.CalledOnValidThread(); | |
| 43 } | |
| 44 | |
| 45 private: | |
| 46 mutable SequenceToken sequence_token_; | |
|
gab
2017/02/13 15:26:39
No longer needs to be mutable since |core_| is wha
tzik
2017/02/14 09:14:37
Done.
| |
| 47 | |
| 48 // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of | |
| 49 // TaskScheduler. crbug.com/622400 | |
| 50 mutable SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_; | |
|
gab
2017/02/13 15:26:39
ditto
tzik
2017/02/14 09:14:36
Done.
| |
| 51 | |
| 52 // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid. | |
| 53 ThreadCheckerImpl thread_checker_; | |
| 54 }; | |
| 55 | |
| 11 SequenceCheckerImpl::SequenceCheckerImpl() { | 56 SequenceCheckerImpl::SequenceCheckerImpl() { |
| 12 AutoLock auto_lock(lock_); | 57 AutoLock auto_lock(lock_); |
| 13 EnsureSequenceTokenAssigned(); | 58 EnsureSequenceTokenAssigned(); |
| 14 } | 59 } |
| 15 | 60 |
| 16 SequenceCheckerImpl::~SequenceCheckerImpl() = default; | 61 SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
| 17 | 62 |
| 18 bool SequenceCheckerImpl::CalledOnValidSequence() const { | 63 bool SequenceCheckerImpl::CalledOnValidSequence() const { |
| 19 AutoLock auto_lock(lock_); | 64 AutoLock auto_lock(lock_); |
| 20 EnsureSequenceTokenAssigned(); | 65 EnsureSequenceTokenAssigned(); |
| 21 | 66 return core_->CalledOnValidThread(); |
| 22 if (sequence_token_.IsValid()) | |
| 23 return sequence_token_ == SequenceToken::GetForCurrentThread(); | |
| 24 | |
| 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(); | |
| 33 } | 67 } |
| 34 | 68 |
| 35 void SequenceCheckerImpl::DetachFromSequence() { | 69 void SequenceCheckerImpl::DetachFromSequence() { |
| 36 AutoLock auto_lock(lock_); | 70 AutoLock auto_lock(lock_); |
| 37 is_assigned_ = false; | 71 core_.reset(); |
| 38 sequence_token_ = SequenceToken(); | |
| 39 sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); | |
| 40 thread_checker_.DetachFromThread(); | |
| 41 } | 72 } |
| 42 | 73 |
| 43 void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { | 74 void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { |
|
gab
2017/02/13 15:26:39
Since this is now simple and only called from two
tzik
2017/02/14 09:14:36
Done.
| |
| 44 lock_.AssertAcquired(); | 75 lock_.AssertAcquired(); |
| 45 if (is_assigned_) | 76 if (!core_) |
| 46 return; | 77 core_ = MakeUnique<Core>(); |
| 47 | |
| 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()); | |
| 56 } | 78 } |
| 57 | 79 |
| 58 } // namespace base | 80 } // namespace base |
| OLD | NEW |