From f4910b9d920640e08234ddce3dbbc8ab92e1b809 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Thu, 3 Mar 2016 13:08:31 +0100
Subject: [PATCH] fixed memory frame memory propagation, introduced
 in_frame_high_watermark to memory frame, renamed some frame fields, fixed
 some text output issues

---
 .../src/measurements/MeasurementEngine.cpp    |  6 +++-
 .../measurements/MeasurementXmlFactory.cpp    | 36 +++++++++++--------
 .../measurements/MeasurementXmlFactory.hpp    |  5 +--
 .../measurements/frames/CounterDataFrame.cpp  | 17 ++++-----
 .../measurements/frames/CounterDataFrame.hpp  |  2 +-
 .../measurements/frames/MemoryDataFrame.cpp   | 36 +++++++++++++------
 .../measurements/frames/MemoryDataFrame.hpp   |  2 ++
 .../src/measurements/frames/TimeDataFrame.cpp |  6 ++--
 .../src/measurements/frames/TimeDataFrame.hpp |  2 +-
 .../measurements/MeasurementsTest.cpp         |  7 ++++
 10 files changed, 78 insertions(+), 41 deletions(-)

diff --git a/alib2common/src/measurements/MeasurementEngine.cpp b/alib2common/src/measurements/MeasurementEngine.cpp
index 0615258d58..19fac66b96 100644
--- a/alib2common/src/measurements/MeasurementEngine.cpp
+++ b/alib2common/src/measurements/MeasurementEngine.cpp
@@ -54,6 +54,10 @@ void MeasurementEngine::reset_measurements ( ) {
 
 	frames.emplace_back ( "Root", measurements::Type::ROOT, 0 );
 	frame_idx_stack.push_back ( 0 );
+
+	TimeDataFrame::init ( 0, frames );
+	MemoryDataFrame::init ( 0, frames );
+	CounterDataFrame::init ( 0, frames );
 }
 
 MeasurementResults MeasurementEngine::get_results ( ) const {
@@ -62,7 +66,7 @@ MeasurementResults MeasurementEngine::get_results ( ) const {
 
 template < typename Hint >
 void MeasurementEngine::hint ( Hint hint ) {
-	if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
+	if ( ( frame_idx_stack.size ( ) == 0 ) ) return;
 
 	Hint::frame_type::hint ( frame_idx_stack.back ( ), frames, std::move ( hint ) );
 }
diff --git a/alib2common/src/measurements/MeasurementXmlFactory.cpp b/alib2common/src/measurements/MeasurementXmlFactory.cpp
index 06bb32b916..a8b4db4372 100644
--- a/alib2common/src/measurements/MeasurementXmlFactory.cpp
+++ b/alib2common/src/measurements/MeasurementXmlFactory.cpp
@@ -57,9 +57,9 @@ void MeasurementXmlFactory::composeTimeDataFrame ( deque < Token > & tokens, uns
 	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT );
 	tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), Token::TokenType::CHARACTER );
 	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), Token::TokenType::CHARACTER );
-	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( TIME_DATA_FRAME_IN_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.in_frame_duration.count ( ) ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( TIME_DATA_FRAME_IN_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT );
 	tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
 
@@ -76,6 +76,9 @@ void MeasurementXmlFactory::composeMemoryDataFrame ( deque < Token > & tokens, u
 	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT );
 	tokens.emplace_back ( std::to_string ( frame.high_watermark ), Token::TokenType::CHARACTER );
 	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.in_frame_high_watermark ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT );
 	tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
 
@@ -99,9 +102,9 @@ void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens,
 
 	tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
 
-	for ( const auto & elem : cdf.real_counters ) {
+	for ( const auto & elem : cdf.in_frame_counters ) {
 		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT );
 		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT );
 		tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER );
@@ -112,7 +115,7 @@ void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens,
 		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT );
 	}
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
 
 	tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
@@ -232,10 +235,10 @@ void MeasurementXmlFactory::parseTimeDataFrame ( MeasurementFrame & mf, deque <
 			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
 			mf.time.duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
 			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
-		} else if ( data == TIME_DATA_FRAME_REAL_DURATION_TAG ) {
-			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
-			mf.time.real_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
-			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
+		} else if ( data == TIME_DATA_FRAME_IN_FRAME_DURATION_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_IN_FRAME_DURATION_TAG );
+			mf.time.in_frame_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_IN_FRAME_DURATION_TAG );
 		} else {
 			break;
 		}
@@ -264,6 +267,10 @@ void MeasurementXmlFactory::parseMemoryDataFrame ( MeasurementFrame & mf, deque
 			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
 			mf.memory.high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
 			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
+		} else if ( data == MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG );
+			mf.memory.in_frame_high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG );
 		} else {
 			break;
 		}
@@ -282,8 +289,8 @@ void MeasurementXmlFactory::parseCounterDataFrame ( MeasurementFrame & mf, deque
 
 		if ( data == COUNTER_DATA_FRAME_COUNTERS_TAG )
 			parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_COUNTERS_TAG, mf.counter.counters, iter );
-		else if ( data == COUNTER_DATA_FRAME_REAL_COUNTERS_TAG )
-			parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, mf.counter.real_counters, iter );
+		else if ( data == COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG )
+			parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, mf.counter.in_frame_counters, iter );
 		else
 			break;
 	}
@@ -354,16 +361,17 @@ std::string MeasurementXmlFactory::MEASUREMENT_SUBFRAMES_TAG = "SubFrames";
 
 std::string MeasurementXmlFactory::TIME_DATA_FRAME_TAG = "TimeData";
 std::string MeasurementXmlFactory::TIME_DATA_FRAME_DURATION_TAG = "Duration";
-std::string MeasurementXmlFactory::TIME_DATA_FRAME_REAL_DURATION_TAG = "RealDuration";
+std::string MeasurementXmlFactory::TIME_DATA_FRAME_IN_FRAME_DURATION_TAG = "InFrameDuration";
 
 std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_TAG = "MemoryData";
 std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG = "StartHeapUsage";
 std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG = "EndHeapUsage";
 std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG = "HighWatermark";
+std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG = "InFrameHighWatermark";
 
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_TAG = "CounterData";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTERS_TAG = "Counters";
-std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_REAL_COUNTERS_TAG = "RealCounters";
+std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG = "InFrameCounters";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_TAG = "Counter";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG	= "Name";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_VALUE_TAG = "Value";
diff --git a/alib2common/src/measurements/MeasurementXmlFactory.hpp b/alib2common/src/measurements/MeasurementXmlFactory.hpp
index cd6b0a3957..aec56d8956 100644
--- a/alib2common/src/measurements/MeasurementXmlFactory.hpp
+++ b/alib2common/src/measurements/MeasurementXmlFactory.hpp
@@ -24,18 +24,19 @@ class MeasurementXmlFactory {
 	 // TimeDataFrame
 	static std::string TIME_DATA_FRAME_TAG;
 	static std::string TIME_DATA_FRAME_DURATION_TAG;
-	static std::string TIME_DATA_FRAME_REAL_DURATION_TAG;
+	static std::string TIME_DATA_FRAME_IN_FRAME_DURATION_TAG;
 
 	 // MemoryDataFrame
 	static std::string MEMORY_DATA_FRAME_TAG;
 	static std::string MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG;
 	static std::string MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG;
 	static std::string MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG;
+	static std::string MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG;
 
 	 // CounterDataFrame
 	static std::string COUNTER_DATA_FRAME_TAG;
 	static std::string COUNTER_DATA_FRAME_COUNTERS_TAG;
-	static std::string COUNTER_DATA_FRAME_REAL_COUNTERS_TAG;
+	static std::string COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG;
 	static std::string COUNTER_DATA_FRAME_COUNTER_TAG;
 	static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG;
 	static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG;
diff --git a/alib2common/src/measurements/frames/CounterDataFrame.cpp b/alib2common/src/measurements/frames/CounterDataFrame.cpp
index 6cd25725fc..4541f95b22 100644
--- a/alib2common/src/measurements/frames/CounterDataFrame.cpp
+++ b/alib2common/src/measurements/frames/CounterDataFrame.cpp
@@ -18,6 +18,7 @@ void CounterDataFrame::update ( unsigned, measurements::stealth_vector < Measure
 }
 
 void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) {
+	if ( frames[frame_idx].type == measurements::Type::ROOT ) return;
 
 	CounterHint::value_type delta = 0;
 
@@ -31,7 +32,7 @@ void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 		break;
 	}
 
-	frames[frame_idx].counter.real_counters[hint.name] += delta;
+	frames[frame_idx].counter.in_frame_counters[hint.name] += delta;
 
 	unsigned cur_idx = frame_idx;
 
@@ -48,20 +49,20 @@ void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 
 std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) {
 
-	os << "(";
+	os << "cnts: (";
 
 	for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) {
-		os << it->first << " : " << it->second;
+		if ( it != cdf.counters.begin ( ) ) os << ", ";
 
-		if ( it != cdf.counters.end ( ) ) os << ", ";
+		os << it->first << " : " << it->second;
 	}
 
-	os << "), (";
+	os << "), if_cnts: (";
 
-	for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) {
-		os << it->first << " : " << it->second;
+	for ( auto it = cdf.in_frame_counters.begin ( ); it != cdf.in_frame_counters.end ( ); ++it ) {
+		if ( it != cdf.in_frame_counters.begin ( ) ) os << ", ";
 
-		if ( it != cdf.real_counters.end ( ) ) os << ", ";
+		os << it->first << " : " << it->second;
 	}
 
 	os << ")";
diff --git a/alib2common/src/measurements/frames/CounterDataFrame.hpp b/alib2common/src/measurements/frames/CounterDataFrame.hpp
index 1cd140533a..287930a299 100644
--- a/alib2common/src/measurements/frames/CounterDataFrame.hpp
+++ b/alib2common/src/measurements/frames/CounterDataFrame.hpp
@@ -28,7 +28,7 @@ struct CounterHint {
 
 struct CounterDataFrame {
 	measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > counters;
-	measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > real_counters;
+	measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > in_frame_counters;
 
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
diff --git a/alib2common/src/measurements/frames/MemoryDataFrame.cpp b/alib2common/src/measurements/frames/MemoryDataFrame.cpp
index 4e3f6635be..dd1bd8cb10 100644
--- a/alib2common/src/measurements/frames/MemoryDataFrame.cpp
+++ b/alib2common/src/measurements/frames/MemoryDataFrame.cpp
@@ -10,11 +10,20 @@ void MemoryDataFrame::init ( unsigned frame_idx, measurements::stealth_vector <
 	MeasurementFrame & current_frame = frames[frame_idx];
 	MeasurementFrame & parent_frame	 = frames[current_frame.parent_idx];
 
-	if ( parent_frame.type != measurements::Type::ROOT ) {
-		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;
+	 // "hacky" adjustment, if this is the first user inserted frame, we reset ROOTs values to 0
+	 // beacause we want the heap usage to start at 0 and also we want to be able to propagate ROOTs values between separate
+	 // user OVERALL frames
+	if ( ( parent_frame.type == measurements::Type::ROOT ) && ( frames.size ( ) == 2 ) ) {
+		parent_frame.memory.start_heap_usage = 0;
+		parent_frame.memory.current_heap_usage = 0;
+		parent_frame.memory.high_watermark = 0;
+		parent_frame.memory.in_frame_high_watermark = 0;
 	}
+
+	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;
+	current_frame.memory.in_frame_high_watermark = parent_frame.memory.current_heap_usage;
 }
 
 void MemoryDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) {
@@ -24,11 +33,16 @@ void MemoryDataFrame::update ( unsigned frame_idx, measurements::stealth_vector
 	current_frame.memory.end_heap_usage = current_frame.memory.current_heap_usage;
 
 	 // if we end up with more memory from children, adjust watermark
-	if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
-		current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
+	if ( current_frame.memory.current_heap_usage > current_frame.memory.in_frame_high_watermark )
+		current_frame.memory.in_frame_high_watermark = current_frame.memory.current_heap_usage;
+
+	if ( parent_frame.memory.high_watermark < current_frame.memory.in_frame_high_watermark )
+		parent_frame.memory.high_watermark = current_frame.memory.in_frame_high_watermark;
+
+	if ( current_frame.memory.high_watermark < current_frame.memory.in_frame_high_watermark )
+		current_frame.memory.high_watermark = current_frame.memory.in_frame_high_watermark;
 
-	if ( parent_frame.type != measurements::Type::ROOT )
-		parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
+	parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
 }
 
 void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, MemoryHint hint ) {
@@ -39,8 +53,8 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 	case MemoryHint::Type::NEW:
 		current_frame.memory.current_heap_usage += hint.size;
 
-		if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
-			current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
+		if ( current_frame.memory.current_heap_usage > current_frame.memory.in_frame_high_watermark )
+			current_frame.memory.in_frame_high_watermark = current_frame.memory.current_heap_usage;
 
 		break;
 
@@ -51,7 +65,7 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 }
 
 std::ostream & operator <<( std::ostream & os, const MemoryDataFrame & mdf ) {
-	os << mdf.start_heap_usage << "shu, " << mdf.end_heap_usage << "ehu, " << mdf.high_watermark << "hw";
+	os << mdf.start_heap_usage << "B shu, " << mdf.end_heap_usage << "B ehu, " << mdf.high_watermark << "B hw, " << mdf.in_frame_high_watermark << "B if_hw";
 	return os;
 }
 
diff --git a/alib2common/src/measurements/frames/MemoryDataFrame.hpp b/alib2common/src/measurements/frames/MemoryDataFrame.hpp
index c7c0682acf..4fdb5eec03 100644
--- a/alib2common/src/measurements/frames/MemoryDataFrame.hpp
+++ b/alib2common/src/measurements/frames/MemoryDataFrame.hpp
@@ -30,7 +30,9 @@ struct MemoryDataFrame {
 
 	value_type start_heap_usage;
 	value_type end_heap_usage;
+
 	value_type high_watermark;
+	value_type in_frame_high_watermark;
 
 	value_type current_heap_usage;
 
diff --git a/alib2common/src/measurements/frames/TimeDataFrame.cpp b/alib2common/src/measurements/frames/TimeDataFrame.cpp
index 11a194db82..c641a5f2a1 100644
--- a/alib2common/src/measurements/frames/TimeDataFrame.cpp
+++ b/alib2common/src/measurements/frames/TimeDataFrame.cpp
@@ -19,15 +19,15 @@ void TimeDataFrame::update ( unsigned frame_idx, measurements::stealth_vector <
 	MeasurementFrame & current_frame = frames[frame_idx];
 
 	current_frame.time.duration = duration_cast < microseconds > ( high_resolution_clock::now ( ) - current_frame.time.start );
-	current_frame.time.real_duration += current_frame.time.duration;
+	current_frame.time.in_frame_duration += current_frame.time.duration;
 
 	MeasurementFrame & parent_frame = frames[current_frame.parent_idx];
 
-	parent_frame.time.real_duration -= current_frame.time.duration;
+	parent_frame.time.in_frame_duration -= current_frame.time.duration;
 }
 
 std::ostream & operator <<( std::ostream & os, const TimeDataFrame & tdf ) {
-	os << tdf.duration << ", " << tdf.real_duration;
+	os << tdf.duration << " dur, " << tdf.in_frame_duration << " if_dur";
 	return os;
 }
 
diff --git a/alib2common/src/measurements/frames/TimeDataFrame.hpp b/alib2common/src/measurements/frames/TimeDataFrame.hpp
index 88282e8f4b..efb0664ab3 100644
--- a/alib2common/src/measurements/frames/TimeDataFrame.hpp
+++ b/alib2common/src/measurements/frames/TimeDataFrame.hpp
@@ -20,7 +20,7 @@ struct TimeDataFrame {
 	std::chrono::time_point < std::chrono::high_resolution_clock > start;
 
 	value_type duration;
-	value_type real_duration;
+	value_type in_frame_duration;
 
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
diff --git a/alib2common/test-src/measurements/MeasurementsTest.cpp b/alib2common/test-src/measurements/MeasurementsTest.cpp
index 3ad0114b5c..96fb460c0c 100644
--- a/alib2common/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2common/test-src/measurements/MeasurementsTest.cpp
@@ -85,6 +85,13 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
 	delete[] bar;
 	measurements::end ( );
 
+	measurements::start ( "chunk3", measurements::Type::MAIN );
+	measurements::start ( "chunk31", measurements::Type::MAIN );
+		bar = new int[1000];
+		delete[] bar;
+	measurements::end ( );
+	measurements::end ( );
+
 	std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
 	std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
 	std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
-- 
GitLab