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