SimpleTimingPort::SimpleTimingPort(const std::string& _name,
MemObject* _owner) :
- QueuedSlavePort(_name, _owner, queue), queue(*_owner, *this)
+ QueuedSlavePort(_name, _owner, queueImpl), queueImpl(*_owner, *this)
{
}
void
SimpleTimingPort::recvFunctional(PacketPtr pkt)
{
- assert(pkt->isRequest());
if (!queue.checkFunctional(pkt)) {
// do an atomic access and throw away the returned latency
recvAtomic(pkt);
}
bool
-SimpleTimingPort::recvTiming(PacketPtr pkt)
+SimpleTimingPort::recvTimingReq(PacketPtr pkt)
{
- // the port is a slave and should hence only get timing requests
- assert(pkt->isRequest());
+ /// @todo temporary hack to deal with memory corruption issue until
+ /// 4-phase transactions are complete. Remove me later
+ for (int x = 0; x < pendingDelete.size(); x++)
+ delete pendingDelete[x];
+ pendingDelete.clear();
if (pkt->memInhibitAsserted()) {
// snooper will supply based on copy of packet
// recvAtomic() should already have turned packet into
// atomic response
assert(pkt->isResponse());
- queue.schedSendTiming(pkt, curTick() + latency);
+ schedTimingResp(pkt, curTick() + latency);
} else {
- delete pkt;
+ /// @todo nominally we should just delete the packet here.
+ /// Until 4-phase stuff we can't because the sending
+ /// cache is still relying on it
+ pendingDelete.push_back(pkt);
}
return true;