Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 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 28 matching lines...) Expand all Loading... | |
| 39 #include "platform/heap/TraceTraits.h" | 39 #include "platform/heap/TraceTraits.h" |
| 40 #include "platform/heap/Visitor.h" | 40 #include "platform/heap/Visitor.h" |
| 41 #include "wtf/Functional.h" | 41 #include "wtf/Functional.h" |
| 42 #include "wtf/HashFunctions.h" | 42 #include "wtf/HashFunctions.h" |
| 43 #include "wtf/Locker.h" | 43 #include "wtf/Locker.h" |
| 44 #include "wtf/MainThread.h" | 44 #include "wtf/MainThread.h" |
| 45 #include "wtf/RawPtr.h" | 45 #include "wtf/RawPtr.h" |
| 46 #include "wtf/RefCounted.h" | 46 #include "wtf/RefCounted.h" |
| 47 #include "wtf/TypeTraits.h" | 47 #include "wtf/TypeTraits.h" |
| 48 | 48 |
| 49 #if defined(LEAK_SANITIZER) | |
| 50 #include "wtf/LeakAnnotations.h" | |
| 51 #endif | |
| 52 | |
| 49 namespace blink { | 53 namespace blink { |
| 50 | 54 |
| 51 enum WeaknessPersistentConfiguration { | 55 enum WeaknessPersistentConfiguration { |
| 52 NonWeakPersistentConfiguration, | 56 NonWeakPersistentConfiguration, |
| 53 WeakPersistentConfiguration | 57 WeakPersistentConfiguration |
| 54 }; | 58 }; |
| 55 | 59 |
| 56 enum CrossThreadnessPersistentConfiguration { | 60 enum CrossThreadnessPersistentConfiguration { |
| 57 SingleThreadPersistentConfiguration, | 61 SingleThreadPersistentConfiguration, |
| 58 CrossThreadPersistentConfiguration | 62 CrossThreadPersistentConfiguration |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 return *this; | 180 return *this; |
| 177 } | 181 } |
| 178 | 182 |
| 179 template<typename U> | 183 template<typename U> |
| 180 PersistentBase& operator=(const RawPtr<U>& other) | 184 PersistentBase& operator=(const RawPtr<U>& other) |
| 181 { | 185 { |
| 182 assign(other); | 186 assign(other); |
| 183 return *this; | 187 return *this; |
| 184 } | 188 } |
| 185 | 189 |
| 190 #if defined(LEAK_SANITIZER) | |
| 191 PersistentBase* registerAsStaticReference() | |
| 192 { | |
| 193 if (m_persistentNode) { | |
| 194 ThreadState::current()->registerStaticPersistentNode(m_persistentNod e); | |
| 195 WTF_ANNOTATE_LEAK_IGNORE_OBJECT(this); | |
| 196 } | |
| 197 return this; | |
| 198 } | |
| 199 #endif | |
| 186 | 200 |
| 187 private: | 201 private: |
| 188 NO_LAZY_SWEEP_SANITIZE_ADDRESS | 202 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
| 189 void assign(T* ptr) | 203 void assign(T* ptr) |
| 190 { | 204 { |
| 191 m_raw = ptr; | 205 m_raw = ptr; |
| 192 checkPointer(); | 206 checkPointer(); |
| 193 if (m_raw) { | 207 if (m_raw) { |
| 194 if (!m_persistentNode) | 208 if (!m_persistentNode) |
| 195 initialize(); | 209 initialize(); |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 538 uninitialize(); | 552 uninitialize(); |
| 539 } | 553 } |
| 540 | 554 |
| 541 template<typename VisitorDispatcher> | 555 template<typename VisitorDispatcher> |
| 542 void trace(VisitorDispatcher visitor) | 556 void trace(VisitorDispatcher visitor) |
| 543 { | 557 { |
| 544 static_assert(sizeof(Collection), "Collection must be fully defined"); | 558 static_assert(sizeof(Collection), "Collection must be fully defined"); |
| 545 visitor->trace(*static_cast<Collection*>(this)); | 559 visitor->trace(*static_cast<Collection*>(this)); |
| 546 } | 560 } |
| 547 | 561 |
| 562 #if defined(LEAK_SANITIZER) | |
| 563 PersistentHeapCollectionBase* registerAsStaticReference() | |
| 564 { | |
| 565 if (m_persistentNode) { | |
| 566 ThreadState::current()->registerStaticPersistentNode(m_persistentNod e); | |
| 567 WTF_ANNOTATE_LEAK_IGNORE_OBJECT(this); | |
| 568 } | |
| 569 return this; | |
| 570 } | |
| 571 #endif | |
| 572 | |
| 548 private: | 573 private: |
| 574 | |
| 549 NO_LAZY_SWEEP_SANITIZE_ADDRESS | 575 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
| 550 void initialize() | 576 void initialize() |
| 551 { | 577 { |
| 552 // FIXME: Derive affinity based on the collection. | 578 // FIXME: Derive affinity based on the collection. |
| 553 ThreadState* state = ThreadState::current(); | 579 ThreadState* state = ThreadState::current(); |
| 554 ASSERT(state->checkThread()); | 580 ASSERT(state->checkThread()); |
| 555 m_persistentNode = state->persistentRegion()->allocatePersistentNode(thi s, TraceMethodDelegate<PersistentHeapCollectionBase<Collection>, &PersistentHeap CollectionBase<Collection>::trace>::trampoline); | 581 m_persistentNode = state->persistentRegion()->allocatePersistentNode(thi s, TraceMethodDelegate<PersistentHeapCollectionBase<Collection>, &PersistentHeap CollectionBase<Collection>::trace>::trampoline); |
| 556 #if ENABLE(ASSERT) | 582 #if ENABLE(ASSERT) |
| 557 m_state = state; | 583 m_state = state; |
| 558 #endif | 584 #endif |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1060 return ptr; | 1086 return ptr; |
| 1061 } | 1087 } |
| 1062 | 1088 |
| 1063 #define USING_FAST_MALLOC_WILL_BE_REMOVED(type) // do nothing when oilpan is ena bled. | 1089 #define USING_FAST_MALLOC_WILL_BE_REMOVED(type) // do nothing when oilpan is ena bled. |
| 1064 #define USING_FAST_MALLOC_WITH_TYPE_NAME_WILL_BE_REMOVED(type) | 1090 #define USING_FAST_MALLOC_WITH_TYPE_NAME_WILL_BE_REMOVED(type) |
| 1065 #define DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1091 #define DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
| 1066 #define DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1092 #define DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
| 1067 #define DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1093 #define DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
| 1068 | 1094 |
| 1069 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \ | 1095 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \ |
| 1070 static type* name = (new Persistent<type>(arguments))->get(); | 1096 static type* name = *(new Persistent<type>(arguments))->registerAsStaticRefe rence(); |
| 1071 | 1097 |
| 1072 #else // !ENABLE(OILPAN) | 1098 #else // !ENABLE(OILPAN) |
| 1073 | 1099 |
| 1074 #define PassRefPtrWillBeRawPtr WTF::PassRefPtr | 1100 #define PassRefPtrWillBeRawPtr WTF::PassRefPtr |
| 1075 #define RefCountedWillBeGarbageCollected WTF::RefCounted | 1101 #define RefCountedWillBeGarbageCollected WTF::RefCounted |
| 1076 #define RefCountedWillBeGarbageCollectedFinalized WTF::RefCounted | 1102 #define RefCountedWillBeGarbageCollectedFinalized WTF::RefCounted |
| 1077 #define RefCountedWillBeRefCountedGarbageCollected WTF::RefCounted | 1103 #define RefCountedWillBeRefCountedGarbageCollected WTF::RefCounted |
| 1078 #define RefCountedGarbageCollectedWillBeGarbageCollectedFinalized blink::RefCoun tedGarbageCollected | 1104 #define RefCountedGarbageCollectedWillBeGarbageCollectedFinalized blink::RefCoun tedGarbageCollected |
| 1079 #define RefCountedWillBeNoBase WTF::RefCounted | 1105 #define RefCountedWillBeNoBase WTF::RefCounted |
| 1080 #define RefCountedGarbageCollectedWillBeNoBase blink::RefCountedGarbageCollected | 1106 #define RefCountedGarbageCollectedWillBeNoBase blink::RefCountedGarbageCollected |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1259 template<typename T> | 1285 template<typename T> |
| 1260 class AllowCrossThreadWeakPersistent { | 1286 class AllowCrossThreadWeakPersistent { |
| 1261 STACK_ALLOCATED(); | 1287 STACK_ALLOCATED(); |
| 1262 public: | 1288 public: |
| 1263 explicit AllowCrossThreadWeakPersistent(T* value) : m_value(value) { } | 1289 explicit AllowCrossThreadWeakPersistent(T* value) : m_value(value) { } |
| 1264 CrossThreadWeakPersistent<T> value() const { return m_value; } | 1290 CrossThreadWeakPersistent<T> value() const { return m_value; } |
| 1265 private: | 1291 private: |
| 1266 CrossThreadWeakPersistent<T> m_value; | 1292 CrossThreadWeakPersistent<T> m_value; |
| 1267 }; | 1293 }; |
| 1268 | 1294 |
| 1295 #if defined(LEAK_SANITIZER) | |
| 1296 class StaticReferenceDisableScope { | |
| 1297 public: | |
| 1298 StaticReferenceDisableScope() | |
| 1299 { | |
| 1300 ThreadState::current()->enterDisabledStaticReferenceRegistrationScope(); | |
|
haraken
2015/12/06 23:56:21
Can we add an if(ThreadState::current()) check? Th
sof
2015/12/07 07:18:19
Yes, that would be preferable. But wtf/LeakAnnotat
haraken
2015/12/07 07:23:36
Yeah, the dependency issue between platform/ and w
| |
| 1301 } | |
| 1302 | |
| 1303 ~StaticReferenceDisableScope() | |
| 1304 { | |
| 1305 ThreadState::current()->exitDisabledStaticReferenceRegistrationScope(); | |
| 1306 } | |
| 1307 }; | |
| 1308 #define LSAN_LEAK_SCOPE StaticReferenceDisableScope staticRefScope; WTF_ANNOTATE _LEAK_SCOPE | |
| 1309 #else | |
| 1310 #define LSAN_LEAK_SCOPE | |
| 1311 #endif | |
| 1312 | |
| 1269 } // namespace blink | 1313 } // namespace blink |
| 1270 | 1314 |
| 1271 namespace WTF { | 1315 namespace WTF { |
| 1272 | 1316 |
| 1273 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b link::Member<T>> { | 1317 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b link::Member<T>> { |
| 1274 static const bool needsDestruction = false; | 1318 static const bool needsDestruction = false; |
| 1275 static const bool canInitializeWithMemset = true; | 1319 static const bool canInitializeWithMemset = true; |
| 1276 static const bool canClearUnusedSlotsWithMemset = true; | 1320 static const bool canClearUnusedSlotsWithMemset = true; |
| 1277 static const bool canMoveWithMemcpy = true; | 1321 static const bool canMoveWithMemcpy = true; |
| 1278 }; | 1322 }; |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1507 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C rossThread)WeakPersistent. | 1551 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C rossThread)WeakPersistent. |
| 1508 static T* unwrap(const StorageType& value) { return value.get(); } | 1552 static T* unwrap(const StorageType& value) { return value.get(); } |
| 1509 }; | 1553 }; |
| 1510 | 1554 |
| 1511 template<typename T> | 1555 template<typename T> |
| 1512 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 1556 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; |
| 1513 | 1557 |
| 1514 } // namespace WTF | 1558 } // namespace WTF |
| 1515 | 1559 |
| 1516 #endif | 1560 #endif |
| OLD | NEW |