Merge branch 'listener-perf-bug'

Change-Id: Ia863115ec31011ad2b7a954543c8ee64188d3d32
This commit is contained in:
Horst Schirmeier
2015-01-21 14:52:33 +01:00
6 changed files with 24 additions and 17 deletions
+15 -9
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()) {
+1 -1
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;
+4 -3
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(); }
};
+2 -2
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();
}
+1 -1
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();
}
+1 -1
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;