From 66cebbda350c3895eb3291cb2f195ed2542c72ac Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 9 Nov 2017 18:44:31 +0100 Subject: [PATCH] Remove aggressive thread checker from WeakPtrReference This allows to create WeakPtr and dereference it on different threads. Fix test to validate it. Bug: webrtc:8517 Change-Id: Idaf0bbdcf14bffbe43cb5fb6514041e8fa746004 Reviewed-on: https://webrtc-review.googlesource.com/21700 Commit-Queue: Danil Chapovalov Reviewed-by: Per Kjellander Cr-Commit-Position: refs/heads/master@{#20634} --- rtc_base/weak_ptr.cc | 4 ---- rtc_base/weak_ptr.h | 1 - rtc_base/weak_ptr_unittest.cc | 22 +++++++++++++++------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/rtc_base/weak_ptr.cc b/rtc_base/weak_ptr.cc index 453a22e8e4..c76256a092 100644 --- a/rtc_base/weak_ptr.cc +++ b/rtc_base/weak_ptr.cc @@ -52,16 +52,13 @@ bool WeakReference::is_valid() const { } WeakReferenceOwner::WeakReferenceOwner() { - checker_.Detach(); } WeakReferenceOwner::~WeakReferenceOwner() { - RTC_DCHECK(checker_.CalledSequentially()); Invalidate(); } WeakReference WeakReferenceOwner::GetRef() const { - RTC_DCHECK(checker_.CalledSequentially()); // If we hold the last reference to the Flag then create a new one. if (!HasRefs()) flag_ = new RefCountedObject(); @@ -70,7 +67,6 @@ WeakReference WeakReferenceOwner::GetRef() const { } void WeakReferenceOwner::Invalidate() { - RTC_DCHECK(checker_.CalledSequentially()); if (flag_.get()) { flag_->Invalidate(); flag_ = nullptr; diff --git a/rtc_base/weak_ptr.h b/rtc_base/weak_ptr.h index 4950dfc19e..8acfab0f03 100644 --- a/rtc_base/weak_ptr.h +++ b/rtc_base/weak_ptr.h @@ -135,7 +135,6 @@ class WeakReferenceOwner { void Invalidate(); private: - SequencedTaskChecker checker_; mutable scoped_refptr> flag_; }; diff --git a/rtc_base/weak_ptr_unittest.cc b/rtc_base/weak_ptr_unittest.cc index 0a2dceaf57..c22032b2f5 100644 --- a/rtc_base/weak_ptr_unittest.cc +++ b/rtc_base/weak_ptr_unittest.cc @@ -221,13 +221,21 @@ TEST(WeakPtrTest, ObjectAndWeakPtrOnDifferentThreads) { } TEST(WeakPtrTest, WeakPtrInitiateAndUseOnDifferentThreads) { - // Test that it is OK to create an object that has a WeakPtr member on one - // thread, but use it on another. This tests that we do not trip runtime - // checks that ensure that a WeakPtr is not used by multiple threads. - std::unique_ptr arrow(NewObjectCreatedOnTaskQueue()); - TargetWithFactory target; - arrow->target = target.factory.GetWeakPtr(); - EXPECT_EQ(&target, arrow->target.get()); + // Test that it is OK to create a WeakPtr on one thread, but use it on + // another. This tests that we do not trip runtime checks that ensure that a + // WeakPtr is not used by multiple threads. + auto target = rtc::MakeUnique(); + // Create weak ptr on main thread + WeakPtr weak_ptr = target->factory.GetWeakPtr(); + rtc::TaskQueue queue("queue"); + rtc::Event done(false, false); + queue.PostTask([&] { + // Dereference and invalide weak_ptr on another thread. + EXPECT_EQ(weak_ptr.get(), target.get()); + target.reset(); + done.Set(); + }); + EXPECT_TRUE(done.Wait(1000)); } } // namespace rtc