Add simple objects tracker class for leaks finding.

This commit is contained in:
vng 2012-09-07 18:17:44 +03:00 committed by Alex Zolotarev
parent dd63cdd69f
commit a83a3c97dd
3 changed files with 96 additions and 0 deletions

View file

@ -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 \

61
base/object_tracker.cpp Normal file
View file

@ -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));
}
}

33
base/object_tracker.hpp Normal file
View file

@ -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();
};
}