diff options
author | vng <viktor.govako@gmail.com> | 2012-09-07 19:17:44 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:43:11 +0300 |
commit | a83a3c97ddaf5cac08d4c999f067b670f4303cdd (patch) | |
tree | f186951858edd0fb7a7e8afe17fc1861b6f12122 /base | |
parent | dd63cdd69f687b6e5e5557cbaf3a7d5036bdb820 (diff) |
Add simple objects tracker class for leaks finding.
Diffstat (limited to 'base')
-rw-r--r-- | base/base.pro | 2 | ||||
-rw-r--r-- | base/object_tracker.cpp | 61 | ||||
-rw-r--r-- | base/object_tracker.hpp | 33 |
3 files changed, 96 insertions, 0 deletions
diff --git a/base/base.pro b/base/base.pro index 7e8cdb6d7a..f7ce1aa03f 100644 --- a/base/base.pro +++ b/base/base.pro @@ -28,6 +28,7 @@ SOURCES += \ fence_manager.cpp \ strings_bundle.cpp \ string_format.cpp \ + object_tracker.cpp \ HEADERS += \ SRC_FIRST.hpp \ @@ -77,3 +78,4 @@ HEADERS += \ fence_manager.hpp \ strings_bundle.hpp \ string_format.hpp \ + object_tracker.hpp \ diff --git a/base/object_tracker.cpp b/base/object_tracker.cpp new file mode 100644 index 0000000000..d03c7d0ce0 --- /dev/null +++ b/base/object_tracker.cpp @@ -0,0 +1,61 @@ +#include "object_tracker.hpp" +#include "assert.hpp" +#include "logging.hpp" + + +namespace dbg +{ + +map<void *, size_t> ObjectTracker::m_map; +size_t ObjectTracker::m_counter = 0; + +#ifdef TRACKER_MULTITHREADED +threads::Mutex ObjectTracker::m_mutex; +#endif + +void ObjectTracker::Add(void * p) +{ +#ifdef TRACKER_MULTITHREADED + threads::MutexGuard guard(m_mutex); +#endif + + CHECK ( m_map.insert(make_pair(p, m_counter++)).second == true, () ); +} + +void ObjectTracker::Remove(void * p) +{ +#ifdef TRACKER_MULTITHREADED + threads::MutexGuard guard(m_mutex); +#endif + + CHECK ( m_map.erase(p) == 1, () ); +} + +ObjectTracker::ObjectTracker() +{ + Add(this); +} + +ObjectTracker::ObjectTracker(ObjectTracker const &) +{ + Add(this); +} + +ObjectTracker::~ObjectTracker() +{ + Remove(this); +} + +void ObjectTracker::PrintLeaks() +{ +#ifdef TRACKER_MULTITHREADED + threads::MutexGuard guard(m_mutex); +#endif + + if (m_map.empty()) + LOG(LINFO, ("No leaks found!")); + else + LOG(LINFO, ("Leaks map:", m_map)); +} + +} diff --git a/base/object_tracker.hpp b/base/object_tracker.hpp new file mode 100644 index 0000000000..c2fbe91ae5 --- /dev/null +++ b/base/object_tracker.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "base.hpp" +#include "mutex.hpp" + +#include "../std/map.hpp" + + +#define TRACKER_MULTITHREADED + +namespace dbg +{ + class ObjectTracker + { + /// Pointer -> Info (Serial number of creation) + static map<void *, size_t> m_map; + static size_t m_counter; + +#ifdef TRACKER_MULTITHREADED + static threads::Mutex m_mutex; +#endif + + static void Add(void *); + static void Remove(void *); + + public: + ObjectTracker(); + ObjectTracker(ObjectTracker const & rhs); + ~ObjectTracker(); + + static void PrintLeaks(); + }; +} |