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

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, 5 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> {
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
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
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
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
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