Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 Persistent<BookEnd> m_bookend; | 641 Persistent<BookEnd> m_bookend; |
| 642 int* m_gcCount; | 642 int* m_gcCount; |
| 643 }; | 643 }; |
| 644 | 644 |
| 645 class BookEnd final : public GarbageCollected<BookEnd> { | 645 class BookEnd final : public GarbageCollected<BookEnd> { |
| 646 USING_PRE_FINALIZER(BookEnd, dispose); | 646 USING_PRE_FINALIZER(BookEnd, dispose); |
| 647 public: | 647 public: |
| 648 BookEnd() | 648 BookEnd() |
| 649 : m_store(nullptr) | 649 : m_store(nullptr) |
| 650 { | 650 { |
| 651 ThreadState::current()->registerPreFinalizer(*this); | 651 ThreadState::current()->registerPreFinalizer(this); |
| 652 } | 652 } |
| 653 | 653 |
| 654 void initialize(PersistentStore* store) | 654 void initialize(PersistentStore* store) |
| 655 { | 655 { |
| 656 m_store = store; | 656 m_store = store; |
| 657 } | 657 } |
| 658 | 658 |
| 659 void dispose() | 659 void dispose() |
| 660 { | 660 { |
| 661 delete m_store; | 661 delete m_store; |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1185 , m_wasDestructed(false) | 1185 , m_wasDestructed(false) |
| 1186 { | 1186 { |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 Member<Bar> m_bar; | 1189 Member<Bar> m_bar; |
| 1190 bool m_wasDestructed; | 1190 bool m_wasDestructed; |
| 1191 }; | 1191 }; |
| 1192 | 1192 |
| 1193 bool Observable::s_willFinalizeWasCalled = false; | 1193 bool Observable::s_willFinalizeWasCalled = false; |
| 1194 | 1194 |
| 1195 class ObservableWithPreFinalizer : public GarbageCollected<ObservableWithPreFina lizer> { | 1195 class ObservableWithPreFinalizer : public GarbageCollectedFinalized<ObservableWi thPreFinalizer> { |
|
haraken
2015/06/24 07:59:28
This was a bug -- ObservableWithPreFinalizer shoul
| |
| 1196 USING_PRE_FINALIZER(ObservableWithPreFinalizer, dispose); | 1196 USING_PRE_FINALIZER(ObservableWithPreFinalizer, dispose); |
| 1197 public: | 1197 public: |
| 1198 static ObservableWithPreFinalizer* create() { return new ObservableWithPreFi nalizer(); } | 1198 static ObservableWithPreFinalizer* create() { return new ObservableWithPreFi nalizer(); } |
| 1199 ~ObservableWithPreFinalizer() { m_wasDestructed = true; } | 1199 ~ObservableWithPreFinalizer() { m_wasDestructed = true; } |
| 1200 DEFINE_INLINE_TRACE() { } | 1200 DEFINE_INLINE_VIRTUAL_TRACE() { } |
|
haraken
2015/06/24 07:59:27
Not related to this CL, it took me a couple of hou
sof
2015/06/24 11:21:56
Please notice that the GC plugin doesn't run insid
haraken
2015/06/24 12:54:01
Ah, makes sense; thanks!
| |
| 1201 void dispose() | 1201 void dispose() |
| 1202 { | 1202 { |
| 1203 ThreadState::current()->unregisterPreFinalizer(*this); | 1203 ThreadState::current()->unregisterPreFinalizer(this); |
| 1204 EXPECT_FALSE(m_wasDestructed); | 1204 EXPECT_FALSE(m_wasDestructed); |
| 1205 s_disposeWasCalled = true; | 1205 s_disposeWasCalled = true; |
| 1206 } | 1206 } |
| 1207 static bool s_disposeWasCalled; | 1207 static bool s_disposeWasCalled; |
| 1208 | 1208 |
| 1209 private: | 1209 protected: |
| 1210 explicit ObservableWithPreFinalizer() | 1210 ObservableWithPreFinalizer() |
| 1211 : m_wasDestructed(false) | 1211 : m_wasDestructed(false) |
| 1212 { | 1212 { |
| 1213 ThreadState::current()->registerPreFinalizer(*this); | 1213 ThreadState::current()->registerPreFinalizer(this); |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 bool m_wasDestructed; | 1216 bool m_wasDestructed; |
| 1217 }; | 1217 }; |
| 1218 | 1218 |
| 1219 bool ObservableWithPreFinalizer::s_disposeWasCalled = false; | 1219 bool ObservableWithPreFinalizer::s_disposeWasCalled = false; |
| 1220 | 1220 |
| 1221 class ObservableWithPreFinalizerMixin : public GarbageCollectedMixin { | |
| 1222 USING_PRE_FINALIZER(ObservableWithPreFinalizerMixin, dispose); | |
| 1223 public: | |
| 1224 ~ObservableWithPreFinalizerMixin() { m_wasDestructed = true; } | |
| 1225 DEFINE_INLINE_VIRTUAL_TRACE() { } | |
| 1226 void dispose() | |
| 1227 { | |
| 1228 EXPECT_FALSE(m_wasDestructed); | |
| 1229 s_disposeWasCalled = true; | |
| 1230 } | |
| 1231 static bool s_disposeWasCalled; | |
| 1232 | |
| 1233 protected: | |
| 1234 ObservableWithPreFinalizerMixin() | |
| 1235 : m_wasDestructed(false) | |
| 1236 { | |
| 1237 ThreadState::current()->registerPreFinalizer(this); | |
| 1238 } | |
| 1239 | |
| 1240 bool m_wasDestructed; | |
| 1241 }; | |
| 1242 | |
| 1243 bool ObservableWithPreFinalizerMixin::s_disposeWasCalled = false; | |
| 1244 | |
| 1245 class ObservableWithPreFinalizerSubClass : public ObservableWithPreFinalizer, pu blic ObservableWithPreFinalizerMixin { | |
| 1246 USING_GARBAGE_COLLECTED_MIXIN(ObservableWithPreFinalizerSubClass); | |
| 1247 USING_PRE_FINALIZER(ObservableWithPreFinalizerSubClass, dispose); | |
| 1248 public: | |
| 1249 static ObservableWithPreFinalizerSubClass* create() { return new ObservableW ithPreFinalizerSubClass(); } | |
| 1250 ~ObservableWithPreFinalizerSubClass() { m_wasDestructed = true; } | |
| 1251 DEFINE_INLINE_VIRTUAL_TRACE() { } | |
| 1252 void dispose() | |
| 1253 { | |
| 1254 EXPECT_FALSE(m_wasDestructed); | |
| 1255 s_disposeWasCalled = true; | |
| 1256 } | |
| 1257 static bool s_disposeWasCalled; | |
| 1258 | |
| 1259 protected: | |
| 1260 ObservableWithPreFinalizerSubClass() | |
| 1261 : ObservableWithPreFinalizer() | |
| 1262 , m_wasDestructed(false) | |
| 1263 { | |
| 1264 ThreadState::current()->registerPreFinalizer(this); | |
| 1265 } | |
| 1266 | |
| 1267 bool m_wasDestructed; | |
| 1268 }; | |
| 1269 | |
| 1270 bool ObservableWithPreFinalizerSubClass::s_disposeWasCalled = false; | |
| 1271 | |
| 1221 template <typename T> class FinalizationObserver : public GarbageCollected<Final izationObserver<T>> { | 1272 template <typename T> class FinalizationObserver : public GarbageCollected<Final izationObserver<T>> { |
| 1222 public: | 1273 public: |
| 1223 static FinalizationObserver* create(T* data) { return new FinalizationObserv er(data); } | 1274 static FinalizationObserver* create(T* data) { return new FinalizationObserv er(data); } |
| 1224 bool didCallWillFinalize() const { return m_didCallWillFinalize; } | 1275 bool didCallWillFinalize() const { return m_didCallWillFinalize; } |
| 1225 | 1276 |
| 1226 DEFINE_INLINE_TRACE() | 1277 DEFINE_INLINE_TRACE() |
| 1227 { | 1278 { |
| 1228 visitor->template registerWeakMembers<FinalizationObserver<T>, &Finaliza tionObserver<T>::zapWeakMembers>(this); | 1279 visitor->template registerWeakMembers<FinalizationObserver<T>, &Finaliza tionObserver<T>::zapWeakMembers>(this); |
| 1229 } | 1280 } |
| 1230 | 1281 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1596 private: | 1647 private: |
| 1597 Persistent<IntWrapper>* m_wrapper; | 1648 Persistent<IntWrapper>* m_wrapper; |
| 1598 }; | 1649 }; |
| 1599 | 1650 |
| 1600 class PreFinalizationAllocator : public GarbageCollectedFinalized<PreFinalizatio nAllocator> { | 1651 class PreFinalizationAllocator : public GarbageCollectedFinalized<PreFinalizatio nAllocator> { |
| 1601 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose); | 1652 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose); |
| 1602 public: | 1653 public: |
| 1603 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper) | 1654 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper) |
| 1604 : m_wrapper(wrapper) | 1655 : m_wrapper(wrapper) |
| 1605 { | 1656 { |
| 1606 ThreadState::current()->registerPreFinalizer(*this); | 1657 ThreadState::current()->registerPreFinalizer(this); |
| 1607 } | 1658 } |
| 1608 | 1659 |
| 1609 void dispose() | 1660 void dispose() |
| 1610 { | 1661 { |
| 1611 for (int i = 0; i < 10; ++i) | 1662 for (int i = 0; i < 10; ++i) |
| 1612 *m_wrapper = IntWrapper::create(42); | 1663 *m_wrapper = IntWrapper::create(42); |
| 1613 for (int i = 0; i < 512; ++i) | 1664 for (int i = 0; i < 512; ++i) |
| 1614 new OneKiloByteObject(); | 1665 new OneKiloByteObject(); |
| 1615 for (int i = 0; i < 32; ++i) | 1666 for (int i = 0; i < 32; ++i) |
| 1616 LargeHeapObject::create(); | 1667 LargeHeapObject::create(); |
| (...skipping 1992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3609 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); | 3660 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); |
| 3610 | 3661 |
| 3611 FinalizationObserverWithHashMap::clearObservers(); | 3662 FinalizationObserverWithHashMap::clearObservers(); |
| 3612 } | 3663 } |
| 3613 | 3664 |
| 3614 TEST(HeapTest, PreFinalizer) | 3665 TEST(HeapTest, PreFinalizer) |
| 3615 { | 3666 { |
| 3616 Observable::s_willFinalizeWasCalled = false; | 3667 Observable::s_willFinalizeWasCalled = false; |
| 3617 { | 3668 { |
| 3618 Observable* foo = Observable::create(Bar::create()); | 3669 Observable* foo = Observable::create(Bar::create()); |
| 3619 ThreadState::current()->registerPreFinalizer(*foo); | 3670 ThreadState::current()->registerPreFinalizer(foo); |
| 3620 } | 3671 } |
| 3621 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); | 3672 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); |
| 3622 EXPECT_TRUE(Observable::s_willFinalizeWasCalled); | 3673 EXPECT_TRUE(Observable::s_willFinalizeWasCalled); |
| 3623 } | 3674 } |
| 3624 | 3675 |
| 3625 TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered) | 3676 TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered) |
| 3626 { | 3677 { |
| 3627 Observable::s_willFinalizeWasCalled = false; | 3678 Observable::s_willFinalizeWasCalled = false; |
| 3628 { | 3679 { |
| 3629 Observable* foo = Observable::create(Bar::create()); | 3680 Observable* foo = Observable::create(Bar::create()); |
| 3630 ThreadState::current()->registerPreFinalizer(*foo); | 3681 ThreadState::current()->registerPreFinalizer(foo); |
| 3631 ThreadState::current()->unregisterPreFinalizer(*foo); | 3682 ThreadState::current()->unregisterPreFinalizer(foo); |
| 3632 } | 3683 } |
| 3633 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); | 3684 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); |
| 3634 EXPECT_FALSE(Observable::s_willFinalizeWasCalled); | 3685 EXPECT_FALSE(Observable::s_willFinalizeWasCalled); |
| 3635 } | 3686 } |
| 3636 | 3687 |
| 3637 TEST(HeapTest, PreFinalizerUnregistersItself) | 3688 TEST(HeapTest, PreFinalizerUnregistersItself) |
| 3638 { | 3689 { |
| 3639 ObservableWithPreFinalizer::s_disposeWasCalled = false; | 3690 ObservableWithPreFinalizer::s_disposeWasCalled = false; |
| 3640 ObservableWithPreFinalizer::create(); | 3691 ObservableWithPreFinalizer::create(); |
| 3641 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); | 3692 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); |
| 3642 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); | 3693 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); |
| 3643 // Don't crash, and assertions don't fail. | 3694 // Don't crash, and assertions don't fail. |
| 3644 } | 3695 } |
| 3645 | 3696 |
| 3697 TEST(HeapTest, NestedPreFinalizer) | |
| 3698 { | |
| 3699 ObservableWithPreFinalizer::s_disposeWasCalled = false; | |
| 3700 ObservableWithPreFinalizerSubClass::s_disposeWasCalled = false; | |
| 3701 ObservableWithPreFinalizerMixin::s_disposeWasCalled = false; | |
| 3702 ObservableWithPreFinalizerSubClass::create(); | |
| 3703 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith Sweep, Heap::ForcedGC); | |
| 3704 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); | |
| 3705 EXPECT_TRUE(ObservableWithPreFinalizerSubClass::s_disposeWasCalled); | |
| 3706 EXPECT_TRUE(ObservableWithPreFinalizerMixin::s_disposeWasCalled); | |
| 3707 // Don't crash, and assertions don't fail. | |
| 3708 } | |
| 3709 | |
| 3646 TEST(HeapTest, Comparisons) | 3710 TEST(HeapTest, Comparisons) |
| 3647 { | 3711 { |
| 3648 Persistent<Bar> barPersistent = Bar::create(); | 3712 Persistent<Bar> barPersistent = Bar::create(); |
| 3649 Persistent<Foo> fooPersistent = Foo::create(barPersistent); | 3713 Persistent<Foo> fooPersistent = Foo::create(barPersistent); |
| 3650 EXPECT_TRUE(barPersistent != fooPersistent); | 3714 EXPECT_TRUE(barPersistent != fooPersistent); |
| 3651 barPersistent = fooPersistent; | 3715 barPersistent = fooPersistent; |
| 3652 EXPECT_TRUE(barPersistent == fooPersistent); | 3716 EXPECT_TRUE(barPersistent == fooPersistent); |
| 3653 } | 3717 } |
| 3654 | 3718 |
| 3655 TEST(HeapTest, CheckAndMarkPointer) | 3719 TEST(HeapTest, CheckAndMarkPointer) |
| (...skipping 2522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6178 { | 6242 { |
| 6179 Persistent<ClassWithMember> object = ClassWithMember::create(); | 6243 Persistent<ClassWithMember> object = ClassWithMember::create(); |
| 6180 EXPECT_EQ(0, object->traceCount()); | 6244 EXPECT_EQ(0, object->traceCount()); |
| 6181 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object. get()); | 6245 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object. get()); |
| 6182 EXPECT_TRUE(mixin); | 6246 EXPECT_TRUE(mixin); |
| 6183 EXPECT_GT(object->traceCount(), 0); | 6247 EXPECT_GT(object->traceCount(), 0); |
| 6184 EXPECT_GT(mixin->traceCount(), 0); | 6248 EXPECT_GT(mixin->traceCount(), 0); |
| 6185 } | 6249 } |
| 6186 | 6250 |
| 6187 } // namespace blink | 6251 } // namespace blink |
| OLD | NEW |