From d9f0a8288e0522369928fec76a7d8b70e2b719eb Mon Sep 17 00:00:00 2001 From: Joel Hestness Date: Sun, 6 Feb 2011 22:14:17 -0800 Subject: MessagePort: implement the virtual recvTiming function to avoid double pkt delete Double packet delete problem is due to an interrupt device deleting a packet that the SimpleTimingPort also deletes. Since MessagePort descends from SimpleTimingPort, simply reimplement the failing code from SimpleTimingPort: recvTiming. --- src/arch/x86/interrupts.cc | 2 -- src/dev/x86/intdev.cc | 8 ++++++-- src/dev/x86/intdev.hh | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc index 951392a15..a7d9f3277 100644 --- a/src/arch/x86/interrupts.cc +++ b/src/arch/x86/interrupts.cc @@ -340,8 +340,6 @@ X86ISA::Interrupts::recvResponse(PacketPtr pkt) low.deliveryStatus = 0; regs[APIC_INTERRUPT_COMMAND_LOW] = low; } - delete pkt->req; - delete pkt; DPRINTF(LocalApic, "ICR is now idle.\n"); return 0; } diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc index 5bc6065f5..0d392d5ee 100644 --- a/src/dev/x86/intdev.cc +++ b/src/dev/x86/intdev.cc @@ -37,10 +37,14 @@ X86ISA::IntDev::IntPort::sendMessage(ApicList apics, ApicList::iterator apicIt; for (apicIt = apics.begin(); apicIt != apics.end(); apicIt++) { PacketPtr pkt = buildIntRequest(*apicIt, message); - if (timing) + if (timing) { sendMessageTiming(pkt, latency); - else + // The target handles cleaning up the packet in timing mode. + } else { sendMessageAtomic(pkt); + delete pkt->req; + delete pkt; + } } } diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh index b01d36e37..61e486718 100644 --- a/src/dev/x86/intdev.hh +++ b/src/dev/x86/intdev.hh @@ -138,8 +138,6 @@ class IntDev virtual Tick recvResponse(PacketPtr pkt) { - delete pkt->req; - delete pkt; return 0; } -- cgit v1.2.3