delete senderWalk;
// Since we block requests when another is outstanding, we
// need to check if there is a waiting request to be serviced
- if (currStates.size())
- startWalkWrapper();
+ if (currStates.size() && !startWalkWrapperEvent.scheduled())
+ // delay sending any new requests until we are finished
+ // with the responses
+ schedule(startWalkWrapperEvent, clockEdge());
}
return true;
}
// Wrapper for checking for squashes before starting a translation.
void startWalkWrapper();
+ /**
+ * Event used to call startWalkWrapper.
+ **/
+ EventWrapper<Walker, &Walker::startWalkWrapper> startWalkWrapperEvent;
+
// Functions for dealing with packets.
bool recvTimingResp(PacketPtr pkt);
void recvRetry();
MemObject(params), port(name() + ".port", this),
funcState(this, NULL, NULL, true), tlb(NULL), sys(params->system),
masterId(sys->getMasterId(name())),
- numSquashable(params->num_squash_per_cycle)
+ numSquashable(params->num_squash_per_cycle),
+ startWalkWrapperEvent(this)
{
}
};