| 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> { |
| 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_TRACE() { } |
| 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 bool s_disposeWasCalledForPreFinalizerBase = false; |
| 1222 bool s_disposeWasCalledForPreFinalizerMixin = false; |
| 1223 bool s_disposeWasCalledForPreFinalizerSubClass = false; |
| 1224 |
| 1225 class PreFinalizerBase : public GarbageCollectedFinalized<PreFinalizerBase> { |
| 1226 USING_PRE_FINALIZER(PreFinalizerBase, dispose); |
| 1227 public: |
| 1228 static PreFinalizerBase* create() { return new PreFinalizerBase(); } |
| 1229 ~PreFinalizerBase() { m_wasDestructed = true; } |
| 1230 DEFINE_INLINE_VIRTUAL_TRACE() { } |
| 1231 void dispose() |
| 1232 { |
| 1233 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase); |
| 1234 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass); |
| 1235 EXPECT_FALSE(m_wasDestructed); |
| 1236 s_disposeWasCalledForPreFinalizerBase = true; |
| 1237 } |
| 1238 |
| 1239 protected: |
| 1240 PreFinalizerBase() |
| 1241 : m_wasDestructed(false) |
| 1242 { |
| 1243 ThreadState::current()->registerPreFinalizer(this); |
| 1244 } |
| 1245 bool m_wasDestructed; |
| 1246 }; |
| 1247 |
| 1248 class PreFinalizerMixin : public GarbageCollectedMixin { |
| 1249 USING_PRE_FINALIZER(PreFinalizerMixin, dispose); |
| 1250 public: |
| 1251 ~PreFinalizerMixin() { m_wasDestructed = true; } |
| 1252 DEFINE_INLINE_VIRTUAL_TRACE() { } |
| 1253 void dispose() |
| 1254 { |
| 1255 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerMixin); |
| 1256 EXPECT_FALSE(m_wasDestructed); |
| 1257 s_disposeWasCalledForPreFinalizerMixin = true; |
| 1258 } |
| 1259 |
| 1260 protected: |
| 1261 PreFinalizerMixin() |
| 1262 : m_wasDestructed(false) |
| 1263 { |
| 1264 ThreadState::current()->registerPreFinalizer(this); |
| 1265 } |
| 1266 bool m_wasDestructed; |
| 1267 }; |
| 1268 |
| 1269 class PreFinalizerSubClass : public PreFinalizerBase, public PreFinalizerMixin { |
| 1270 USING_GARBAGE_COLLECTED_MIXIN(PreFinalizerSubClass); |
| 1271 USING_PRE_FINALIZER(PreFinalizerSubClass, dispose); |
| 1272 public: |
| 1273 static PreFinalizerSubClass* create() { return new PreFinalizerSubClass();
} |
| 1274 ~PreFinalizerSubClass() { m_wasDestructed = true; } |
| 1275 DEFINE_INLINE_VIRTUAL_TRACE() { } |
| 1276 void dispose() |
| 1277 { |
| 1278 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase); |
| 1279 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerSubClass); |
| 1280 EXPECT_FALSE(m_wasDestructed); |
| 1281 s_disposeWasCalledForPreFinalizerSubClass = true; |
| 1282 } |
| 1283 |
| 1284 protected: |
| 1285 PreFinalizerSubClass() |
| 1286 : m_wasDestructed(false) |
| 1287 { |
| 1288 ThreadState::current()->registerPreFinalizer(this); |
| 1289 } |
| 1290 bool m_wasDestructed; |
| 1291 }; |
| 1292 |
| 1221 template <typename T> class FinalizationObserver : public GarbageCollected<Final
izationObserver<T>> { | 1293 template <typename T> class FinalizationObserver : public GarbageCollected<Final
izationObserver<T>> { |
| 1222 public: | 1294 public: |
| 1223 static FinalizationObserver* create(T* data) { return new FinalizationObserv
er(data); } | 1295 static FinalizationObserver* create(T* data) { return new FinalizationObserv
er(data); } |
| 1224 bool didCallWillFinalize() const { return m_didCallWillFinalize; } | 1296 bool didCallWillFinalize() const { return m_didCallWillFinalize; } |
| 1225 | 1297 |
| 1226 DEFINE_INLINE_TRACE() | 1298 DEFINE_INLINE_TRACE() |
| 1227 { | 1299 { |
| 1228 visitor->template registerWeakMembers<FinalizationObserver<T>, &Finaliza
tionObserver<T>::zapWeakMembers>(this); | 1300 visitor->template registerWeakMembers<FinalizationObserver<T>, &Finaliza
tionObserver<T>::zapWeakMembers>(this); |
| 1229 } | 1301 } |
| 1230 | 1302 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1596 private: | 1668 private: |
| 1597 Persistent<IntWrapper>* m_wrapper; | 1669 Persistent<IntWrapper>* m_wrapper; |
| 1598 }; | 1670 }; |
| 1599 | 1671 |
| 1600 class PreFinalizationAllocator : public GarbageCollectedFinalized<PreFinalizatio
nAllocator> { | 1672 class PreFinalizationAllocator : public GarbageCollectedFinalized<PreFinalizatio
nAllocator> { |
| 1601 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose); | 1673 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose); |
| 1602 public: | 1674 public: |
| 1603 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper) | 1675 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper) |
| 1604 : m_wrapper(wrapper) | 1676 : m_wrapper(wrapper) |
| 1605 { | 1677 { |
| 1606 ThreadState::current()->registerPreFinalizer(*this); | 1678 ThreadState::current()->registerPreFinalizer(this); |
| 1607 } | 1679 } |
| 1608 | 1680 |
| 1609 void dispose() | 1681 void dispose() |
| 1610 { | 1682 { |
| 1611 for (int i = 0; i < 10; ++i) | 1683 for (int i = 0; i < 10; ++i) |
| 1612 *m_wrapper = IntWrapper::create(42); | 1684 *m_wrapper = IntWrapper::create(42); |
| 1613 for (int i = 0; i < 512; ++i) | 1685 for (int i = 0; i < 512; ++i) |
| 1614 new OneKiloByteObject(); | 1686 new OneKiloByteObject(); |
| 1615 for (int i = 0; i < 32; ++i) | 1687 for (int i = 0; i < 32; ++i) |
| 1616 LargeHeapObject::create(); | 1688 LargeHeapObject::create(); |
| (...skipping 1992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3609 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); | 3681 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); |
| 3610 | 3682 |
| 3611 FinalizationObserverWithHashMap::clearObservers(); | 3683 FinalizationObserverWithHashMap::clearObservers(); |
| 3612 } | 3684 } |
| 3613 | 3685 |
| 3614 TEST(HeapTest, PreFinalizer) | 3686 TEST(HeapTest, PreFinalizer) |
| 3615 { | 3687 { |
| 3616 Observable::s_willFinalizeWasCalled = false; | 3688 Observable::s_willFinalizeWasCalled = false; |
| 3617 { | 3689 { |
| 3618 Observable* foo = Observable::create(Bar::create()); | 3690 Observable* foo = Observable::create(Bar::create()); |
| 3619 ThreadState::current()->registerPreFinalizer(*foo); | 3691 ThreadState::current()->registerPreFinalizer(foo); |
| 3620 } | 3692 } |
| 3621 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); | 3693 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); |
| 3622 EXPECT_TRUE(Observable::s_willFinalizeWasCalled); | 3694 EXPECT_TRUE(Observable::s_willFinalizeWasCalled); |
| 3623 } | 3695 } |
| 3624 | 3696 |
| 3625 TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered) | 3697 TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered) |
| 3626 { | 3698 { |
| 3627 Observable::s_willFinalizeWasCalled = false; | 3699 Observable::s_willFinalizeWasCalled = false; |
| 3628 { | 3700 { |
| 3629 Observable* foo = Observable::create(Bar::create()); | 3701 Observable* foo = Observable::create(Bar::create()); |
| 3630 ThreadState::current()->registerPreFinalizer(*foo); | 3702 ThreadState::current()->registerPreFinalizer(foo); |
| 3631 ThreadState::current()->unregisterPreFinalizer(*foo); | 3703 ThreadState::current()->unregisterPreFinalizer(foo); |
| 3632 } | 3704 } |
| 3633 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); | 3705 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); |
| 3634 EXPECT_FALSE(Observable::s_willFinalizeWasCalled); | 3706 EXPECT_FALSE(Observable::s_willFinalizeWasCalled); |
| 3635 } | 3707 } |
| 3636 | 3708 |
| 3637 TEST(HeapTest, PreFinalizerUnregistersItself) | 3709 TEST(HeapTest, PreFinalizerUnregistersItself) |
| 3638 { | 3710 { |
| 3639 ObservableWithPreFinalizer::s_disposeWasCalled = false; | 3711 ObservableWithPreFinalizer::s_disposeWasCalled = false; |
| 3640 ObservableWithPreFinalizer::create(); | 3712 ObservableWithPreFinalizer::create(); |
| 3641 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); | 3713 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); |
| 3642 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); | 3714 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); |
| 3643 // Don't crash, and assertions don't fail. | 3715 // Don't crash, and assertions don't fail. |
| 3644 } | 3716 } |
| 3645 | 3717 |
| 3718 TEST(HeapTest, NestedPreFinalizer) |
| 3719 { |
| 3720 s_disposeWasCalledForPreFinalizerBase = false; |
| 3721 s_disposeWasCalledForPreFinalizerSubClass = false; |
| 3722 s_disposeWasCalledForPreFinalizerMixin = false; |
| 3723 PreFinalizerSubClass::create(); |
| 3724 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::GCWith
Sweep, Heap::ForcedGC); |
| 3725 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerBase); |
| 3726 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass); |
| 3727 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerMixin); |
| 3728 // Don't crash, and assertions don't fail. |
| 3729 } |
| 3730 |
| 3646 TEST(HeapTest, Comparisons) | 3731 TEST(HeapTest, Comparisons) |
| 3647 { | 3732 { |
| 3648 Persistent<Bar> barPersistent = Bar::create(); | 3733 Persistent<Bar> barPersistent = Bar::create(); |
| 3649 Persistent<Foo> fooPersistent = Foo::create(barPersistent); | 3734 Persistent<Foo> fooPersistent = Foo::create(barPersistent); |
| 3650 EXPECT_TRUE(barPersistent != fooPersistent); | 3735 EXPECT_TRUE(barPersistent != fooPersistent); |
| 3651 barPersistent = fooPersistent; | 3736 barPersistent = fooPersistent; |
| 3652 EXPECT_TRUE(barPersistent == fooPersistent); | 3737 EXPECT_TRUE(barPersistent == fooPersistent); |
| 3653 } | 3738 } |
| 3654 | 3739 |
| 3655 TEST(HeapTest, CheckAndMarkPointer) | 3740 TEST(HeapTest, CheckAndMarkPointer) |
| (...skipping 2522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6178 { | 6263 { |
| 6179 Persistent<ClassWithMember> object = ClassWithMember::create(); | 6264 Persistent<ClassWithMember> object = ClassWithMember::create(); |
| 6180 EXPECT_EQ(0, object->traceCount()); | 6265 EXPECT_EQ(0, object->traceCount()); |
| 6181 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object.
get()); | 6266 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object.
get()); |
| 6182 EXPECT_TRUE(mixin); | 6267 EXPECT_TRUE(mixin); |
| 6183 EXPECT_GT(object->traceCount(), 0); | 6268 EXPECT_GT(object->traceCount(), 0); |
| 6184 EXPECT_GT(mixin->traceCount(), 0); | 6269 EXPECT_GT(mixin->traceCount(), 0); |
| 6185 } | 6270 } |
| 6186 | 6271 |
| 6187 } // namespace blink | 6272 } // namespace blink |
| OLD | NEW |