Merge branch 'listener-perf-bug'

Change-Id: Ia863115ec31011ad2b7a954543c8ee64188d3d32
This commit is contained in:
Horst Schirmeier
2015-01-20 17:27:40 +01:00
6 changed files with 24 additions and 17 deletions

View File

@ -50,16 +50,22 @@ void ListenerManager::remove(BaseListener* li)
// called onDeletion for these listeners): // called onDeletion for these listeners):
m_DeleteList.insert(m_DeleteList.end(), m_FireList.begin(), m_FireList.end()); m_DeleteList.insert(m_DeleteList.end(), m_FireList.begin(), m_FireList.end());
// - li != 0 -> remove single listener (if added previously) // - li != 0 -> remove single listener
// * Inform the listeners (call onDeletion) // * If added / not removed before,
// * Remove the index in the perf. buffer-list (if existing) // -> inform the listeners (call onDeletion)
// * Find/remove 'li' in 'm_BufferList' // -> 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' // * 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) } else {
li->onDeletion(); // has li been removed previously?
if (li->getPerformanceBuffer() != NULL) if (li->getLocation() != INVALID_INDEX) {
li->getPerformanceBuffer()->remove(li->getLocation()); li->onDeletion();
m_remove(li->getLocation()); 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 = firelist_t::const_iterator it =
std::find(m_FireList.begin(), m_FireList.end(), li); std::find(m_FireList.begin(), m_FireList.end(), li);
if (it != m_FireList.end()) { if (it != m_FireList.end()) {

View File

@ -16,7 +16,7 @@ ResultSet& PerfVectorBreakpoints::gather(BPEvent* pData)
// Update trigger IPtr: // Update trigger IPtr:
pLi->setTriggerInstructionPointer(pData->getTriggerInstructionPointer()); pLi->setTriggerInstructionPointer(pData->getTriggerInstructionPointer());
pLi->setTriggerCPU(pData->getTriggerCPU()); pLi->setTriggerCPU(pData->getTriggerCPU());
res.add(*it); res.add(pLi);
} }
} }
return res; return res;

View File

@ -44,14 +44,15 @@ public:
* Results (= indices of matching listeners) returned by the "gather"-method, * Results (= indices of matching listeners) returned by the "gather"-method,
* see below. (This class can be seen as a "temporary fire-list".) * see below. (This class can be seen as a "temporary fire-list".)
*/ */
class BaseListener;
class ResultSet { class ResultSet {
private: private:
std::vector<index_t> m_Res; //!< vector of matching listener indices std::vector<BaseListener *> m_Res; //!< vector of pointers to matching listeners
public: public:
ResultSet() { } ResultSet() { }
bool hasMore() const { return !m_Res.empty(); } bool hasMore() const { return !m_Res.empty(); }
index_t getNext() { index_t idx = m_Res.back(); m_Res.pop_back(); return idx; } BaseListener *getNext() { BaseListener *l = m_Res.back(); m_Res.pop_back(); return l; }
void add(index_t idx) { m_Res.push_back(idx); } void add(BaseListener *l) { m_Res.push_back(l); }
size_t size() const { return m_Res.size(); } size_t size() const { return m_Res.size(); }
void clear() { m_Res.clear(); } void clear() { m_Res.clear(); }
}; };

View File

@ -65,12 +65,12 @@ aspect FastBreakpoints {
// Check for matching BPSingleListeners: // Check for matching BPSingleListeners:
fail::ResultSet& res1 = ref.getSingleListeners().gather(&tmp); fail::ResultSet& res1 = ref.getSingleListeners().gather(&tmp);
while (res1.hasMore()) while (res1.hasMore())
ref.makeActive(ref.dereference(res1.getNext())); ref.makeActive(res1.getNext());
// Check for matching BPRangeListeners: // Check for matching BPRangeListeners:
fail::ResultSet& res2 = ref.getRangeListeners().gather(&tmp); fail::ResultSet& res2 = ref.getRangeListeners().gather(&tmp);
while (res2.hasMore()) while (res2.hasMore())
ref.makeActive(ref.dereference(res2.getNext())); ref.makeActive(res2.getNext());
ref.triggerActiveListeners(); ref.triggerActiveListeners();
} }

View File

@ -64,7 +64,7 @@ aspect FastWatchpoints {
// Check for matching MemAccessListener: // Check for matching MemAccessListener:
fail::ResultSet& res = ref.getMemoryListeners().gather(&tmp); fail::ResultSet& res = ref.getMemoryListeners().gather(&tmp);
while (res.hasMore()) while (res.hasMore())
ref.makeActive(ref.dereference(res.getNext())); ref.makeActive(res.getNext());
ref.triggerActiveListeners(); ref.triggerActiveListeners();
} }

View File

@ -20,7 +20,7 @@ ResultSet& PerfVectorWatchpoints::gather(MemAccessEvent* pData)
pmal->setTriggerWidth(pData->getTriggerWidth()); pmal->setTriggerWidth(pData->getTriggerWidth());
pmal->setTriggerAccessType(pData->getTriggerAccessType()); pmal->setTriggerAccessType(pData->getTriggerAccessType());
pmal->setTriggerCPU(pData->getTriggerCPU()); pmal->setTriggerCPU(pData->getTriggerCPU());
res.add(*it); res.add(pmal);
} }
} }
return res; return res;