add the ability to insert into the middle of the timing port send list
authorAli Saidi <saidi@eecs.umich.edu>
Tue, 31 Oct 2006 18:23:17 +0000 (13:23 -0500)
committerAli Saidi <saidi@eecs.umich.edu>
Tue, 31 Oct 2006 18:23:17 +0000 (13:23 -0500)
--HG--
extra : convert_revision : 5422025f74ba7013f98d1d1dcbd1070f580aae61

src/mem/tport.cc

index b9d5cbe4ae243f300ee73cedd22a28517fbd36d3..086d912792242f87c1a70448bdb7fe5d2af0e325 100644 (file)
@@ -44,6 +44,7 @@ SimpleTimingPort::recvFunctional(PacketPtr pkt)
         if (target->intersect(pkt))
             done = fixPacket(pkt, target);
 
+        i++;
     }
 
     //Then just do an atomic access and throw away the returned latency
@@ -98,11 +99,29 @@ SimpleTimingPort::recvRetry()
 void
 SimpleTimingPort::sendTiming(PacketPtr pkt, Tick time)
 {
+    // Nothing is on the list: add it and schedule an event
     if (transmitList.empty()) {
         assert(!sendEvent.scheduled());
         sendEvent.schedule(curTick+time);
+        transmitList.push_back(std::pair<Tick,PacketPtr>(time+curTick,pkt));
+        return;
+    }
+
+    // something is on the list and this belongs at the end
+    if (time+curTick >= transmitList.back().first) {
+        transmitList.push_back(std::pair<Tick,PacketPtr>(time+curTick,pkt));
+        return;
+    }
+    // Something is on the list and this belongs somewhere else
+    std::list<std::pair<Tick,PacketPtr> >::iterator i = transmitList.begin();
+    std::list<std::pair<Tick,PacketPtr> >::iterator end = transmitList.end();
+    bool done = false;
+
+    while (i != end && !done) {
+        if (time+curTick < i->first)
+            transmitList.insert(i,std::pair<Tick,PacketPtr>(time+curTick,pkt));
+        i++;
     }
-    transmitList.push_back(std::pair<Tick,PacketPtr>(time+curTick,pkt));
 }
 
 void