summaryrefslogtreecommitdiff
path: root/src/mem/ruby/recorder
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2010-06-10 23:17:07 -0700
committerNathan Binkert <nate@binkert.org>2010-06-10 23:17:07 -0700
commitdd133c7b24aba128546d24e6042b0e0d46673aaf (patch)
tree60f82f2f2b708a0fdb6967a7bf1262b435b5e6e0 /src/mem/ruby/recorder
parent3df84fd8a0ce3959c0deb4c206d910fc0d050f47 (diff)
downloadgem5-dd133c7b24aba128546d24e6042b0e0d46673aaf.tar.xz
ruby: get rid of PrioHeap and use STL
One big difference is that PrioHeap puts the smallest element at the top of the heap, whereas stl puts the largest element on top, so I changed all comparisons so they did the right thing. Some usage of PrioHeap was simply changed to a std::vector, using sort at the right time, other usage had me just use the various heap functions in the stl.
Diffstat (limited to 'src/mem/ruby/recorder')
-rw-r--r--src/mem/ruby/recorder/CacheRecorder.cc34
-rw-r--r--src/mem/ruby/recorder/CacheRecorder.hh8
-rw-r--r--src/mem/ruby/recorder/TraceRecord.hh12
-rw-r--r--src/mem/ruby/recorder/Tracer.cc1
-rw-r--r--src/mem/ruby/recorder/Tracer.hh1
5 files changed, 20 insertions, 36 deletions
diff --git a/src/mem/ruby/recorder/CacheRecorder.cc b/src/mem/ruby/recorder/CacheRecorder.cc
index 32db211b6..1d08eef12 100644
--- a/src/mem/ruby/recorder/CacheRecorder.cc
+++ b/src/mem/ruby/recorder/CacheRecorder.cc
@@ -26,31 +26,21 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <algorithm>
+
#include "gzstream.hh"
-#include "mem/gems_common/PrioHeap.hh"
#include "mem/ruby/eventqueue/RubyEventQueue.hh"
#include "mem/ruby/recorder/CacheRecorder.hh"
-#include "mem/ruby/recorder/TraceRecord.hh"
using namespace std;
-CacheRecorder::CacheRecorder()
-{
- m_records_ptr = new PrioHeap<TraceRecord>;
-}
-
-CacheRecorder::~CacheRecorder()
-{
- delete m_records_ptr;
-}
-
void
CacheRecorder::addRecord(Sequencer* sequencer, const Address& data_addr,
const Address& pc_addr, RubyRequestType type, Time time)
{
- m_records_ptr->
- insert(TraceRecord(sequencer, data_addr, pc_addr, type, time));
+ TraceRecord rec(sequencer, data_addr, pc_addr, type, time);
+ m_records.push_back(rec);
}
int
@@ -62,13 +52,15 @@ CacheRecorder::dumpRecords(string filename)
return 0;
}
- int counter = 0;
- while (m_records_ptr->size() != 0) {
- TraceRecord record = m_records_ptr->extractMin();
- record.output(out);
- counter++;
- }
- return counter;
+ std::sort(m_records.begin(), m_records.end(), greater<TraceRecord>());
+
+ int size = m_records.size();
+ for (int i = 0; i < size; ++i)
+ m_records[i].output(out);
+
+ m_records.clear();
+
+ return size;
}
void
diff --git a/src/mem/ruby/recorder/CacheRecorder.hh b/src/mem/ruby/recorder/CacheRecorder.hh
index 18c246c9f..14066c387 100644
--- a/src/mem/ruby/recorder/CacheRecorder.hh
+++ b/src/mem/ruby/recorder/CacheRecorder.hh
@@ -36,13 +36,14 @@
#include <iostream>
#include <string>
+#include <vector>
#include "mem/protocol/CacheRequestType.hh"
#include "mem/ruby/common/Global.hh"
#include "mem/ruby/libruby_internal.hh"
#include "mem/ruby/system/NodeID.hh"
+#include "mem/ruby/recorder/TraceRecord.hh"
-template <class TYPE> class PrioHeap;
class Address;
class TraceRecord;
class Sequencer;
@@ -50,9 +51,6 @@ class Sequencer;
class CacheRecorder
{
public:
- CacheRecorder();
- ~CacheRecorder();
-
void addRecord(Sequencer* sequencer, const Address& data_addr,
const Address& pc_addr, RubyRequestType type, Time time);
int dumpRecords(std::string filename);
@@ -64,7 +62,7 @@ class CacheRecorder
CacheRecorder(const CacheRecorder& obj);
CacheRecorder& operator=(const CacheRecorder& obj);
- PrioHeap<TraceRecord>* m_records_ptr;
+ std::vector<TraceRecord> m_records;
};
inline std::ostream&
diff --git a/src/mem/ruby/recorder/TraceRecord.hh b/src/mem/ruby/recorder/TraceRecord.hh
index 98e78b20e..ed066debb 100644
--- a/src/mem/ruby/recorder/TraceRecord.hh
+++ b/src/mem/ruby/recorder/TraceRecord.hh
@@ -60,12 +60,6 @@ class TraceRecord
TraceRecord(const TraceRecord& obj);
TraceRecord& operator=(const TraceRecord& obj);
- bool
- node_less_then_eq(const TraceRecord& rec) const
- {
- return this->m_time <= rec.m_time;
- }
-
void issueRequest() const;
void print(std::ostream& out) const;
@@ -73,6 +67,8 @@ class TraceRecord
bool input(std::istream& in);
private:
+ friend bool operator>(const TraceRecord& n1, const TraceRecord& n2);
+
Sequencer* m_sequencer_ptr;
Time m_time;
Address m_data_address;
@@ -81,9 +77,9 @@ class TraceRecord
};
inline bool
-node_less_then_eq(const TraceRecord& n1, const TraceRecord& n2)
+operator>(const TraceRecord& n1, const TraceRecord& n2)
{
- return n1.node_less_then_eq(n2);
+ return n1.m_time > n2.m_time;
}
inline std::ostream&
diff --git a/src/mem/ruby/recorder/Tracer.cc b/src/mem/ruby/recorder/Tracer.cc
index 23dafdb6c..bff59a832 100644
--- a/src/mem/ruby/recorder/Tracer.cc
+++ b/src/mem/ruby/recorder/Tracer.cc
@@ -27,7 +27,6 @@
*/
#include "base/cprintf.hh"
-#include "mem/gems_common/PrioHeap.hh"
#include "mem/ruby/eventqueue/RubyEventQueue.hh"
#include "mem/ruby/recorder/TraceRecord.hh"
#include "mem/ruby/recorder/Tracer.hh"
diff --git a/src/mem/ruby/recorder/Tracer.hh b/src/mem/ruby/recorder/Tracer.hh
index d468b4920..4b81d6121 100644
--- a/src/mem/ruby/recorder/Tracer.hh
+++ b/src/mem/ruby/recorder/Tracer.hh
@@ -46,7 +46,6 @@
#include "params/RubyTracer.hh"
#include "sim/sim_object.hh"
-template <class TYPE> class PrioHeap;
class Address;
class TraceRecord;
class Sequencer;