ruby: consumer: avoid accessing wakeup times when waking up
authorNilay Vaish <nilay@cs.wisc.edu>
Thu, 20 Mar 2014 14:14:14 +0000 (09:14 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Thu, 20 Mar 2014 14:14:14 +0000 (09:14 -0500)
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.

src/mem/ruby/common/Consumer.cc
src/mem/ruby/common/Consumer.hh

index 9f3735709506c9d8cd7b191f03b9bcd5a083e3b0..59605d51b70f26b63137f0e1977fe1b90618acf2 100644 (file)
@@ -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);
 }
index 57ee69f3e82f255c8358f3b8791d4845badc85f0..20f2bdd0f642c7cce1e730221918a79045b39d71 100644 (file)
@@ -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;