summaryrefslogtreecommitdiff
path: root/src/mem/bus.cc
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2006-05-30 19:45:54 -0400
committerSteve Reinhardt <stever@eecs.umich.edu>2006-05-30 19:45:54 -0400
commitf0c05de9f98fe3c6e386d3f0346f183ce5abe6c8 (patch)
tree15ce09bb61f953960bd77c388e76d63e0ae8b6c5 /src/mem/bus.cc
parente371dc32a94b0c4ffe7192aad634b425b5b43437 (diff)
parentaa11330ddbb1e579aa241d01d24875cc9d86d5f8 (diff)
downloadgem5-f0c05de9f98fe3c6e386d3f0346f183ce5abe6c8.tar.xz
Merge zizzer.eecs.umich.edu:/z/m5/Bitkeeper/newmem
into zizzer.eecs.umich.edu:/z/stever/bk/newmem-py --HG-- extra : convert_revision : 36640569d33c4410320b8444bb572f408bf5edde
Diffstat (limited to 'src/mem/bus.cc')
-rw-r--r--src/mem/bus.cc28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc
index cfc99a64f..aec3ef2f6 100644
--- a/src/mem/bus.cc
+++ b/src/mem/bus.cc
@@ -72,9 +72,35 @@ Bus::recvTiming(Packet *pkt)
assert(dest != pkt->getSrc()); // catch infinite loops
port = interfaces[dest];
}
- return port->sendTiming(pkt);
+ if (port->sendTiming(pkt)) {
+ // packet was successfully sent, just return true.
+ return true;
+ }
+
+ // packet not successfully sent
+ retryList.push_back(interfaces[pkt->getSrc()]);
+ return false;
+}
+
+void
+Bus::recvRetry(int id)
+{
+ // Go through all the elements on the list calling sendRetry on each
+ // This is not very efficient at all but it works. Ultimately we should end
+ // up with something that is more intelligent.
+ int initialSize = retryList.size();
+ int i;
+ Port *p;
+
+ for (i = 0; i < initialSize; i++) {
+ assert(retryList.size() > 0);
+ p = retryList.front();
+ retryList.pop_front();
+ p->sendRetry();
+ }
}
+
Port *
Bus::findPort(Addr addr, int id)
{