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

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

Issue 2565983002: Implicit prefinalizer registration. (Closed)
Patch Set: recast registration class Created 4 years 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
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 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 : public GarbageCollectedFinalized<ObservableWithPreFinalizer> { 1153 : public GarbageCollectedFinalized<ObservableWithPreFinalizer> {
1154 USING_PRE_FINALIZER(ObservableWithPreFinalizer, dispose); 1154 USING_PRE_FINALIZER(ObservableWithPreFinalizer, dispose);
1155 1155
1156 public: 1156 public:
1157 static ObservableWithPreFinalizer* create() { 1157 static ObservableWithPreFinalizer* create() {
1158 return new ObservableWithPreFinalizer(); 1158 return new ObservableWithPreFinalizer();
1159 } 1159 }
1160 ~ObservableWithPreFinalizer() { m_wasDestructed = true; } 1160 ~ObservableWithPreFinalizer() { m_wasDestructed = true; }
1161 DEFINE_INLINE_TRACE() {} 1161 DEFINE_INLINE_TRACE() {}
1162 void dispose() { 1162 void dispose() {
1163 ThreadState::current()->unregisterPreFinalizer(this);
1164 EXPECT_FALSE(m_wasDestructed); 1163 EXPECT_FALSE(m_wasDestructed);
1165 s_disposeWasCalled = true; 1164 s_disposeWasCalled = true;
1166 } 1165 }
1167 static bool s_disposeWasCalled; 1166 static bool s_disposeWasCalled;
1168 1167
1169 protected: 1168 protected:
1170 ObservableWithPreFinalizer() : m_wasDestructed(false) { 1169 ObservableWithPreFinalizer() : m_wasDestructed(false) {
1171 ThreadState::current()->registerPreFinalizer(this);
1172 } 1170 }
1173 1171
1174 bool m_wasDestructed; 1172 bool m_wasDestructed;
1175 }; 1173 };
1176 1174
1177 bool ObservableWithPreFinalizer::s_disposeWasCalled = false; 1175 bool ObservableWithPreFinalizer::s_disposeWasCalled = false;
1178 1176
1179 bool s_disposeWasCalledForPreFinalizerBase = false; 1177 bool s_disposeWasCalledForPreFinalizerBase = false;
1180 bool s_disposeWasCalledForPreFinalizerMixin = false; 1178 bool s_disposeWasCalledForPreFinalizerMixin = false;
1181 bool s_disposeWasCalledForPreFinalizerSubClass = false; 1179 bool s_disposeWasCalledForPreFinalizerSubClass = false;
1182 1180
1183 class PreFinalizerBase : public GarbageCollectedFinalized<PreFinalizerBase> { 1181 class PreFinalizerBase : public GarbageCollectedFinalized<PreFinalizerBase> {
1184 USING_PRE_FINALIZER(PreFinalizerBase, dispose); 1182 USING_PRE_FINALIZER(PreFinalizerBase, dispose);
1185 1183
1186 public: 1184 public:
1187 static PreFinalizerBase* create() { return new PreFinalizerBase(); } 1185 static PreFinalizerBase* create() { return new PreFinalizerBase(); }
1188 virtual ~PreFinalizerBase() { m_wasDestructed = true; } 1186 virtual ~PreFinalizerBase() { m_wasDestructed = true; }
1189 DEFINE_INLINE_VIRTUAL_TRACE() {} 1187 DEFINE_INLINE_VIRTUAL_TRACE() {}
1190 void dispose() { 1188 void dispose() {
1191 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase); 1189 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase);
1192 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass); 1190 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass);
1193 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerMixin); 1191 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerMixin);
1194 EXPECT_FALSE(m_wasDestructed); 1192 EXPECT_FALSE(m_wasDestructed);
1195 s_disposeWasCalledForPreFinalizerBase = true; 1193 s_disposeWasCalledForPreFinalizerBase = true;
1196 } 1194 }
1197 1195
1198 protected: 1196 protected:
1199 PreFinalizerBase() : m_wasDestructed(false) { 1197 PreFinalizerBase() : m_wasDestructed(false) {
1200 ThreadState::current()->registerPreFinalizer(this);
1201 } 1198 }
1202 bool m_wasDestructed; 1199 bool m_wasDestructed;
1203 }; 1200 };
1204 1201
1205 class PreFinalizerMixin : public GarbageCollectedMixin { 1202 class PreFinalizerMixin : public GarbageCollectedMixin {
1206 USING_PRE_FINALIZER(PreFinalizerMixin, dispose); 1203 USING_PRE_FINALIZER(PreFinalizerMixin, dispose);
1207 1204
1208 public: 1205 public:
1209 ~PreFinalizerMixin() { m_wasDestructed = true; } 1206 ~PreFinalizerMixin() { m_wasDestructed = true; }
1210 DEFINE_INLINE_VIRTUAL_TRACE() {} 1207 DEFINE_INLINE_VIRTUAL_TRACE() {}
1211 void dispose() { 1208 void dispose() {
1212 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase); 1209 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase);
1213 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass); 1210 EXPECT_TRUE(s_disposeWasCalledForPreFinalizerSubClass);
1214 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerMixin); 1211 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerMixin);
1215 EXPECT_FALSE(m_wasDestructed); 1212 EXPECT_FALSE(m_wasDestructed);
1216 s_disposeWasCalledForPreFinalizerMixin = true; 1213 s_disposeWasCalledForPreFinalizerMixin = true;
1217 } 1214 }
1218 1215
1219 protected: 1216 protected:
1220 PreFinalizerMixin() : m_wasDestructed(false) { 1217 PreFinalizerMixin() : m_wasDestructed(false) {
1221 ThreadState::current()->registerPreFinalizer(this);
1222 } 1218 }
1223 bool m_wasDestructed; 1219 bool m_wasDestructed;
1224 }; 1220 };
1225 1221
1226 class PreFinalizerSubClass : public PreFinalizerBase, public PreFinalizerMixin { 1222 class PreFinalizerSubClass : public PreFinalizerBase, public PreFinalizerMixin {
1227 USING_GARBAGE_COLLECTED_MIXIN(PreFinalizerSubClass); 1223 USING_GARBAGE_COLLECTED_MIXIN(PreFinalizerSubClass);
1228 USING_PRE_FINALIZER(PreFinalizerSubClass, dispose); 1224 USING_PRE_FINALIZER(PreFinalizerSubClass, dispose);
1229 1225
1230 public: 1226 public:
1231 static PreFinalizerSubClass* create() { return new PreFinalizerSubClass(); } 1227 static PreFinalizerSubClass* create() { return new PreFinalizerSubClass(); }
1232 ~PreFinalizerSubClass() { m_wasDestructed = true; } 1228 ~PreFinalizerSubClass() { m_wasDestructed = true; }
1233 DEFINE_INLINE_VIRTUAL_TRACE() {} 1229 DEFINE_INLINE_VIRTUAL_TRACE() {}
1234 void dispose() { 1230 void dispose() {
1235 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase); 1231 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerBase);
1236 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerSubClass); 1232 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerSubClass);
1237 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerMixin); 1233 EXPECT_FALSE(s_disposeWasCalledForPreFinalizerMixin);
1238 EXPECT_FALSE(m_wasDestructed); 1234 EXPECT_FALSE(m_wasDestructed);
1239 s_disposeWasCalledForPreFinalizerSubClass = true; 1235 s_disposeWasCalledForPreFinalizerSubClass = true;
1240 } 1236 }
1241 1237
1242 protected: 1238 protected:
1243 PreFinalizerSubClass() : m_wasDestructed(false) { 1239 PreFinalizerSubClass() : m_wasDestructed(false) {
1244 ThreadState::current()->registerPreFinalizer(this);
1245 } 1240 }
1246 bool m_wasDestructed; 1241 bool m_wasDestructed;
1247 }; 1242 };
1248 1243
1249 template <typename T> 1244 template <typename T>
1250 class FinalizationObserver : public GarbageCollected<FinalizationObserver<T>> { 1245 class FinalizationObserver : public GarbageCollected<FinalizationObserver<T>> {
1251 public: 1246 public:
1252 static FinalizationObserver* create(T* data) { 1247 static FinalizationObserver* create(T* data) {
1253 return new FinalizationObserver(data); 1248 return new FinalizationObserver(data);
1254 } 1249 }
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 Persistent<IntWrapper>* m_wrapper; 1549 Persistent<IntWrapper>* m_wrapper;
1555 }; 1550 };
1556 1551
1557 class PreFinalizationAllocator 1552 class PreFinalizationAllocator
1558 : public GarbageCollectedFinalized<PreFinalizationAllocator> { 1553 : public GarbageCollectedFinalized<PreFinalizationAllocator> {
1559 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose); 1554 USING_PRE_FINALIZER(PreFinalizationAllocator, dispose);
1560 1555
1561 public: 1556 public:
1562 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper) 1557 PreFinalizationAllocator(Persistent<IntWrapper>* wrapper)
1563 : m_wrapper(wrapper) { 1558 : m_wrapper(wrapper) {
1564 ThreadState::current()->registerPreFinalizer(this);
1565 } 1559 }
1566 1560
1567 void dispose() { 1561 void dispose() {
1568 for (int i = 0; i < 10; ++i) 1562 for (int i = 0; i < 10; ++i)
1569 *m_wrapper = IntWrapper::create(42); 1563 *m_wrapper = IntWrapper::create(42);
1570 for (int i = 0; i < 512; ++i) 1564 for (int i = 0; i < 512; ++i)
1571 new OneKiloByteObject(); 1565 new OneKiloByteObject();
1572 for (int i = 0; i < 32; ++i) 1566 for (int i = 0; i < 32; ++i)
1573 LargeHeapObject::create(); 1567 LargeHeapObject::create();
1574 } 1568 }
(...skipping 2299 matching lines...) Expand 10 before | Expand all | Expand 10 after
3874 preciselyCollectGarbage(); 3868 preciselyCollectGarbage();
3875 EXPECT_EQ(0u, Bar::s_live); 3869 EXPECT_EQ(0u, Bar::s_live);
3876 EXPECT_EQ(0u, map.size()); 3870 EXPECT_EQ(0u, map.size());
3877 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); 3871 EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize);
3878 3872
3879 FinalizationObserverWithHashMap::clearObservers(); 3873 FinalizationObserverWithHashMap::clearObservers();
3880 } 3874 }
3881 3875
3882 TEST(HeapTest, PreFinalizer) { 3876 TEST(HeapTest, PreFinalizer) {
3883 Observable::s_willFinalizeWasCalled = false; 3877 Observable::s_willFinalizeWasCalled = false;
3884 { 3878 { Observable::create(Bar::create()); }
3885 Observable* foo = Observable::create(Bar::create());
3886 ThreadState::current()->registerPreFinalizer(foo);
3887 }
3888 preciselyCollectGarbage(); 3879 preciselyCollectGarbage();
3889 EXPECT_TRUE(Observable::s_willFinalizeWasCalled); 3880 EXPECT_TRUE(Observable::s_willFinalizeWasCalled);
3890 } 3881 }
3891 3882
3892 TEST(HeapTest, PreFinalizerIsNotCalledIfUnregistered) {
3893 Observable::s_willFinalizeWasCalled = false;
3894 {
3895 Observable* foo = Observable::create(Bar::create());
3896 ThreadState::current()->registerPreFinalizer(foo);
3897 ThreadState::current()->unregisterPreFinalizer(foo);
3898 }
3899 preciselyCollectGarbage();
3900 EXPECT_FALSE(Observable::s_willFinalizeWasCalled);
3901 }
3902
3903 TEST(HeapTest, PreFinalizerUnregistersItself) { 3883 TEST(HeapTest, PreFinalizerUnregistersItself) {
3904 ObservableWithPreFinalizer::s_disposeWasCalled = false; 3884 ObservableWithPreFinalizer::s_disposeWasCalled = false;
3905 ObservableWithPreFinalizer::create(); 3885 ObservableWithPreFinalizer::create();
3906 preciselyCollectGarbage(); 3886 preciselyCollectGarbage();
3907 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled); 3887 EXPECT_TRUE(ObservableWithPreFinalizer::s_disposeWasCalled);
3908 // Don't crash, and assertions don't fail. 3888 // Don't crash, and assertions don't fail.
3909 } 3889 }
3910 3890
3911 TEST(HeapTest, NestedPreFinalizer) { 3891 TEST(HeapTest, NestedPreFinalizer) {
3912 s_disposeWasCalledForPreFinalizerBase = false; 3892 s_disposeWasCalledForPreFinalizerBase = false;
(...skipping 2894 matching lines...) Expand 10 before | Expand all | Expand 10 after
6807 "HeapVector"); 6787 "HeapVector");
6808 static_assert( 6788 static_assert(
6809 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value, 6789 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value,
6810 "HeapDeque"); 6790 "HeapDeque");
6811 static_assert(WTF::IsGarbageCollectedType< 6791 static_assert(WTF::IsGarbageCollectedType<
6812 HeapTerminatedArray<Member<IntWrapper>>>::value, 6792 HeapTerminatedArray<Member<IntWrapper>>>::value,
6813 "HeapTerminatedArray"); 6793 "HeapTerminatedArray");
6814 } 6794 }
6815 6795
6816 } // namespace blink 6796 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md ('k') | third_party/WebKit/Source/platform/heap/ThreadState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698