forked from organicmaps/organicmaps
Add simple objects tracker class for leaks finding.
This commit is contained in:
parent
dd63cdd69f
commit
a83a3c97dd
3 changed files with 96 additions and 0 deletions
|
@ -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
61
base/object_tracker.cpp
Normal 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
33
base/object_tracker.hpp
Normal 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();
|
||||
};
|
||||
}
|
Loading…
Add table
Reference in a new issue