diff --git a/src/core/sal/ListenerManager.cc b/src/core/sal/ListenerManager.cc index dbe7808e..8e804c78 100644 --- a/src/core/sal/ListenerManager.cc +++ b/src/core/sal/ListenerManager.cc @@ -50,16 +50,22 @@ void ListenerManager::remove(BaseListener* li) // called onDeletion for these listeners): m_DeleteList.insert(m_DeleteList.end(), m_FireList.begin(), m_FireList.end()); - // - li != 0 -> remove single listener (if added previously) - // * Inform the listeners (call onDeletion) - // * Remove the index in the perf. buffer-list (if existing) - // * Find/remove 'li' in 'm_BufferList' + // - li != 0 -> remove single listener + // * If added / not removed before, + // -> inform the listeners (call onDeletion) + // -> Remove the index in the perf. buffer-list (if existing) + // -> Find/remove 'li' in 'm_BufferList' // * If 'li' in 'm_FireList', copy to 'm_DeleteList' - } else if (li->getLocation() != INVALID_INDEX) { // Check if li hasn't been added previously (Q&D) - li->onDeletion(); - if (li->getPerformanceBuffer() != NULL) - li->getPerformanceBuffer()->remove(li->getLocation()); - m_remove(li->getLocation()); + } else { + // has li been removed previously? + if (li->getLocation() != INVALID_INDEX) { + li->onDeletion(); + if (li->getPerformanceBuffer() != NULL) { + li->getPerformanceBuffer()->remove(li->getLocation()); + } + m_remove(li->getLocation()); + } + // if li hasn't fired yet, make sure it doesn't firelist_t::const_iterator it = std::find(m_FireList.begin(), m_FireList.end(), li); if (it != m_FireList.end()) { diff --git a/src/core/sal/perf/BreakpointBuffer.cc b/src/core/sal/perf/BreakpointBuffer.cc index 1d56a55c..90b95b00 100644 --- a/src/core/sal/perf/BreakpointBuffer.cc +++ b/src/core/sal/perf/BreakpointBuffer.cc @@ -16,7 +16,7 @@ ResultSet& PerfVectorBreakpoints::gather(BPEvent* pData) // Update trigger IPtr: pLi->setTriggerInstructionPointer(pData->getTriggerInstructionPointer()); pLi->setTriggerCPU(pData->getTriggerCPU()); - res.add(*it); + res.add(pLi); } } return res; diff --git a/src/core/sal/perf/BufferInterface.hpp b/src/core/sal/perf/BufferInterface.hpp index d612a79b..acc278c6 100644 --- a/src/core/sal/perf/BufferInterface.hpp +++ b/src/core/sal/perf/BufferInterface.hpp @@ -44,14 +44,15 @@ public: * Results (= indices of matching listeners) returned by the "gather"-method, * see below. (This class can be seen as a "temporary fire-list".) */ +class BaseListener; class ResultSet { private: - std::vector m_Res; //!< vector of matching listener indices + std::vector m_Res; //!< vector of pointers to matching listeners public: ResultSet() { } bool hasMore() const { return !m_Res.empty(); } - index_t getNext() { index_t idx = m_Res.back(); m_Res.pop_back(); return idx; } - void add(index_t idx) { m_Res.push_back(idx); } + BaseListener *getNext() { BaseListener *l = m_Res.back(); m_Res.pop_back(); return l; } + void add(BaseListener *l) { m_Res.push_back(l); } size_t size() const { return m_Res.size(); } void clear() { m_Res.clear(); } }; diff --git a/src/core/sal/perf/FastBreakpoints.ah b/src/core/sal/perf/FastBreakpoints.ah index 0abdbdea..27e25f5a 100644 --- a/src/core/sal/perf/FastBreakpoints.ah +++ b/src/core/sal/perf/FastBreakpoints.ah @@ -65,12 +65,12 @@ aspect FastBreakpoints { // Check for matching BPSingleListeners: fail::ResultSet& res1 = ref.getSingleListeners().gather(&tmp); while (res1.hasMore()) - ref.makeActive(ref.dereference(res1.getNext())); + ref.makeActive(res1.getNext()); // Check for matching BPRangeListeners: fail::ResultSet& res2 = ref.getRangeListeners().gather(&tmp); while (res2.hasMore()) - ref.makeActive(ref.dereference(res2.getNext())); + ref.makeActive(res2.getNext()); ref.triggerActiveListeners(); } diff --git a/src/core/sal/perf/FastWatchpoints.ah b/src/core/sal/perf/FastWatchpoints.ah index 59279eee..ce2a2876 100644 --- a/src/core/sal/perf/FastWatchpoints.ah +++ b/src/core/sal/perf/FastWatchpoints.ah @@ -64,7 +64,7 @@ aspect FastWatchpoints { // Check for matching MemAccessListener: fail::ResultSet& res = ref.getMemoryListeners().gather(&tmp); while (res.hasMore()) - ref.makeActive(ref.dereference(res.getNext())); + ref.makeActive(res.getNext()); ref.triggerActiveListeners(); } diff --git a/src/core/sal/perf/WatchpointBuffer.cc b/src/core/sal/perf/WatchpointBuffer.cc index 1a66ff7e..ad2e27b4 100644 --- a/src/core/sal/perf/WatchpointBuffer.cc +++ b/src/core/sal/perf/WatchpointBuffer.cc @@ -20,7 +20,7 @@ ResultSet& PerfVectorWatchpoints::gather(MemAccessEvent* pData) pmal->setTriggerWidth(pData->getTriggerWidth()); pmal->setTriggerAccessType(pData->getTriggerAccessType()); pmal->setTriggerCPU(pData->getTriggerCPU()); - res.add(*it); + res.add(pmal); } } return res;