Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: Source/platform/heap/HeapTest.cpp

Issue 1200333006: Oilpan: Support nested pre-finalizers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/modules/webaudio/AudioNode.cpp ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « Source/modules/webaudio/AudioNode.cpp ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698