From dd133c7b24aba128546d24e6042b0e0d46673aaf Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Thu, 10 Jun 2010 23:17:07 -0700 Subject: 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. --- src/mem/ruby/recorder/CacheRecorder.cc | 34 +++++++++++++--------------------- src/mem/ruby/recorder/CacheRecorder.hh | 8 +++----- src/mem/ruby/recorder/TraceRecord.hh | 12 ++++-------- src/mem/ruby/recorder/Tracer.cc | 1 - src/mem/ruby/recorder/Tracer.hh | 1 - 5 files changed, 20 insertions(+), 36 deletions(-) (limited to 'src/mem/ruby/recorder') 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 + #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; -} - -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()); + + 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 #include +#include #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 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* m_records_ptr; + std::vector 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 PrioHeap; class Address; class TraceRecord; class Sequencer; -- cgit v1.2.3