Don't insert reponses into the list more than once
authorRon Dreslinski <rdreslin@umich.edu>
Sun, 12 Nov 2006 12:16:34 +0000 (07:16 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Sun, 12 Nov 2006 12:16:34 +0000 (07:16 -0500)
If you get inserted in the front, reschedule the event

--HG--
extra : convert_revision : eccbacf5ec85600e5b68eb554fee2c0e2b65e965

src/mem/cache/base_cache.hh
src/mem/tport.cc

index 9a79bd36ce278bd4f9f1ca84ca1e5d8e40328e92..584c2d5df6caf767b6703abdb76ba33c375ef22a 100644 (file)
@@ -571,9 +571,15 @@ class BaseCache : public MemObject
             bool done = false;
 
             while (i != end && !done) {
-                if (time < i->first)
+                if (time < i->first) {
+                    if (i == cpuSidePort->transmitList.begin()) {
+                        //Inserting at begining, reschedule
+                        sendEvent->reschedule(time);
+                    }
                     cpuSidePort->transmitList.insert(i,std::pair<Tick,PacketPtr>
                                                      (time,pkt));
+                    done = true;
+                }
                 i++;
             }
         }
@@ -624,9 +630,15 @@ class BaseCache : public MemObject
             bool done = false;
 
             while (i != end && !done) {
-                if (time < i->first)
+                if (time < i->first) {
+                    if (i == cpuSidePort->transmitList.begin()) {
+                        //Inserting at begining, reschedule
+                        sendEvent->reschedule(time);
+                    }
                     cpuSidePort->transmitList.insert(i,std::pair<Tick,PacketPtr>
                                                      (time,pkt));
+                    done = true;
+                }
                 i++;
             }
         }
@@ -672,8 +684,14 @@ class BaseCache : public MemObject
         bool done = false;
 
         while (i != end && !done) {
-            if (time < i->first)
-                    memSidePort->transmitList.insert(i,std::pair<Tick,PacketPtr>(time,pkt));
+            if (time < i->first) {
+                if (i == memSidePort->transmitList.begin()) {
+                    //Inserting at begining, reschedule
+                    memSendEvent->reschedule(time);
+                }
+                memSidePort->transmitList.insert(i,std::pair<Tick,PacketPtr>(time,pkt));
+                done = true;
+            }
             i++;
         }
     }
index a85ae2b144455f0c51628cc97c440d50e1e8b5ce..c43c9aac03cb8281fd89613a15e5d9d1448cc7f0 100644 (file)
@@ -118,8 +118,14 @@ SimpleTimingPort::sendTiming(PacketPtr pkt, Tick time)
     bool done = false;
 
     while (i != end && !done) {
-        if (time+curTick < i->first)
+        if (time+curTick < i->first) {
+            if (i == transmitList.begin()) {
+                //Inserting at begining, reschedule
+                sendEvent.reschedule(time+curTick);
+            }
             transmitList.insert(i,std::pair<Tick,PacketPtr>(time+curTick,pkt));
+            done = true;
+        }
         i++;
     }
 }