Skip to content
Snippets Groups Projects
Commit 4b422073 authored by Radovan Červený's avatar Radovan Červený
Browse files

fixed sneaky segfault, added safeguards to prevent segfaults

parent 205fea1f
No related branches found
No related tags found
1 merge request!14BP_cervera3 - new measurements
...@@ -14,9 +14,7 @@ void CounterDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < ...@@ -14,9 +14,7 @@ void CounterDataFrame::init ( unsigned frame_idx, measurements::stealth_vector <
current_frame.counter.counters = parent_frame.counter.counters; current_frame.counter.counters = parent_frame.counter.counters;
} }
   
void CounterDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) { void CounterDataFrame::update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ) {
MeasurementFrame & current_frame = frames[frame_idx];
MeasurementFrame & parent_frame = frames[current_frame.parent_idx];
} }
   
void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) { 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 ...@@ -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 ( "CounterData", sax::Token::TokenType::START_ELEMENT );
   
tokens.emplace_back ( "Counters", 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 ( "Counter", sax::Token::TokenType::START_ELEMENT );
tokens.emplace_back ( "Name", 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 ); 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 ...@@ -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 ( "Value", sax::Token::TokenType::END_ELEMENT );
tokens.emplace_back ( "Counter", 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 ( "Counters", sax::Token::TokenType::END_ELEMENT );
   
tokens.emplace_back ( "RealCounters", sax::Token::TokenType::START_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 ( "Counter", sax::Token::TokenType::START_ELEMENT );
tokens.emplace_back ( "Name", 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 ); 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 ...@@ -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 ( "Value", sax::Token::TokenType::END_ELEMENT );
tokens.emplace_back ( "Counter", 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 ( "RealCounters", sax::Token::TokenType::END_ELEMENT );
   
tokens.emplace_back ( "CounterData", 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 ...@@ -93,17 +95,21 @@ void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned
std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) { std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) {
   
os << "("; os << "(";
for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) { for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) {
os << it->first << " : " << it->second; os << it->first << " : " << it->second;
   
if ( it != cdf.counters.end ( ) ) os << ", "; if ( it != cdf.counters.end ( ) ) os << ", ";
} }
os << "), ("; os << "), (";
for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) { for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) {
os << it->first << " : " << it->second; os << it->first << " : " << it->second;
   
if ( it != cdf.real_counters.end ( ) ) os << ", "; if ( it != cdf.real_counters.end ( ) ) os << ", ";
} }
os << ")"; os << ")";
   
return os; return os;
......
...@@ -7,11 +7,18 @@ ...@@ -7,11 +7,18 @@
namespace measurements { namespace measurements {
   
MeasurementEngine MeasurementEngine::INSTANCE; MeasurementEngine MeasurementEngine::INSTANCE;
bool MeasurementEngine::NOT_DESTROYED;
   
MeasurementEngine::MeasurementEngine ( ) { MeasurementEngine::MeasurementEngine ( ) {
MeasurementEngine::NOT_DESTROYED = true;
reset_measurements ( ); reset_measurements ( );
} }
   
MeasurementEngine::~MeasurementEngine ( ) {
MeasurementEngine::NOT_DESTROYED = false;
}
void MeasurementEngine::push_measurement_frame ( measurements::stealth_string frame_name, measurements::Type frame_type ) { void MeasurementEngine::push_measurement_frame ( measurements::stealth_string frame_name, measurements::Type frame_type ) {
unsigned parent_idx = frame_idx_stack.back ( ); unsigned parent_idx = frame_idx_stack.back ( );
   
...@@ -31,6 +38,9 @@ void MeasurementEngine::push_measurement_frame ( measurements::stealth_string fr ...@@ -31,6 +38,9 @@ void MeasurementEngine::push_measurement_frame ( measurements::stealth_string fr
void MeasurementEngine::pop_measurement_frame ( ) { void MeasurementEngine::pop_measurement_frame ( ) {
unsigned current_idx = frame_idx_stack.back ( ); 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 ( ); frame_idx_stack.pop_back ( );
   
TimeDataFrame::update ( current_idx, frames ); TimeDataFrame::update ( current_idx, frames );
......
...@@ -26,7 +26,10 @@ public: ...@@ -26,7 +26,10 @@ public:
template < typename Hint > template < typename Hint >
void hint ( Hint ); void hint ( Hint );
   
~MeasurementEngine ( );
static MeasurementEngine INSTANCE; static MeasurementEngine INSTANCE;
static bool NOT_DESTROYED;
}; };
   
} }
......
...@@ -38,6 +38,8 @@ void * operator new( std::size_t n, bool measure ) { ...@@ -38,6 +38,8 @@ void * operator new( std::size_t n, bool measure ) {
} }
   
void operator delete( void * ptr, bool measure ) noexcept { void operator delete( void * ptr, bool measure ) noexcept {
if ( ptr == nullptr ) return;
std::size_t * sptr = static_cast < std::size_t * > ( ptr ); std::size_t * sptr = static_cast < std::size_t * > ( ptr );
   
sptr--; sptr--;
......
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
   
namespace measurements { namespace measurements {
   
MeasurementResults::MeasurementResults ( ) {
}
MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) { MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) {
} }
   
......
...@@ -23,6 +23,7 @@ struct MeasurementXalloc { ...@@ -23,6 +23,7 @@ struct MeasurementXalloc {
struct MeasurementResults { struct MeasurementResults {
measurements::stealth_vector < MeasurementFrame > frames; measurements::stealth_vector < MeasurementFrame > frames;
   
MeasurementResults ( );
MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & ); MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & );
   
void print_as_list ( std::ostream & ) const; void print_as_list ( std::ostream & ) const;
......
...@@ -7,34 +7,43 @@ ...@@ -7,34 +7,43 @@
namespace measurements { namespace measurements {
   
void start ( measurements::stealth_string name, measurements::Type type ) { 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 ( ) { void end ( ) {
MeasurementEngine::INSTANCE.pop_measurement_frame ( ); if ( MeasurementEngine::NOT_DESTROYED )
MeasurementEngine::INSTANCE.pop_measurement_frame ( );
} }
   
void reset ( ) { void reset ( ) {
MeasurementEngine::INSTANCE.reset_measurements ( ); if ( MeasurementEngine::NOT_DESTROYED )
MeasurementEngine::INSTANCE.reset_measurements ( );
} }
   
MeasurementResults results ( ) { MeasurementResults results ( ) {
return MeasurementEngine::INSTANCE.get_results ( ); if ( MeasurementEngine::NOT_DESTROYED )
return MeasurementEngine::INSTANCE.get_results ( );
else
return MeasurementResults ( );
} }
   
template < typename Hint > template < typename Hint >
void hint ( Hint hint ) { void hint ( Hint hint ) {
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); if ( MeasurementEngine::NOT_DESTROYED )
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) );
} }
   
template < > template < >
void hint ( MemoryHint hint ) { void hint ( MemoryHint hint ) {
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); if ( MeasurementEngine::NOT_DESTROYED )
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) );
} }
   
template < > template < >
void hint ( CounterHint hint ) { void hint ( CounterHint hint ) {
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); if ( MeasurementEngine::NOT_DESTROYED )
MeasurementEngine::INSTANCE.hint ( std::move ( hint ) );
} }
   
} }
...@@ -14,6 +14,10 @@ void MeasurementsTest::setUp ( ) { ...@@ -14,6 +14,10 @@ void MeasurementsTest::setUp ( ) {
void MeasurementsTest::tearDown ( ) { void MeasurementsTest::tearDown ( ) {
} }
   
void MeasurementsTest::testConstructMeasurements ( ) {
}
void MeasurementsTest::testTimeMeasurements ( ) { void MeasurementsTest::testTimeMeasurements ( ) {
measurements::start ( "global", measurements::Type::OVERALL ); measurements::start ( "global", measurements::Type::OVERALL );
measurements::start ( "init", measurements::Type::INIT ); measurements::start ( "init", measurements::Type::INIT );
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
   
class MeasurementsTest : public CppUnit::TestFixture { class MeasurementsTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE ( MeasurementsTest ); CPPUNIT_TEST_SUITE ( MeasurementsTest );
CPPUNIT_TEST ( testConstructMeasurements );
CPPUNIT_TEST ( testTimeMeasurements ); CPPUNIT_TEST ( testTimeMeasurements );
CPPUNIT_TEST ( testMemoryMeasurements ); CPPUNIT_TEST ( testMemoryMeasurements );
CPPUNIT_TEST ( testCounterMeasurements ); CPPUNIT_TEST ( testCounterMeasurements );
...@@ -14,6 +15,7 @@ public: ...@@ -14,6 +15,7 @@ public:
void setUp ( ); void setUp ( );
void tearDown ( ); void tearDown ( );
   
void testConstructMeasurements ( );
void testTimeMeasurements ( ); void testTimeMeasurements ( );
void testMemoryMeasurements ( ); void testMemoryMeasurements ( );
void testCounterMeasurements ( ); void testCounterMeasurements ( );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment