Index: base/threading/thread_checker_impl.cc |
diff --git a/base/threading/thread_checker_impl.cc b/base/threading/thread_checker_impl.cc |
index eb87bae772cbbf9be35ccddad88ed886b1b1052a..ecc436bc2de2ed0af14061a25ef564720afe1e7d 100644 |
--- a/base/threading/thread_checker_impl.cc |
+++ b/base/threading/thread_checker_impl.cc |
@@ -4,31 +4,47 @@ |
#include "base/threading/thread_checker_impl.h" |
+#include "base/threading/thread_task_runner_handle.h" |
+ |
namespace base { |
-ThreadCheckerImpl::ThreadCheckerImpl() |
- : valid_thread_id_() { |
- EnsureThreadIdAssigned(); |
+ThreadCheckerImpl::ThreadCheckerImpl() { |
+ AutoLock auto_lock(lock_); |
+ EnsureAssigned(); |
} |
-ThreadCheckerImpl::~ThreadCheckerImpl() {} |
+ThreadCheckerImpl::~ThreadCheckerImpl() = default; |
bool ThreadCheckerImpl::CalledOnValidThread() const { |
- EnsureThreadIdAssigned(); |
AutoLock auto_lock(lock_); |
- return valid_thread_id_ == PlatformThread::CurrentRef(); |
+ EnsureAssigned(); |
+ |
+ // If this ThreadCheckerImpl is bound to a valid SequenceToken, it must be |
+ // equal to the current SequenceToken and there must be a registered |
+ // ThreadTaskRunnerHandle. Otherwise, the fact that the current task runs on |
+ // the thread to which this ThreadCheckerImpl is bound is fortuitous. |
+ if (sequence_token_.IsValid() && |
+ (sequence_token_ != internal::SequenceToken::GetCurrent() || |
+ !ThreadTaskRunnerHandle::IsSet())) { |
+ return false; |
+ } |
+ |
+ return thread_id_ == PlatformThread::CurrentRef(); |
} |
void ThreadCheckerImpl::DetachFromThread() { |
AutoLock auto_lock(lock_); |
- valid_thread_id_ = PlatformThreadRef(); |
+ thread_id_ = PlatformThreadRef(); |
+ sequence_token_ = internal::SequenceToken(); |
} |
-void ThreadCheckerImpl::EnsureThreadIdAssigned() const { |
- AutoLock auto_lock(lock_); |
- if (valid_thread_id_.is_null()) { |
- valid_thread_id_ = PlatformThread::CurrentRef(); |
- } |
+void ThreadCheckerImpl::EnsureAssigned() const { |
+ lock_.AssertAcquired(); |
+ if (!thread_id_.is_null()) |
+ return; |
+ |
+ thread_id_ = PlatformThread::CurrentRef(); |
+ sequence_token_ = internal::SequenceToken::GetCurrent(); |
} |
} // namespace base |