Chromium Code Reviews| Index: base/sequence_checker_impl.cc |
| diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc |
| index b8e87e6d4249c50c72662498c019f56e4fbb5e2b..06c512f44da5b025470d3b763e5ccac343b6a8a4 100644 |
| --- a/base/sequence_checker_impl.cc |
| +++ b/base/sequence_checker_impl.cc |
| @@ -5,9 +5,54 @@ |
| #include "base/sequence_checker_impl.h" |
| #include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| +#include "base/sequence_token.h" |
| +#include "base/threading/sequenced_worker_pool.h" |
| +#include "base/threading/thread_checker_impl.h" |
| namespace base { |
| +class SequenceCheckerImpl::Core { |
| + public: |
| + Core() { |
| + sequence_token_ = SequenceToken::GetForCurrentThread(); |
| + sequenced_worker_pool_token_ = |
| + SequencedWorkerPool::GetSequenceTokenForCurrentThread(); |
| + |
| + // SequencedWorkerPool doesn't use SequenceToken and code outside of |
| + // SequenceWorkerPool doesn't set a SequencedWorkerPool token. |
| + DCHECK(!sequence_token_.IsValid() || |
| + !sequenced_worker_pool_token_.IsValid()); |
| + } |
| + |
| + ~Core() = default; |
| + |
| + bool CalledOnValidThread() const { |
| + if (sequence_token_.IsValid()) |
| + return sequence_token_ == SequenceToken::GetForCurrentThread(); |
| + |
| + if (sequenced_worker_pool_token_.IsValid()) { |
| + return sequenced_worker_pool_token_.Equals( |
| + SequencedWorkerPool::GetSequenceTokenForCurrentThread()); |
| + } |
| + |
| + // SequenceChecker behaves as a ThreadChecker when it is not bound to a |
| + // valid |
| + // sequence token. |
|
gab
2017/02/13 15:26:39
nit: wrap
tzik
2017/02/14 09:14:36
Done.
|
| + return thread_checker_.CalledOnValidThread(); |
| + } |
| + |
| + private: |
| + 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.
|
| + |
| + // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of |
| + // TaskScheduler. crbug.com/622400 |
| + mutable SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_; |
|
gab
2017/02/13 15:26:39
ditto
tzik
2017/02/14 09:14:36
Done.
|
| + |
| + // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid. |
| + ThreadCheckerImpl thread_checker_; |
| +}; |
| + |
| SequenceCheckerImpl::SequenceCheckerImpl() { |
| AutoLock auto_lock(lock_); |
| EnsureSequenceTokenAssigned(); |
| @@ -18,41 +63,18 @@ SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
| bool SequenceCheckerImpl::CalledOnValidSequence() const { |
| AutoLock auto_lock(lock_); |
| EnsureSequenceTokenAssigned(); |
| - |
| - if (sequence_token_.IsValid()) |
| - return sequence_token_ == SequenceToken::GetForCurrentThread(); |
| - |
| - if (sequenced_worker_pool_token_.IsValid()) { |
| - return sequenced_worker_pool_token_.Equals( |
| - SequencedWorkerPool::GetSequenceTokenForCurrentThread()); |
| - } |
| - |
| - // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid |
| - // sequence token. |
| - return thread_checker_.CalledOnValidThread(); |
| + return core_->CalledOnValidThread(); |
| } |
| void SequenceCheckerImpl::DetachFromSequence() { |
| AutoLock auto_lock(lock_); |
| - is_assigned_ = false; |
| - sequence_token_ = SequenceToken(); |
| - sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); |
| - thread_checker_.DetachFromThread(); |
| + core_.reset(); |
| } |
| 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.
|
| lock_.AssertAcquired(); |
| - if (is_assigned_) |
| - return; |
| - |
| - is_assigned_ = true; |
| - sequence_token_ = SequenceToken::GetForCurrentThread(); |
| - sequenced_worker_pool_token_ = |
| - SequencedWorkerPool::GetSequenceTokenForCurrentThread(); |
| - |
| - // SequencedWorkerPool doesn't use SequenceToken and code outside of |
| - // SequenceWorkerPool doesn't set a SequencedWorkerPool token. |
| - DCHECK(!sequence_token_.IsValid() || !sequenced_worker_pool_token_.IsValid()); |
| + if (!core_) |
| + core_ = MakeUnique<Core>(); |
| } |
| } // namespace base |