From b21a37791ceb7e54154435eb8a95181831fffbd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Mon, 1 Feb 2016 21:18:39 +0100
Subject: [PATCH] custom operator new now stores extra info about size,
 functiong memory measurement

---
 .../src/measurements/MeasurementEngine.cpp    |  3 +-
 alib2algo/src/measurements/MeasurementNew.cpp | 28 ++++++++++++++++---
 .../src/measurements/MemoryDataFrame.cpp      | 10 +++++--
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp
index 9b9dd2f53a..c805f77983 100644
--- a/alib2algo/src/measurements/MeasurementEngine.cpp
+++ b/alib2algo/src/measurements/MeasurementEngine.cpp
@@ -2,7 +2,6 @@
  * Author: Radovan Cerveny
  */
 
-#include <iostream>
 #include "MeasurementEngine.hpp"
 
 namespace measurements {
@@ -38,6 +37,8 @@ void MeasurementEngine::pop_measurement_frame ( ) {
 }
 
 void MeasurementEngine::memory_hint ( MemoryHint mh ) {
+	if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
+
 	MemoryDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( mh ) );
 }
 
diff --git a/alib2algo/src/measurements/MeasurementNew.cpp b/alib2algo/src/measurements/MeasurementNew.cpp
index dc0ca509cb..c1c24dbf35 100644
--- a/alib2algo/src/measurements/MeasurementNew.cpp
+++ b/alib2algo/src/measurements/MeasurementNew.cpp
@@ -4,14 +4,26 @@
 
 #include <cstdlib>
 #include <new>
+#include "measurements.hpp"
 
 void * operator new( std::size_t n ) {
 	void * ptr = nullptr;
 
 	for ( ; ; ) {
-		ptr = std::malloc ( n );
+		 // allocate little more for extra info
+		ptr = std::malloc ( n + sizeof ( std::size_t ) );
 
-		if ( ptr != nullptr ) return ptr;
+		if ( ptr != nullptr ) {
+			 // store requested size before the block
+			std::size_t * sptr = static_cast < std::size_t * > ( ptr );
+			* sptr = n;
+			sptr++;
+
+			 // send it to the engine
+			measurements::memory_hint ( { measurements::MemoryHint::Type::NEW, n } );
+
+			return static_cast < void * > ( sptr );
+		}
 
 		auto cur_handler = std::set_new_handler ( 0 );
 		std::set_new_handler ( cur_handler );
@@ -23,6 +35,14 @@ void * operator new( std::size_t n ) {
 	}
 }
 
-void operator delete( void * p ) noexcept {
-	std::free ( p );
+void operator delete( void * ptr ) noexcept {
+
+	std::size_t * sptr = static_cast < std::size_t * > ( ptr );
+
+	sptr--;
+
+	 // read the block size and send it to the engine
+	measurements::memory_hint ( { measurements::MemoryHint::Type::DELETE, * sptr } );
+
+	std::free ( sptr );
 }
diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp
index dab0cf0404..d45f20f861 100644
--- a/alib2algo/src/measurements/MemoryDataFrame.cpp
+++ b/alib2algo/src/measurements/MemoryDataFrame.cpp
@@ -12,17 +12,21 @@ void MemoryDataFrame::init ( unsigned frame_idx, std::vector < MeasurementFrame
 	MeasurementFrame & current_frame = frames[frame_idx];
 	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
 
-	current_frame.memory.start_heap_usage = current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
+	current_frame.memory.start_heap_usage = parent_frame.memory.current_heap_usage;
+	current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
+	current_frame.memory.high_watermark = parent_frame.memory.current_heap_usage;
 }
 
 void MemoryDataFrame::update ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) {
 	MeasurementFrame & current_frame = frames[frame_idx];
 	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
 
-	parent_frame.memory.current_heap_usage = current_frame.memory.end_heap_usage = current_frame.memory.current_heap_usage;
+	parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
+	current_frame.memory.end_heap_usage = current_frame.memory.current_heap_usage;
 }
 
 void MemoryDataFrame::hint ( unsigned frame_idx, std::vector < MeasurementFrame > & frames, MemoryHint hint ) {
+
 	MeasurementFrame & current_frame = frames[frame_idx];
 
 	switch ( hint.type ) {
@@ -40,7 +44,7 @@ void MemoryDataFrame::hint ( unsigned frame_idx, std::vector < MeasurementFrame
 std::string MemoryDataFrame::to_string ( ) {
 	std::stringstream ss;
 
-	ss << start_heap_usage << ", " << end_heap_usage << ", " << high_watermark;
+	ss << start_heap_usage << "shu, " << end_heap_usage << "ehu, " << high_watermark << "hw";
 	return ss.str ( );
 }
 
-- 
GitLab