Index: base/sequence_checker_impl.cc |
diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc |
index e95b8ee5f3e25e639a609e5cb0c5aad291fe6e59..cbf5053f9651c04bd60e04ef55bcf4ec69253d88 100644 |
--- a/base/sequence_checker_impl.cc |
+++ b/base/sequence_checker_impl.cc |
@@ -4,43 +4,55 @@ |
#include "base/sequence_checker_impl.h" |
+#include "base/logging.h" |
+ |
namespace base { |
-SequenceCheckerImpl::SequenceCheckerImpl() |
- : sequence_token_assigned_(false) { |
+SequenceCheckerImpl::SequenceCheckerImpl() { |
AutoLock auto_lock(lock_); |
EnsureSequenceTokenAssigned(); |
} |
-SequenceCheckerImpl::~SequenceCheckerImpl() {} |
+SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
bool SequenceCheckerImpl::CalledOnValidSequencedThread() const { |
AutoLock auto_lock(lock_); |
EnsureSequenceTokenAssigned(); |
- // If this thread is not associated with a SequencedWorkerPool, |
- // SequenceChecker behaves as a ThreadChecker. See header for details. |
- if (!sequence_token_.IsValid()) |
- return thread_checker_.CalledOnValidThread(); |
+ if (sequence_token_.IsValid()) |
gab
2016/07/26 20:49:49
Do we even need IsValid() in a world where invalid
fdoray
2016/07/28 18:10:04
If we do that, we'll delegate to |thread_checker_|
|
+ return sequence_token_ == SequenceToken::GetForCurrentThread(); |
+ |
+ if (sequenced_worker_pool_token_.IsValid()) { |
+ return sequenced_worker_pool_token_.Equals( |
+ SequencedWorkerPool::GetSequenceTokenForCurrentThread()); |
+ } |
- return sequence_token_.Equals( |
- SequencedWorkerPool::GetSequenceTokenForCurrentThread()); |
+ // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid |
+ // sequence token. |
+ return thread_checker_.CalledOnValidThread(); |
} |
void SequenceCheckerImpl::DetachFromSequence() { |
AutoLock auto_lock(lock_); |
+ is_assigned_ = false; |
+ sequence_token_ = SequenceToken(); |
+ sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); |
thread_checker_.DetachFromThread(); |
- sequence_token_assigned_ = false; |
- sequence_token_ = SequencedWorkerPool::SequenceToken(); |
} |
void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { |
lock_.AssertAcquired(); |
- if (sequence_token_assigned_) |
+ if (is_assigned_) |
return; |
- sequence_token_assigned_ = true; |
- sequence_token_ = SequencedWorkerPool::GetSequenceTokenForCurrentThread(); |
+ 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()); |
} |
} // namespace base |