Index: base/debug/leak_annotations.h |
diff --git a/base/debug/leak_annotations.h b/base/debug/leak_annotations.h |
index 51adfb05d6c7b22c1604a52357f95cf8bdae6617..887b51d682519415fa7aca4a6ece1f61d6883b56 100644 |
--- a/base/debug/leak_annotations.h |
+++ b/base/debug/leak_annotations.h |
@@ -7,31 +7,56 @@ |
#include "build/build_config.h" |
+// This file defines macros which can be used to annotate intentional memory |
+// leaks. Support for annotations is implemented in HeapChecker and |
+// LeakSanitizer. Annotated objects will be treated as a source of live |
+// pointers, i.e. any heap objects reachable by following pointers from an |
+// annotated object will not be reported as leaks. |
+// |
+// ANNOTATE_SCOPED_MEMORY_LEAK: all allocations made in the current scope |
+// will be annotated as leaks. |
+// ANNOTATE_LEAKING_OBJECT_PTR(X): the heap object referenced by pointer X will |
+// be annotated as a leak. |
+// |
+// Note that HeapChecker will report a fatal error if an object which has been |
+// annotated with ANNOTATE_LEAKING_OBJECT_PTR is later deleted (but |
+// LeakSanitizer won't). |
+ |
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_NACL) && \ |
defined(USE_HEAPCHECKER) |
#include "third_party/tcmalloc/chromium/src/gperftools/heap-checker.h" |
-// Annotate a program scope as having memory leaks. Tcmalloc's heap leak |
-// checker will ignore them. Note that these annotations may mask real bugs |
-// and should not be used in the production code. |
#define ANNOTATE_SCOPED_MEMORY_LEAK \ |
HeapLeakChecker::Disabler heap_leak_checker_disabler |
-// Annotate an object pointer as referencing a leaky object. This object and all |
-// the heap objects referenced by it will be ignored by the heap checker. |
-// |
-// X should be referencing an active allocated object. If it is not, the |
-// annotation will be ignored. |
-// No object should be annotated with ANNOTATE_SCOPED_MEMORY_LEAK twice. |
-// Once an object is annotated with ANNOTATE_SCOPED_MEMORY_LEAK, it cannot be |
-// deleted. |
#define ANNOTATE_LEAKING_OBJECT_PTR(X) \ |
HeapLeakChecker::IgnoreObject(X) |
+#elif defined(LEAK_SANITIZER) |
+ |
+extern "C" { |
+void __lsan_disable(); |
+void __lsan_enable(); |
+void __lsan_ignore_object(const void *p); |
+} // extern "C" |
+ |
+class ScopedLeakSanitizerDisabler { |
+ public: |
+ ScopedLeakSanitizerDisabler() { __lsan_disable(); } |
+ ~ScopedLeakSanitizerDisabler() { __lsan_enable(); } |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ScopedLeakSanitizerDisabler); |
+}; |
+ |
+#define ANNOTATE_SCOPED_MEMORY_LEAK \ |
+ ScopedLeakSanitizerDisabler leak_sanitizer_disabler |
+ |
+#define ANNOTATE_LEAKING_OBJECT_PTR(X) __lsan_ignore_object(X); |
+ |
#else |
-// If tcmalloc is not used, the annotations should be no-ops. |
+// If neither HeapChecker nor LSan are used, the annotations should be no-ops. |
#define ANNOTATE_SCOPED_MEMORY_LEAK ((void)0) |
#define ANNOTATE_LEAKING_OBJECT_PTR(X) ((void)0) |