diff --git a/src/core/cpn/InjectionPoint.hpp b/src/core/cpn/InjectionPoint.hpp index f910d3fe..baf17610 100644 --- a/src/core/cpn/InjectionPoint.hpp +++ b/src/core/cpn/InjectionPoint.hpp @@ -63,6 +63,9 @@ class InjectionPointHops : public InjectionPointBase { private: SmartHops *m_sa; // !< Hop calculator which generates the hop chain uint32_t m_curr_inst; // !< Instruction for which currently a hop chain is available + bool m_initialized; + + void init(); public: InjectionPointHops(); virtual ~InjectionPointHops(); diff --git a/src/core/cpn/InjectionPointHops.cc b/src/core/cpn/InjectionPointHops.cc index 9804929d..fc1f1f6b 100644 --- a/src/core/cpn/InjectionPointHops.cc +++ b/src/core/cpn/InjectionPointHops.cc @@ -3,8 +3,19 @@ namespace fail { -InjectionPointHops::InjectionPointHops() : InjectionPointBase(), m_sa(new SmartHops()), m_curr_inst(0) { +InjectionPointHops::InjectionPointHops() : InjectionPointBase(), m_sa(NULL), m_curr_inst(0), m_initialized(false) { +} + +InjectionPointHops::~InjectionPointHops() { + if (m_initialized) + delete m_sa; +} + +void InjectionPointHops::init() +{ + m_sa = new SmartHops(); + m_curr_inst = 0; char * elfpath = getenv("FAIL_TRACE_PATH"); if(elfpath == NULL){ m_log << "FAIL_TRACE_PATH not set :(" << std::endl; @@ -12,13 +23,15 @@ InjectionPointHops::InjectionPointHops() : InjectionPointBase(), m_sa(new SmartH }else{ m_sa->init((const char*)elfpath); } -} -InjectionPointHops::~InjectionPointHops() { - delete m_sa; + m_initialized = true; } void InjectionPointHops::parseFromInjectionInstr(unsigned inj_instr) { + if (!m_initialized) { + init(); + } + // Already calculated result needed? if (m_curr_inst == inj_instr) { return;