Index: base/sequence_checker_impl.cc |
diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc |
index b8e87e6d4249c50c72662498c019f56e4fbb5e2b..df2a8cb24fef58b68633745afd723705ac1455f7 100644 |
--- a/base/sequence_checker_impl.cc |
+++ b/base/sequence_checker_impl.cc |
@@ -5,54 +5,65 @@ |
#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 { |
-SequenceCheckerImpl::SequenceCheckerImpl() { |
- AutoLock auto_lock(lock_); |
- EnsureSequenceTokenAssigned(); |
-} |
+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()); |
+ } |
-SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
+ ~Core() = default; |
-bool SequenceCheckerImpl::CalledOnValidSequence() const { |
- AutoLock auto_lock(lock_); |
- EnsureSequenceTokenAssigned(); |
+ bool CalledOnValidThread() const { |
+ if (sequence_token_.IsValid()) |
+ return sequence_token_ == SequenceToken::GetForCurrentThread(); |
- if (sequence_token_.IsValid()) |
- return sequence_token_ == SequenceToken::GetForCurrentThread(); |
+ if (sequenced_worker_pool_token_.IsValid()) { |
+ return sequenced_worker_pool_token_.Equals( |
+ SequencedWorkerPool::GetSequenceTokenForCurrentThread()); |
+ } |
- 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(); |
} |
- // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid |
- // sequence token. |
- return thread_checker_.CalledOnValidThread(); |
-} |
+ private: |
+ SequenceToken sequence_token_; |
-void SequenceCheckerImpl::DetachFromSequence() { |
- AutoLock auto_lock(lock_); |
- is_assigned_ = false; |
- sequence_token_ = SequenceToken(); |
- sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); |
- thread_checker_.DetachFromThread(); |
-} |
+ // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of |
+ // TaskScheduler. crbug.com/622400 |
+ SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_; |
+ |
+ // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid. |
+ ThreadCheckerImpl thread_checker_; |
+}; |
-void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { |
- lock_.AssertAcquired(); |
- if (is_assigned_) |
- return; |
+SequenceCheckerImpl::SequenceCheckerImpl() : core_(MakeUnique<Core>()) {} |
+SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
- is_assigned_ = true; |
- sequence_token_ = SequenceToken::GetForCurrentThread(); |
- sequenced_worker_pool_token_ = |
- SequencedWorkerPool::GetSequenceTokenForCurrentThread(); |
+bool SequenceCheckerImpl::CalledOnValidSequence() const { |
+ AutoLock auto_lock(lock_); |
+ if (!core_) |
+ core_ = MakeUnique<Core>(); |
+ return core_->CalledOnValidThread(); |
+} |
- // 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()); |
+void SequenceCheckerImpl::DetachFromSequence() { |
+ AutoLock auto_lock(lock_); |
+ core_.reset(); |
} |
} // namespace base |