| 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 |