diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2006-05-30 19:45:54 -0400 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2006-05-30 19:45:54 -0400 |
commit | f0c05de9f98fe3c6e386d3f0346f183ce5abe6c8 (patch) | |
tree | 15ce09bb61f953960bd77c388e76d63e0ae8b6c5 /src/mem/bus.cc | |
parent | e371dc32a94b0c4ffe7192aad634b425b5b43437 (diff) | |
parent | aa11330ddbb1e579aa241d01d24875cc9d86d5f8 (diff) | |
download | gem5-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.cc | 28 |
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) { |