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)
{
}
// update the state to busy
state = BUSY;
- // reset the retrying port
- retryingPort = NULL;
-
return true;
}
// 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.
// 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
// 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)));
*/
std::deque<SrcType*> waitingForLayer;
- /**
- * Port that we are currently in the process of telling to
- * retry a previously failed attempt to perform a timing
- * transaction. This is a valid port when in the retry state,
- * and NULL when in busy or idle.
- */
- SrcType* retryingPort;
-
/**
* Track who is waiting for the retry when receiving it from a
* peer. If no port is waiting NULL is stored.