Merge branch 'listener-perf-bug'
Change-Id: Ia863115ec31011ad2b7a954543c8ee64188d3d32
This commit is contained in:
@ -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()) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<index_t> m_Res; //!< vector of matching listener indices
|
||||
std::vector<BaseListener *> 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(); }
|
||||
};
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user