Index: base/memory/weak_ptr_unittest.cc |
diff --git a/base/memory/weak_ptr_unittest.cc b/base/memory/weak_ptr_unittest.cc |
index dbe7960e28c43a58d5f349831e0575d5457f09b9..ff1103c86c6d60481eca555ec40d7d23688bd26a 100644 |
--- a/base/memory/weak_ptr_unittest.cc |
+++ b/base/memory/weak_ptr_unittest.cc |
@@ -339,7 +339,7 @@ TEST(WeakPtrTest, MoveOwnershipExplicitlyObjectNotReferenced) { |
// Case 1: The target is not bound to any thread yet. So calling |
// DetachFromThread() is a no-op. |
Target target; |
- target.DetachFromThread(); |
+ target.DetachFromThreadHack(); |
// Case 2: The target is bound to main thread but no WeakPtr is pointing to |
// it. In this case, it will be re-bound to any thread trying to get a |
@@ -347,7 +347,7 @@ TEST(WeakPtrTest, MoveOwnershipExplicitlyObjectNotReferenced) { |
{ |
WeakPtr<Target> weak_ptr = target.AsWeakPtr(); |
} |
- target.DetachFromThread(); |
+ target.DetachFromThreadHack(); |
} |
TEST(WeakPtrTest, MoveOwnershipExplicitly) { |
@@ -362,7 +362,7 @@ TEST(WeakPtrTest, MoveOwnershipExplicitly) { |
EXPECT_EQ(&target, background.DeRef(arrow)); |
// Detach from background thread. |
- target.DetachFromThread(); |
+ target.DetachFromThreadHack(); |
// Re-bind to main thread. |
EXPECT_EQ(&target, arrow->target.get()); |
@@ -500,7 +500,7 @@ TEST(WeakPtrDeathTest, WeakPtrCopyDoesNotChangeThreadBinding) { |
background.DeleteArrow(arrow_copy); |
} |
-TEST(WeakPtrDeathTest, NonOwnerThreadDereferencesWeakPtr) { |
+TEST(WeakPtrDeathTest, NonOwnerThreadDereferencesWeakPtrAfterReference) { |
// The default style "fast" does not support multi-threaded tests |
// (introduces deadlock on Linux). |
::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
@@ -512,6 +512,7 @@ TEST(WeakPtrDeathTest, NonOwnerThreadDereferencesWeakPtr) { |
// thread ownership can not be implicitly moved). |
Arrow arrow; |
arrow.target = target.AsWeakPtr(); |
+ arrow.target.get(); |
// Background thread tries to deref target, which violates thread ownership. |
BackgroundThread background; |
@@ -519,23 +520,66 @@ TEST(WeakPtrDeathTest, NonOwnerThreadDereferencesWeakPtr) { |
ASSERT_DEATH(background.DeRef(&arrow), ""); |
} |
-TEST(WeakPtrDeathTest, NonOwnerThreadDeletesObject) { |
+TEST(WeakPtrDeathTest, NonOwnerThreadDeletesWeakPtrAfterReference) { |
// The default style "fast" does not support multi-threaded tests |
// (introduces deadlock on Linux). |
::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
scoped_ptr<Target> target(new Target()); |
- // Main thread creates an arrow referencing the Target (so target's thread |
- // ownership can not be implicitly moved). |
+ |
+ // Main thread creates an arrow referencing the Target. |
+ Arrow arrow; |
+ arrow.target = target->AsWeakPtr(); |
+ |
+ // Background thread tries to deref target, binding it to the thread. |
+ BackgroundThread background; |
+ background.Start(); |
+ background.DeRef(&arrow); |
+ |
+ // Main thread deletes Target, violating thread binding. |
+ Target* foo = target.release(); |
+ ASSERT_DEATH(delete foo, ""); |
+} |
+ |
+TEST(WeakPtrDeathTest, NonOwnerThreadDeletesObjectAfterReference) { |
+ // The default style "fast" does not support multi-threaded tests |
+ // (introduces deadlock on Linux). |
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
+ |
+ scoped_ptr<Target> target(new Target()); |
+ |
+ // Main thread creates an arrow referencing the Target, and references it, so |
+ // that it becomes bound to the thread. |
Arrow arrow; |
arrow.target = target->AsWeakPtr(); |
+ arrow.target.get(); |
- // Background thread tries to delete target, which violates thread ownership. |
+ // Background thread tries to delete target, volating thread binding. |
BackgroundThread background; |
background.Start(); |
ASSERT_DEATH(background.DeleteTarget(target.release()), ""); |
} |
+TEST(WeakPtrDeathTest, NonOwnerThreadReferencesObjectAfterDeletion) { |
+ // The default style "fast" does not support multi-threaded tests |
+ // (introduces deadlock on Linux). |
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
+ |
+ scoped_ptr<Target> target(new Target()); |
+ |
+ // Main thread creates an arrow referencing the Target. |
+ Arrow arrow; |
+ arrow.target = target->AsWeakPtr(); |
+ |
+ // Background thread tries to delete target, binding the object to the thread. |
+ BackgroundThread background; |
+ background.Start(); |
+ background.DeleteTarget(target.release()); |
+ |
+ // Main thread attempts to dereference the target, violating thread binding. |
+ ASSERT_DEATH(arrow.target.get(), ""); |
+} |
+ |
#endif |
} // namespace base |