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):
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()) {

View File

@ -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;

View File

@ -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(); }
};

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;