diff options
Diffstat (limited to 'src/mem/bus.cc')
-rw-r--r-- | src/mem/bus.cc | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 5ab7e5b04..730c612ca 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -136,8 +136,7 @@ template <typename SrcType, typename DstType> BaseBus::Layer<SrcType,DstType>::Layer(DstType& _port, BaseBus& _bus, const std::string& _name) : port(_port), bus(_bus), _name(_name), state(IDLE), drainManager(NULL), - retryingPort(NULL), waitingForPeer(NULL), - releaseEvent(this) + waitingForPeer(NULL), releaseEvent(this) { } @@ -190,9 +189,6 @@ BaseBus::Layer<SrcType,DstType>::tryTiming(SrcType* src_port) // update the state to busy state = BUSY; - // reset the retrying port - retryingPort = NULL; - return true; } @@ -243,7 +239,10 @@ BaseBus::Layer<SrcType,DstType>::releaseLayer() // bus layer is now idle, so if someone is waiting we can retry if (!waitingForLayer.empty()) { - retryWaiting(); + // there is no point in sending a retry if someone is still + // waiting for the peer + if (waitingForPeer == NULL) + retryWaiting(); } else if (waitingForPeer == NULL && drainManager) { DPRINTF(Drain, "Bus done draining, signaling drain manager\n"); //If we weren't able to drain before, do it now. @@ -268,8 +267,7 @@ BaseBus::Layer<SrcType,DstType>::retryWaiting() // set the retrying port to the front of the retry list and pop it // off the list - assert(retryingPort == NULL); - retryingPort = waitingForLayer.front(); + SrcType* retryingPort = waitingForLayer.front(); waitingForLayer.pop_front(); // tell the port to retry, which in some cases ends up calling the @@ -282,7 +280,6 @@ BaseBus::Layer<SrcType,DstType>::retryWaiting() // update the state to busy and reset the retrying port, we // have done our bit and sent the retry state = BUSY; - retryingPort = NULL; // occupy the bus layer until the next cycle ends occupyLayer(bus.clockEdge(Cycles(1))); |