Index: base/leak_tracker.h |
=================================================================== |
--- base/leak_tracker.h (revision 63176) |
+++ base/leak_tracker.h (working copy) |
@@ -1,132 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef BASE_LEAK_TRACKER_H_ |
-#define BASE_LEAK_TRACKER_H_ |
-#pragma once |
- |
-// Only enable leak tracking in debug builds. |
-#ifndef NDEBUG |
-#define ENABLE_LEAK_TRACKER |
-#endif |
- |
-#ifdef ENABLE_LEAK_TRACKER |
-#include "base/debug_util.h" |
-#include "base/linked_list.h" |
-#include "base/logging.h" |
-#endif // ENABLE_LEAK_TRACKER |
- |
-// LeakTracker is a helper to verify that all instances of a class |
-// have been destroyed. |
-// |
-// It is particularly useful for classes that are bound to a single thread -- |
-// before destroying that thread, one can check that there are no remaining |
-// instances of that class. |
-// |
-// For example, to enable leak tracking for class URLRequest, start by |
-// adding a member variable of type LeakTracker<URLRequest>. |
-// |
-// class URLRequest { |
-// ... |
-// private: |
-// base::LeakTracker<URLRequest> leak_tracker_; |
-// }; |
-// |
-// |
-// Next, when we believe all instances of URLRequest have been deleted: |
-// |
-// LeakTracker<URLRequest>::CheckForLeaks(); |
-// |
-// Should the check fail (because there are live instances of URLRequest), |
-// then the allocation callstack for each leaked instances is dumped to |
-// the error log. |
-// |
-// If ENABLE_LEAK_TRACKER is not defined, then the check has no effect. |
- |
-namespace base { |
- |
-#ifndef ENABLE_LEAK_TRACKER |
- |
-// If leak tracking is disabled, do nothing. |
-template<typename T> |
-class LeakTracker { |
- public: |
- static void CheckForLeaks() {} |
- static int NumLiveInstances() { return -1; } |
-}; |
- |
-#else |
- |
-// If leak tracking is enabled we track where the object was allocated from. |
- |
-template<typename T> |
-class LeakTracker : public LinkNode<LeakTracker<T> > { |
- public: |
- LeakTracker() { |
- instances()->Append(this); |
- } |
- |
- ~LeakTracker() { |
- this->RemoveFromList(); |
- } |
- |
- static void CheckForLeaks() { |
- // Walk the allocation list and print each entry it contains. |
- size_t count = 0; |
- |
- // Copy the first 3 leak allocation callstacks onto the stack. |
- // This way if we hit the CHECK() in a release build, the leak |
- // information will be available in mini-dump. |
- const size_t kMaxStackTracesToCopyOntoStack = 3; |
- StackTrace stacktraces[kMaxStackTracesToCopyOntoStack]; |
- |
- for (LinkNode<LeakTracker<T> >* node = instances()->head(); |
- node != instances()->end(); |
- node = node->next()) { |
- StackTrace& allocation_stack = node->value()->allocation_stack_; |
- |
- if (count < kMaxStackTracesToCopyOntoStack) |
- stacktraces[count] = allocation_stack; |
- |
- ++count; |
- LOG(ERROR) << "Leaked " << node << " which was allocated by:"; |
- allocation_stack.OutputToStream(&LOG_STREAM(ERROR)); |
- } |
- |
- CHECK_EQ(0u, count); |
- |
- // Hack to keep |stacktraces| and |count| alive (so compiler |
- // doesn't optimize it out, and it will appear in mini-dumps). |
- if (count == 0x1234) { |
- for (size_t i = 0; i < kMaxStackTracesToCopyOntoStack; ++i) |
- stacktraces[i].PrintBacktrace(); |
- } |
- } |
- |
- static int NumLiveInstances() { |
- // Walk the allocation list and count how many entries it has. |
- int count = 0; |
- for (LinkNode<LeakTracker<T> >* node = instances()->head(); |
- node != instances()->end(); |
- node = node->next()) { |
- ++count; |
- } |
- return count; |
- } |
- |
- private: |
- // Each specialization of LeakTracker gets its own static storage. |
- static LinkedList<LeakTracker<T> >* instances() { |
- static LinkedList<LeakTracker<T> > list; |
- return &list; |
- } |
- |
- StackTrace allocation_stack_; |
-}; |
- |
-#endif // ENABLE_LEAK_TRACKER |
- |
-} // namespace base |
- |
-#endif // BASE_LEAK_TRACKER_H_ |