diff --git a/alib2algo/src/measurements/MeasurementFrames.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp index 65c91d98c33fd5693a5b260393e12f7b89431b84..1d02d63341e5e181e4956bd585e27de1aa256f2a 100644 --- a/alib2algo/src/measurements/MeasurementFrames.hpp +++ b/alib2algo/src/measurements/MeasurementFrames.hpp @@ -30,6 +30,7 @@ struct MemoryDataFrame { size_t current_heap_usage; std::string to_string ( ); + // void to_xml ( ); static void init ( unsigned, std::vector < MeasurementFrame > & ); @@ -44,6 +45,7 @@ struct TimeDataFrame { std::chrono::microseconds real_duration; std::string to_string ( ); + // void to_xml ( ); static void init ( unsigned, std::vector < MeasurementFrame > & ); diff --git a/alib2algo/src/measurements/MeasurementNew.cpp b/alib2algo/src/measurements/MeasurementNew.cpp index c1c24dbf352ef8179b19c24e7df16b4e03354d73..4be528a7e721a272a6693127086587a5b69093b3 100644 --- a/alib2algo/src/measurements/MeasurementNew.cpp +++ b/alib2algo/src/measurements/MeasurementNew.cpp @@ -4,9 +4,10 @@ #include <cstdlib> #include <new> +#include "MeasurementNew.hpp" #include "measurements.hpp" -void * operator new( std::size_t n ) { +void * operator new( std::size_t n, bool measure ) { void * ptr = nullptr; for ( ; ; ) { @@ -19,8 +20,9 @@ void * operator new( std::size_t n ) { * sptr = n; sptr++; - // send it to the engine - measurements::memory_hint ( { measurements::MemoryHint::Type::NEW, n } ); + // send it to the engine if it does not come from stealth allocation + if ( measure ) + measurements::memory_hint ( { measurements::MemoryHint::Type::NEW, n } ); return static_cast < void * > ( sptr ); } @@ -35,14 +37,22 @@ void * operator new( std::size_t n ) { } } -void operator delete( void * ptr ) noexcept { +void * operator new( std::size_t n ) { + return operator new( n, true ); +} +void operator delete( void * ptr, bool measure ) 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 } ); + // read the block size and send it to the engine if it does not come from stealth allocation + if ( measure ) + measurements::memory_hint ( { measurements::MemoryHint::Type::DELETE, * sptr } ); std::free ( sptr ); } + +void operator delete( void * ptr ) noexcept { + operator delete( ptr, false ); +} diff --git a/alib2algo/src/measurements/MeasurementNew.hpp b/alib2algo/src/measurements/MeasurementNew.hpp new file mode 100644 index 0000000000000000000000000000000000000000..d8f1b18e416e5825eeeb4bf38848e967534295b8 --- /dev/null +++ b/alib2algo/src/measurements/MeasurementNew.hpp @@ -0,0 +1,16 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef MEASUREMENT_NEW_HPP_ +#define MEASUREMENT_NEW_HPP_ + +void * operator new( std::size_t n, bool measure ); + +void * operator new( std::size_t n ); + +void operator delete( void * ptr, bool measure ) noexcept; + +void operator delete( void * ptr ) noexcept; + +#endif /* MEASUREMENT_NEW_HPP_ */ diff --git a/alib2algo/src/measurements/MeasurementTypes.hpp b/alib2algo/src/measurements/MeasurementTypes.hpp index d47a1d64bc822209aa14171d015f7822be3665a0..d5f2cfecd873174612aadd6c107c36dc4e8a1969 100644 --- a/alib2algo/src/measurements/MeasurementTypes.hpp +++ b/alib2algo/src/measurements/MeasurementTypes.hpp @@ -6,6 +6,7 @@ #define MEASUREMENT_TYPES_HPP_ #include <memory> +#include "MeasurementNew.hpp" namespace measurements { @@ -18,6 +19,24 @@ std::unique_ptr < T > make_unique ( Args && ... args ) { return std::unique_ptr < T > ( new T ( std::forward < Args > ( args ) ... ) ); } +template < typename T > +class stealth_allocator : public std::allocator < T > { +public: + using pointer = T *; + using size_type = size_t; + + pointer allocate ( size_type n ) { + return static_cast < pointer > ( operator new( n * sizeof ( T ), false ) ); + } + + void deallocate ( pointer ptr, size_type ) { + operator delete( ptr, false ); + } + + template < typename U > + struct rebind { using other = stealth_allocator < U >; }; +}; + } #endif /* MEASUREMENT_TYPES_HPP_ */ diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp index 73563315805a06643e570de8028df68f796633c1..da2d054a0a8a74578fe6604eaabe306b83957b05 100644 --- a/alib2algo/src/measurements/MemoryDataFrame.cpp +++ b/alib2algo/src/measurements/MemoryDataFrame.cpp @@ -4,8 +4,6 @@ #include "MeasurementFrames.hpp" -#include <iostream> - using namespace std::chrono; namespace measurements {