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 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |