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

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: renamings + switch to using LEAK_SANITIZER_DISABLED_SCOPE 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);
haraken 2015/12/07 14:46:10 Add ASSERT(ThreadState::current()).
sof 2015/12/07 16:59:17 Done.
195 LEAK_SANITIZER_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);
haraken 2015/12/07 14:46:10 Ditto.
567 LEAK_SANITIZER_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 // LEAK_SANITIZER_DISABLED_SCOPE: all allocations made in the current scope
1296 // will be exempted from LSan consideration.
1297 //
1298 // TODO(sof): move this to wtf/LeakAnnotations.h (LeakSanitizer.h?) once
1299 // wtf/ can freely call upon Oilpan functionality.
1300 #if defined(LEAK_SANITIZER)
1301 class LeakSanitizerDisableScope {
haraken 2015/12/07 14:46:10 Add STACK_ALLOCATED.
sof 2015/12/07 16:59:17 Done.
1302 WTF_MAKE_NONCOPYABLE(LeakSanitizerDisableScope);
1303 public:
1304 LeakSanitizerDisableScope()
1305 {
1306 __lsan_disable();
1307 if (ThreadState::current())
1308 ThreadState::current()->enterStaticReferenceRegistrationDisabledScop e();
1309 }
1310
1311 ~LeakSanitizerDisableScope()
1312 {
1313 __lsan_enable();
1314 if (ThreadState::current())
1315 ThreadState::current()->leaveStaticReferenceRegistrationDisabledScop e();
1316 }
1317 };
1318 #define LEAK_SANITIZER_DISABLED_SCOPE LeakSanitizerDisableScope lsanDisabledScop e
1319 #else
1320 #define LEAK_SANITIZER_DISABLED_SCOPE
1321 #endif
1322
1269 } // namespace blink 1323 } // namespace blink
1270 1324
1271 namespace WTF { 1325 namespace WTF {
1272 1326
1273 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b link::Member<T>> { 1327 template <typename T> struct VectorTraits<blink::Member<T>> : VectorTraitsBase<b link::Member<T>> {
1274 static const bool needsDestruction = false; 1328 static const bool needsDestruction = false;
1275 static const bool canInitializeWithMemset = true; 1329 static const bool canInitializeWithMemset = true;
1276 static const bool canClearUnusedSlotsWithMemset = true; 1330 static const bool canClearUnusedSlotsWithMemset = true;
1277 static const bool canMoveWithMemcpy = true; 1331 static const bool canMoveWithMemcpy = true;
1278 }; 1332 };
(...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. 1561 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C rossThread)WeakPersistent.
1508 static T* unwrap(const StorageType& value) { return value.get(); } 1562 static T* unwrap(const StorageType& value) { return value.get(); }
1509 }; 1563 };
1510 1564
1511 template<typename T> 1565 template<typename T>
1512 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; 1566 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete;
1513 1567
1514 } // namespace WTF 1568 } // namespace WTF
1515 1569
1516 #endif 1570 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698