fast-breakpoints: created template class DefPerfVector, realizing the buffer interface. Modified PerfVectorBreakpoints appropriately.
This is useful to reuse the DefPerfVector class for fast-watchpoints, too. git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1898 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
@ -1,13 +1,14 @@
|
|||||||
#include "BreakpointBuffer.hpp"
|
#include "BreakpointBuffer.hpp"
|
||||||
#include "../SALInst.hpp"
|
#include "../SALInst.hpp"
|
||||||
|
#include "../Listener.hpp"
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
// FIXME: can not be inlined this way
|
// FIXME: Can not be inlined this way!
|
||||||
ResultSet& PerfVectorBreakpoints::gather(BPEvent* pData)
|
ResultSet& PerfVectorBreakpoints::gather(BPEvent* pData)
|
||||||
{
|
{
|
||||||
static ResultSet res;
|
static ResultSet res;
|
||||||
res.clear();
|
res.clear(); // FIXME: This should not free the memory of the underlying std::vector.
|
||||||
// Search for all indices of matching listener objects:
|
// Search for all indices of matching listener objects:
|
||||||
for(std::vector<index_t>::iterator it = m_BufList.begin(); it != m_BufList.end(); ++it) {
|
for(std::vector<index_t>::iterator it = m_BufList.begin(); it != m_BufList.end(); ++it) {
|
||||||
BPListener* pLi = static_cast<BPListener*>(simulator.dereference(*it));
|
BPListener* pLi = static_cast<BPListener*>(simulator.dereference(*it));
|
||||||
|
|||||||
@ -2,58 +2,19 @@
|
|||||||
#define __BREAKPOINT_BUFFER_HPP__
|
#define __BREAKPOINT_BUFFER_HPP__
|
||||||
|
|
||||||
#include "BufferInterface.hpp"
|
#include "BufferInterface.hpp"
|
||||||
#include "../Listener.hpp"
|
|
||||||
#include <cassert>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
// TODOs:
|
// TODOs:
|
||||||
// - Make these implementations even faster (see below: continue PerfVecSortedSingleBP).
|
// - Make these implementations even faster (see below: continue PerfVecSortedSingleBP).
|
||||||
// - The implementation of gather() (see below) in BreakpointBuffer.cc (not inlined in
|
|
||||||
// .hpp) avoids an include cycle. Unfortunately, this may cause a bad performance
|
|
||||||
// because gather() won't be inlined anymore! (The method is called quite often.)
|
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
class BPEvent;
|
class BPEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class ResultSet
|
* Concrete implementation for the \c BPSingleListener class.
|
||||||
*
|
|
||||||
* Results (= indices of matching listeners) returned by the "gather"-method,
|
|
||||||
* see below. (This class can be seen as a "temporary fire-list".)
|
|
||||||
*/
|
*/
|
||||||
class ResultSet {
|
class PerfVectorBreakpoints : public DefPerfVector<BPEvent> {
|
||||||
std::vector<index_t> m_Res;
|
|
||||||
public:
|
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); }
|
|
||||||
size_t size() const { return m_Res.size(); }
|
|
||||||
void clear() { m_Res.clear(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Concrete implementation of the PerfBufferBase class for \c std::vector
|
|
||||||
* and \c BPSingleListener.
|
|
||||||
*/
|
|
||||||
class PerfVectorBreakpoints : public PerfBufferBase {
|
|
||||||
protected:
|
|
||||||
std::vector<index_t> m_BufList;
|
|
||||||
public:
|
|
||||||
void add(index_t idx) { m_BufList.push_back(idx); }
|
|
||||||
void remove(index_t idx)
|
|
||||||
{
|
|
||||||
for (std::vector<index_t>::iterator it = m_BufList.begin();
|
|
||||||
it != m_BufList.end(); ++it) {
|
|
||||||
if (*it == idx) {
|
|
||||||
m_BufList.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void clear() { m_BufList.clear(); }
|
|
||||||
size_t size() const { return m_BufList.size(); }
|
|
||||||
ResultSet& gather(BPEvent* pData);
|
ResultSet& gather(BPEvent* pData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_FAST_BREAKPOINTS
|
#ifdef CONFIG_FAST_BREAKPOINTS
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include "BreakpointBuffer.hpp"
|
#include "BreakpointBuffer.hpp"
|
||||||
|
#include "../Listener.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class BreakpointManagerSlice
|
* \class BreakpointManagerSlice
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#define __BUFFER_INTERFACE_HPP__
|
#define __BUFFER_INTERFACE_HPP__
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
@ -37,6 +38,50 @@ public:
|
|||||||
virtual std::size_t size() const = 0;
|
virtual std::size_t size() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \class ResultSet
|
||||||
|
*
|
||||||
|
* Results (= indices of matching listeners) returned by the "gather"-method,
|
||||||
|
* see below. (This class can be seen as a "temporary fire-list".)
|
||||||
|
*/
|
||||||
|
class ResultSet {
|
||||||
|
private:
|
||||||
|
std::vector<index_t> m_Res; //!< vector of matching listener indices
|
||||||
|
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); }
|
||||||
|
size_t size() const { return m_Res.size(); }
|
||||||
|
void clear() { m_Res.clear(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \class DefPerfVector
|
||||||
|
*
|
||||||
|
* Default \c std::vector based performance implementation (abstract)
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class DefPerfVector : public PerfBufferBase {
|
||||||
|
protected:
|
||||||
|
std::vector<index_t> m_BufList; //!< the performance buffer-list
|
||||||
|
public:
|
||||||
|
void add(index_t idx) { m_BufList.push_back(idx); }
|
||||||
|
void remove(index_t idx)
|
||||||
|
{
|
||||||
|
for (std::vector<index_t>::iterator it = m_BufList.begin();
|
||||||
|
it != m_BufList.end(); ++it) {
|
||||||
|
if (*it == idx) {
|
||||||
|
m_BufList.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void clear() { m_BufList.clear(); }
|
||||||
|
size_t size() const { return m_BufList.size(); }
|
||||||
|
virtual ResultSet& gather(T* pData) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
} // end-of-namespace: fail
|
} // end-of-namespace: fail
|
||||||
|
|
||||||
#endif // __BUFFER_INTERFACE_HPP__
|
#endif // __BUFFER_INTERFACE_HPP__
|
||||||
|
|||||||
Reference in New Issue
Block a user