Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2012-09-07 19:17:44 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:43:11 +0300
commita83a3c97ddaf5cac08d4c999f067b670f4303cdd (patch)
treef186951858edd0fb7a7e8afe17fc1861b6f12122 /base
parentdd63cdd69f687b6e5e5557cbaf3a7d5036bdb820 (diff)
Add simple objects tracker class for leaks finding.
Diffstat (limited to 'base')
-rw-r--r--base/base.pro2
-rw-r--r--base/object_tracker.cpp61
-rw-r--r--base/object_tracker.hpp33
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();
+ };
+}