summaryrefslogtreecommitdiff
path: root/src/mem/ruby
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2014-03-20 09:14:14 -0500
committerNilay Vaish <nilay@cs.wisc.edu>2014-03-20 09:14:14 -0500
commit52a83c1d0ea2e0806ce3934aab5c566d6c9e3451 (patch)
tree83613de08d59415a1d681d4c0b780c81165ccec9 /src/mem/ruby
parent4b67ada89e2e47b26ad07562774ff65beb5633a5 (diff)
downloadgem5-52a83c1d0ea2e0806ce3934aab5c566d6c9e3451.tar.xz
ruby: consumer: avoid accessing wakeup times when waking up
Each consumer object maintains a set of tick values when the object is supposed to wakeup and do some processing. As of now, the object accesses this set both when scheduling a wakeup event and when the object actually wakes up. The set is accessed during wakeup to remove the current tick value from the set. This functionality is now being moved to the scheduling function where ticks are removed at a later time.
Diffstat (limited to 'src/mem/ruby')
-rw-r--r--src/mem/ruby/common/Consumer.cc7
-rw-r--r--src/mem/ruby/common/Consumer.hh28
2 files changed, 9 insertions, 26 deletions
diff --git a/src/mem/ruby/common/Consumer.cc b/src/mem/ruby/common/Consumer.cc
index 9f3735709..59605d51b 100644
--- a/src/mem/ruby/common/Consumer.cc
+++ b/src/mem/ruby/common/Consumer.cc
@@ -28,6 +28,8 @@
#include "mem/ruby/common/Consumer.hh"
+using namespace std;
+
void
Consumer::scheduleEvent(Cycles timeDelta)
{
@@ -43,4 +45,9 @@ Consumer::scheduleEventAbsolute(Tick evt_time)
em->schedule(evt, evt_time);
insertScheduledWakeupTime(evt_time);
}
+
+ Tick t = em->clockEdge();
+ set<Tick>::iterator bit = m_scheduled_wakeups.begin();
+ set<Tick>::iterator eit = m_scheduled_wakeups.lower_bound(t);
+ m_scheduled_wakeups.erase(bit,eit);
}
diff --git a/src/mem/ruby/common/Consumer.hh b/src/mem/ruby/common/Consumer.hh
index 57ee69f3e..20f2bdd0f 100644
--- a/src/mem/ruby/common/Consumer.hh
+++ b/src/mem/ruby/common/Consumer.hh
@@ -44,7 +44,7 @@ class Consumer
{
public:
Consumer(ClockedObject *_em)
- : m_last_scheduled_wakeup(0), em(_em)
+ : em(_em)
{
}
@@ -56,18 +56,6 @@ class Consumer
virtual void print(std::ostream& out) const = 0;
virtual void storeEventInfo(int info) {}
- const Tick&
- getLastScheduledWakeup() const
- {
- return m_last_scheduled_wakeup;
- }
-
- void
- setLastScheduledWakeup(const Tick& time)
- {
- m_last_scheduled_wakeup = time;
- }
-
bool
alreadyScheduled(Tick time)
{
@@ -80,20 +68,12 @@ class Consumer
m_scheduled_wakeups.insert(time);
}
- void
- removeScheduledWakeupTime(Tick time)
- {
- assert(alreadyScheduled(time));
- m_scheduled_wakeups.erase(time);
- }
-
void scheduleEventAbsolute(Tick timeAbs);
protected:
void scheduleEvent(Cycles timeDelta);
private:
- Tick m_last_scheduled_wakeup;
std::set<Tick> m_scheduled_wakeups;
ClockedObject *em;
@@ -105,11 +85,7 @@ class Consumer
{
}
- void process()
- {
- m_consumer_ptr->wakeup();
- m_consumer_ptr->removeScheduledWakeupTime(when());
- }
+ void process() { m_consumer_ptr->wakeup(); }
private:
Consumer* m_consumer_ptr;