Put in an accounting mechanism and an assert to make sure something doesn't try to...
authorGabe Black <gblack@eecs.umich.edu>
Wed, 11 Oct 2006 02:10:08 +0000 (22:10 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 11 Oct 2006 02:10:08 +0000 (22:10 -0400)
--HG--
extra : convert_revision : 4a2b83111e49f71ca27e05c98b55bc3bac8d9f53

src/mem/bus.cc
src/mem/bus.hh

index 3efaa93acf3205848e6cf5e2fc12d6c11d3475ad..3b8a079caaa4637d8779636b3a7cff179b91f52e 100644 (file)
@@ -61,7 +61,7 @@ Bus::getPort(const std::string &if_name, int idx)
 void
 Bus::init()
 {
-    std::vector<Port*>::iterator intIter;
+    std::vector<BusPort*>::iterator intIter;
 
     for (intIter = interfaces.begin(); intIter != interfaces.end(); intIter++)
         (*intIter)->sendStatusChange(Port::RangeChange);
@@ -89,7 +89,7 @@ Bus::recvTiming(Packet *pkt)
     DPRINTF(Bus, "recvTiming: packet src %d dest %d addr 0x%x cmd %s\n",
             pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
 
-    Port *pktPort = interfaces[pkt->getSrc()];
+    BusPort *pktPort = interfaces[pkt->getSrc()];
 
     // If the bus is busy, or other devices are in line ahead of the current
     // one, put this device on the retry list.
@@ -108,6 +108,7 @@ Bus::recvTiming(Packet *pkt)
             if (pkt->flags & SATISFIED) {
                 //Cache-Cache transfer occuring
                 if (inRetry) {
+                    retryList.front()->onRetryList(false);
                     retryList.pop_front();
                     inRetry = false;
                 }
@@ -181,6 +182,7 @@ Bus::recvTiming(Packet *pkt)
         // Packet was successfully sent. Return true.
         // Also take care of retries
         if (inRetry) {
+            retryList.front()->onRetryList(false);
             retryList.pop_front();
             inRetry = false;
         }
index 4affcd6ae40712bc862322f17af8a296665f341d..4f330230f5a995678ebca30fe30054c8d96883a5 100644 (file)
@@ -130,6 +130,8 @@ class Bus : public MemObject
         of the interfaces connecting to the bus. */
     class BusPort : public Port
     {
+        bool _onRetryList;
+
         /** A pointer to the bus to which this port belongs. */
         Bus *bus;
 
@@ -140,9 +142,15 @@ class Bus : public MemObject
 
         /** Constructor for the BusPort.*/
         BusPort(const std::string &_name, Bus *_bus, int _id)
-            : Port(_name), bus(_bus), id(_id)
+            : Port(_name), _onRetryList(false), bus(_bus), id(_id)
         { }
 
+        bool onRetryList()
+        { return _onRetryList; }
+
+        void onRetryList(bool newVal)
+        { _onRetryList = newVal; }
+
       protected:
 
         /** When reciving a timing request from the peer port (at id),
@@ -199,17 +207,19 @@ class Bus : public MemObject
 
     /** An array of pointers to the peer port interfaces
         connected to this bus.*/
-    std::vector<Port*> interfaces;
+    std::vector<BusPort*> interfaces;
 
     /** An array of pointers to ports that retry should be called on because the
      * original send failed for whatever reason.*/
-    std::list<Port*> retryList;
+    std::list<BusPort*> retryList;
 
-    void addToRetryList(Port * port)
+    void addToRetryList(BusPort * port)
     {
         if (!inRetry) {
             // The device wasn't retrying a packet, or wasn't at an appropriate
             // time.
+            assert(!port->onRetryList());
+            port->onRetryList(true);
             retryList.push_back(port);
         } else {
             // The device was retrying a packet. It didn't work, so we'll leave