Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: third_party/WebKit/Source/platform/heap/Handle.h

Issue 1491253004: Release Oilpan heap singletons prior to LSan leak detection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move static-local ref registration to wtf/LeakAnnotations.h Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698