diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp index 9b9dd2f53a3c3c0d8f77c9d75edf830393a39b7c..c805f779834a2c550d35354961644ad11913463e 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 dc0ca509cb66e32745d2df7e76ffc79dc4176382..c1c24dbf352ef8179b19c24e7df16b4e03354d73 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 dab0cf0404c372c79d5c974e7056858d8176c686..d45f20f861db57b6aa7ae327271c56e3252a264b 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 ( ); }