diff --git a/alib2measure/src/measurements/CounterDataFrame.cpp b/alib2measure/src/measurements/CounterDataFrame.cpp index 4a07c9f85ac5309190ffb9de63831731cd9bb47e..bc58f63a3a5f890608ed6576acedf282bdceb6bc 100644 --- a/alib2measure/src/measurements/CounterDataFrame.cpp +++ b/alib2measure/src/measurements/CounterDataFrame.cpp @@ -14,9 +14,7 @@ void CounterDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < current_frame.counter.counters = parent_frame.counter.counters; } -void CounterDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) { - MeasurementFrame & current_frame = frames[frame_idx]; - MeasurementFrame & parent_frame = frames[current_frame.parent_idx]; +void CounterDataFrame::update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ) { } void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) { @@ -62,7 +60,8 @@ void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned tokens.emplace_back ( "CounterData", sax::Token::TokenType::START_ELEMENT ); tokens.emplace_back ( "Counters", sax::Token::TokenType::START_ELEMENT ); - for ( const auto & elem : cdf.counters) { + + for ( const auto & elem : cdf.counters ) { tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT ); tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT ); tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); @@ -72,10 +71,12 @@ void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT ); tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT ); } + tokens.emplace_back ( "Counters", sax::Token::TokenType::END_ELEMENT ); tokens.emplace_back ( "RealCounters", sax::Token::TokenType::START_ELEMENT ); - for ( const auto & elem : cdf.real_counters) { + + for ( const auto & elem : cdf.real_counters ) { tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT ); tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT ); tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); @@ -85,6 +86,7 @@ void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT ); tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT ); } + tokens.emplace_back ( "RealCounters", sax::Token::TokenType::END_ELEMENT ); tokens.emplace_back ( "CounterData", sax::Token::TokenType::END_ELEMENT ); @@ -93,17 +95,21 @@ void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) { os << "("; + for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) { os << it->first << " : " << it->second; if ( it != cdf.counters.end ( ) ) os << ", "; } + os << "), ("; + for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) { os << it->first << " : " << it->second; if ( it != cdf.real_counters.end ( ) ) os << ", "; } + os << ")"; return os; diff --git a/alib2measure/src/measurements/MeasurementEngine.cpp b/alib2measure/src/measurements/MeasurementEngine.cpp index c340917d551bd64e6a193a6f07aa47e2119d9373..b25fe87903a624cf9c8eb4c6e4c182e7d3d7e20e 100644 --- a/alib2measure/src/measurements/MeasurementEngine.cpp +++ b/alib2measure/src/measurements/MeasurementEngine.cpp @@ -7,11 +7,18 @@ namespace measurements { MeasurementEngine MeasurementEngine::INSTANCE; +bool MeasurementEngine::NOT_DESTROYED; MeasurementEngine::MeasurementEngine ( ) { + MeasurementEngine::NOT_DESTROYED = true; + reset_measurements ( ); } +MeasurementEngine::~MeasurementEngine ( ) { + MeasurementEngine::NOT_DESTROYED = false; +} + void MeasurementEngine::push_measurement_frame ( measurements::stealth_string frame_name, measurements::Type frame_type ) { unsigned parent_idx = frame_idx_stack.back ( ); @@ -31,6 +38,9 @@ void MeasurementEngine::push_measurement_frame ( measurements::stealth_string fr void MeasurementEngine::pop_measurement_frame ( ) { unsigned current_idx = frame_idx_stack.back ( ); + if ( frames[current_idx].type == measurements::Type::ROOT ) + throw std::logic_error ( "no measurement started" ); + frame_idx_stack.pop_back ( ); TimeDataFrame::update ( current_idx, frames ); diff --git a/alib2measure/src/measurements/MeasurementEngine.hpp b/alib2measure/src/measurements/MeasurementEngine.hpp index b56641db678eec8dd28141829bed4a567ae4e132..f7211a8dd2a24128b24a9b8af2600d23845492ac 100644 --- a/alib2measure/src/measurements/MeasurementEngine.hpp +++ b/alib2measure/src/measurements/MeasurementEngine.hpp @@ -26,7 +26,10 @@ public: template < typename Hint > void hint ( Hint ); + ~MeasurementEngine ( ); + static MeasurementEngine INSTANCE; + static bool NOT_DESTROYED; }; } diff --git a/alib2measure/src/measurements/MeasurementNew.cpp b/alib2measure/src/measurements/MeasurementNew.cpp index 8207ddd7b19d6a4278c03661637ab898174b3e22..5872d205b939afcb1363ee6a2a386197b8f2d052 100644 --- a/alib2measure/src/measurements/MeasurementNew.cpp +++ b/alib2measure/src/measurements/MeasurementNew.cpp @@ -38,6 +38,8 @@ void * operator new( std::size_t n, bool measure ) { } void operator delete( void * ptr, bool measure ) noexcept { + if ( ptr == nullptr ) return; + std::size_t * sptr = static_cast < std::size_t * > ( ptr ); sptr--; diff --git a/alib2measure/src/measurements/MeasurementResults.cpp b/alib2measure/src/measurements/MeasurementResults.cpp index dfd5c3ea0b1b7edf44988db366e690b78e28eb20..9193ed7a92e4e31def11908c0b0e794c786d4d36 100644 --- a/alib2measure/src/measurements/MeasurementResults.cpp +++ b/alib2measure/src/measurements/MeasurementResults.cpp @@ -5,6 +5,9 @@ namespace measurements { +MeasurementResults::MeasurementResults ( ) { +} + MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) { } diff --git a/alib2measure/src/measurements/MeasurementResults.hpp b/alib2measure/src/measurements/MeasurementResults.hpp index 56b665342613b017e9f15ce331f277793761f9a0..2b8517fb475eef85860d2338706e0c17a2d8e0fc 100644 --- a/alib2measure/src/measurements/MeasurementResults.hpp +++ b/alib2measure/src/measurements/MeasurementResults.hpp @@ -23,6 +23,7 @@ struct MeasurementXalloc { struct MeasurementResults { measurements::stealth_vector < MeasurementFrame > frames; + MeasurementResults ( ); MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & ); void print_as_list ( std::ostream & ) const; diff --git a/alib2measure/src/measurements/measurements.cpp b/alib2measure/src/measurements/measurements.cpp index 51f72f96d370db8e98715c935d23678ce8be6fde..9dc09222f0fce5f8c4c49b2c82bb6497d49a633f 100644 --- a/alib2measure/src/measurements/measurements.cpp +++ b/alib2measure/src/measurements/measurements.cpp @@ -7,34 +7,43 @@ namespace measurements { void start ( measurements::stealth_string name, measurements::Type type ) { - MeasurementEngine::INSTANCE.push_measurement_frame ( std::move ( name ), type ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.push_measurement_frame ( std::move ( name ), type ); } void end ( ) { - MeasurementEngine::INSTANCE.pop_measurement_frame ( ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.pop_measurement_frame ( ); } void reset ( ) { - MeasurementEngine::INSTANCE.reset_measurements ( ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.reset_measurements ( ); } MeasurementResults results ( ) { - return MeasurementEngine::INSTANCE.get_results ( ); + if ( MeasurementEngine::NOT_DESTROYED ) + return MeasurementEngine::INSTANCE.get_results ( ); + else + return MeasurementResults ( ); } template < typename Hint > void hint ( Hint hint ) { - MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); } template < > void hint ( MemoryHint hint ) { - MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); } template < > void hint ( CounterHint hint ) { - MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); + if ( MeasurementEngine::NOT_DESTROYED ) + MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); } } diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp index 56d4a5a5a2479b7df003b13f34640aca51a7d46b..c043485c55ed26e129d9aa87ca8d6b84dace75ac 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.cpp +++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp @@ -14,6 +14,10 @@ void MeasurementsTest::setUp ( ) { void MeasurementsTest::tearDown ( ) { } +void MeasurementsTest::testConstructMeasurements ( ) { + +} + void MeasurementsTest::testTimeMeasurements ( ) { measurements::start ( "global", measurements::Type::OVERALL ); measurements::start ( "init", measurements::Type::INIT ); diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h index 1e53cd854e6f8509cfcd48bca709c39fa29d7896..4afc116c1689422a280a04129b4764f7b3eae93b 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.h +++ b/alib2measure/test-src/measurements/MeasurementsTest.h @@ -5,6 +5,7 @@ class MeasurementsTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE ( MeasurementsTest ); + CPPUNIT_TEST ( testConstructMeasurements ); CPPUNIT_TEST ( testTimeMeasurements ); CPPUNIT_TEST ( testMemoryMeasurements ); CPPUNIT_TEST ( testCounterMeasurements ); @@ -14,6 +15,7 @@ public: void setUp ( ); void tearDown ( ); + void testConstructMeasurements ( ); void testTimeMeasurements ( ); void testMemoryMeasurements ( ); void testCounterMeasurements ( );