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...) 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 | |
53 namespace blink { | 49 namespace blink { |
54 | 50 |
55 enum WeaknessPersistentConfiguration { | 51 enum WeaknessPersistentConfiguration { |
56 NonWeakPersistentConfiguration, | 52 NonWeakPersistentConfiguration, |
57 WeakPersistentConfiguration | 53 WeakPersistentConfiguration |
58 }; | 54 }; |
59 | 55 |
60 enum CrossThreadnessPersistentConfiguration { | 56 enum CrossThreadnessPersistentConfiguration { |
61 SingleThreadPersistentConfiguration, | 57 SingleThreadPersistentConfiguration, |
62 CrossThreadPersistentConfiguration | 58 CrossThreadPersistentConfiguration |
(...skipping 117 matching lines...) Loading... |
180 return *this; | 176 return *this; |
181 } | 177 } |
182 | 178 |
183 template<typename U> | 179 template<typename U> |
184 PersistentBase& operator=(const RawPtr<U>& other) | 180 PersistentBase& operator=(const RawPtr<U>& other) |
185 { | 181 { |
186 assign(other); | 182 assign(other); |
187 return *this; | 183 return *this; |
188 } | 184 } |
189 | 185 |
190 #if defined(LEAK_SANITIZER) | |
191 PersistentBase* registerAsStaticReference() | |
192 { | |
193 if (m_persistentNode) { | |
194 ASSERT(ThreadState::current()); | |
195 ThreadState::current()->registerStaticPersistentNode(m_persistentNod
e); | |
196 LEAK_SANITIZER_IGNORE_OBJECT(this); | |
197 } | |
198 return this; | |
199 } | |
200 #endif | |
201 | 186 |
202 private: | 187 private: |
203 NO_LAZY_SWEEP_SANITIZE_ADDRESS | 188 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
204 void assign(T* ptr) | 189 void assign(T* ptr) |
205 { | 190 { |
206 m_raw = ptr; | 191 m_raw = ptr; |
207 checkPointer(); | 192 checkPointer(); |
208 if (m_raw) { | 193 if (m_raw) { |
209 if (!m_persistentNode) | 194 if (!m_persistentNode) |
210 initialize(); | 195 initialize(); |
(...skipping 342 matching lines...) Loading... |
553 uninitialize(); | 538 uninitialize(); |
554 } | 539 } |
555 | 540 |
556 template<typename VisitorDispatcher> | 541 template<typename VisitorDispatcher> |
557 void trace(VisitorDispatcher visitor) | 542 void trace(VisitorDispatcher visitor) |
558 { | 543 { |
559 static_assert(sizeof(Collection), "Collection must be fully defined"); | 544 static_assert(sizeof(Collection), "Collection must be fully defined"); |
560 visitor->trace(*static_cast<Collection*>(this)); | 545 visitor->trace(*static_cast<Collection*>(this)); |
561 } | 546 } |
562 | 547 |
563 #if defined(LEAK_SANITIZER) | |
564 PersistentHeapCollectionBase* registerAsStaticReference() | |
565 { | |
566 if (m_persistentNode) { | |
567 ASSERT(ThreadState::current()); | |
568 ThreadState::current()->registerStaticPersistentNode(m_persistentNod
e); | |
569 LEAK_SANITIZER_IGNORE_OBJECT(this); | |
570 } | |
571 return this; | |
572 } | |
573 #endif | |
574 | |
575 private: | 548 private: |
576 | |
577 NO_LAZY_SWEEP_SANITIZE_ADDRESS | 549 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
578 void initialize() | 550 void initialize() |
579 { | 551 { |
580 // FIXME: Derive affinity based on the collection. | 552 // FIXME: Derive affinity based on the collection. |
581 ThreadState* state = ThreadState::current(); | 553 ThreadState* state = ThreadState::current(); |
582 ASSERT(state->checkThread()); | 554 ASSERT(state->checkThread()); |
583 m_persistentNode = state->persistentRegion()->allocatePersistentNode(thi
s, TraceMethodDelegate<PersistentHeapCollectionBase<Collection>, &PersistentHeap
CollectionBase<Collection>::trace>::trampoline); | 555 m_persistentNode = state->persistentRegion()->allocatePersistentNode(thi
s, TraceMethodDelegate<PersistentHeapCollectionBase<Collection>, &PersistentHeap
CollectionBase<Collection>::trace>::trampoline); |
584 #if ENABLE(ASSERT) | 556 #if ENABLE(ASSERT) |
585 m_state = state; | 557 m_state = state; |
586 #endif | 558 #endif |
(...skipping 500 matching lines...) Loading... |
1087 static_assert(isGarbageCollected, "T needs to be a garbage collected type.")
; | 1059 static_assert(isGarbageCollected, "T needs to be a garbage collected type.")
; |
1088 return ptr; | 1060 return ptr; |
1089 } | 1061 } |
1090 | 1062 |
1091 #define USING_FAST_MALLOC_WILL_BE_REMOVED(type) // do nothing when oilpan is ena
bled. | 1063 #define USING_FAST_MALLOC_WILL_BE_REMOVED(type) // do nothing when oilpan is ena
bled. |
1092 #define USING_FAST_MALLOC_WITH_TYPE_NAME_WILL_BE_REMOVED(type) | 1064 #define USING_FAST_MALLOC_WITH_TYPE_NAME_WILL_BE_REMOVED(type) |
1093 #define DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1065 #define DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
1094 #define DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1066 #define DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
1095 #define DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing | 1067 #define DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) // do nothing |
1096 | 1068 |
1097 #if defined(LEAK_SANITIZER) | |
1098 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \ | 1069 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \ |
1099 static type* name = *(new Persistent<type>(arguments))->registerAsStaticRefe
rence() | 1070 static type* name = (new Persistent<type>(arguments))->get(); |
1100 #else | |
1101 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \ | |
1102 static type* name = *(new Persistent<type>(arguments)) | |
1103 #endif | |
1104 | 1071 |
1105 #else // !ENABLE(OILPAN) | 1072 #else // !ENABLE(OILPAN) |
1106 | 1073 |
1107 #define PassRefPtrWillBeRawPtr WTF::PassRefPtr | 1074 #define PassRefPtrWillBeRawPtr WTF::PassRefPtr |
1108 #define RefCountedWillBeGarbageCollected WTF::RefCounted | 1075 #define RefCountedWillBeGarbageCollected WTF::RefCounted |
1109 #define RefCountedWillBeGarbageCollectedFinalized WTF::RefCounted | 1076 #define RefCountedWillBeGarbageCollectedFinalized WTF::RefCounted |
1110 #define RefCountedWillBeRefCountedGarbageCollected WTF::RefCounted | 1077 #define RefCountedWillBeRefCountedGarbageCollected WTF::RefCounted |
1111 #define RefCountedGarbageCollectedWillBeGarbageCollectedFinalized blink::RefCoun
tedGarbageCollected | 1078 #define RefCountedGarbageCollectedWillBeGarbageCollectedFinalized blink::RefCoun
tedGarbageCollected |
1112 #define RefCountedWillBeNoBase WTF::RefCounted | 1079 #define RefCountedWillBeNoBase WTF::RefCounted |
1113 #define RefCountedGarbageCollectedWillBeNoBase blink::RefCountedGarbageCollected | 1080 #define RefCountedGarbageCollectedWillBeNoBase blink::RefCountedGarbageCollected |
(...skipping 178 matching lines...) Loading... |
1292 template<typename T> | 1259 template<typename T> |
1293 class AllowCrossThreadWeakPersistent { | 1260 class AllowCrossThreadWeakPersistent { |
1294 STACK_ALLOCATED(); | 1261 STACK_ALLOCATED(); |
1295 public: | 1262 public: |
1296 explicit AllowCrossThreadWeakPersistent(T* value) : m_value(value) { } | 1263 explicit AllowCrossThreadWeakPersistent(T* value) : m_value(value) { } |
1297 CrossThreadWeakPersistent<T> value() const { return m_value; } | 1264 CrossThreadWeakPersistent<T> value() const { return m_value; } |
1298 private: | 1265 private: |
1299 CrossThreadWeakPersistent<T> m_value; | 1266 CrossThreadWeakPersistent<T> m_value; |
1300 }; | 1267 }; |
1301 | 1268 |
1302 // LEAK_SANITIZER_DISABLED_SCOPE: all allocations made in the current scope | |
1303 // will be exempted from LSan consideration. | |
1304 // | |
1305 // TODO(sof): move this to wtf/LeakAnnotations.h (LeakSanitizer.h?) once | |
1306 // wtf/ can freely call upon Oilpan functionality. | |
1307 #if defined(LEAK_SANITIZER) | |
1308 class LeakSanitizerDisableScope { | |
1309 STACK_ALLOCATED(); | |
1310 WTF_MAKE_NONCOPYABLE(LeakSanitizerDisableScope); | |
1311 public: | |
1312 LeakSanitizerDisableScope() | |
1313 { | |
1314 __lsan_disable(); | |
1315 if (ThreadState::current()) | |
1316 ThreadState::current()->enterStaticReferenceRegistrationDisabledScop
e(); | |
1317 } | |
1318 | |
1319 ~LeakSanitizerDisableScope() | |
1320 { | |
1321 __lsan_enable(); | |
1322 if (ThreadState::current()) | |
1323 ThreadState::current()->leaveStaticReferenceRegistrationDisabledScop
e(); | |
1324 } | |
1325 }; | |
1326 #define LEAK_SANITIZER_DISABLED_SCOPE LeakSanitizerDisableScope lsanDisabledScop
e | |
1327 #else | |
1328 #define LEAK_SANITIZER_DISABLED_SCOPE | |
1329 #endif | |
1330 | |
1331 } // namespace blink | 1269 } // namespace blink |
1332 | 1270 |
1333 namespace WTF { | 1271 namespace WTF { |
1334 | 1272 |
1335 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b
link::Member<T>> { | 1273 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b
link::Member<T>> { |
1336 static const bool needsDestruction = false; | 1274 static const bool needsDestruction = false; |
1337 static const bool canInitializeWithMemset = true; | 1275 static const bool canInitializeWithMemset = true; |
1338 static const bool canClearUnusedSlotsWithMemset = true; | 1276 static const bool canClearUnusedSlotsWithMemset = true; |
1339 static const bool canMoveWithMemcpy = true; | 1277 static const bool canMoveWithMemcpy = true; |
1340 }; | 1278 }; |
(...skipping 228 matching lines...) Loading... |
1569 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C
rossThread)WeakPersistent. | 1507 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C
rossThread)WeakPersistent. |
1570 static T* unwrap(const StorageType& value) { return value.get(); } | 1508 static T* unwrap(const StorageType& value) { return value.get(); } |
1571 }; | 1509 }; |
1572 | 1510 |
1573 template<typename T> | 1511 template<typename T> |
1574 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 1512 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; |
1575 | 1513 |
1576 } // namespace WTF | 1514 } // namespace WTF |
1577 | 1515 |
1578 #endif | 1516 #endif |
OLD | NEW |