summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h b/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h
new file mode 100644
index 00000000000..da60c80fa33
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/AllocTracker.h
@@ -0,0 +1,81 @@
+// $Id$
+#ifndef ALLOC_TRACKER_H
+#define ALLOC_TRACKER_H
+#include /**/"ace/pre.h"
+
+#include "notify_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+//#define DEBUG_MEMORY_USE
+#if defined(_MSC_VER) && defined (_DEBUG) && defined (DEBUG_MEMORY_USE)
+namespace CRT{
+
+/// \brief dump heap allocation stats
+///
+/// This works only on microsoft/windows compilers
+/// but it's handy to diagnose memory allocation problems.
+/// To use, add the following macro in the scope where you
+/// want to check memory usage.
+/// ACE_WIN32_HEAP_MONITOR(name);
+/// where name is a quoted string to label the stats.
+/// When the object created by this macro goes out of scope
+/// it will write a log message like:
+/// (10056|6396) name: New heap blocks: 39; bytes: 19550
+///
+/// For non-debug, or non-vc builds, the macro expands to nothing
+class CrtHeapDumper
+{
+public:
+ CrtHeapDumper(const char * name, bool verbose = false)
+ : name_ (name)
+ , verbose_ (verbose)
+ {
+ _CrtMemCheckpoint (&before_);
+ }
+
+ ~CrtHeapDumper()
+ {
+ dump();
+ }
+ void dump()
+ {
+ _CrtMemState after;
+ _CrtMemCheckpoint (&after);
+ _CrtMemState diff;
+ _CrtMemDifference (&diff, &before_, &after);
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) %s: New heap blocks: %d; bytes: %d\n"),
+ name_.c_str (),
+ static_cast<int> (diff.lCounts[_NORMAL_BLOCK]),
+ static_cast<int> (diff.lSizes[_NORMAL_BLOCK])
+ ));
+ if (this->verbose_)
+ {
+ _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
+ _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
+ _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
+ _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
+ _CrtMemDumpAllObjectsSince (&this->before_);
+ }
+ }
+
+private:
+ ACE_CString name_;
+ bool verbose_;
+ _CrtMemState before_;
+};
+} //namespace
+#define ACE_WIN32_HEAP_MONITOR(name) \
+ CrtHeapDumper heap_check___(name); \
+ ACE_UNUSED_ARG (heap_check___)
+#else // _MSC_VER etc
+ #define ACE_WIN32_HEAP_MONITOR(name)
+#endif // _MSC_VER etc
+#include /**/"ace/post.h"
+#endif // ALLOC_TRACKER_H