ruby: RubyPort delete snoop requests
authorJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:25 +0000 (09:28 -0500)
committerJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:25 +0000 (09:28 -0500)
In RubyPort::ruby_eviction_callback, prior changes fixed a memory leak caused
by instantiating separate packets for each port that the eviction was forwarded
to. That change, however, left the instantiated request to also leak. Allocate
it on the stack to avoid the leak.

src/mem/ruby/system/RubyPort.cc

index e03d23774c381b0d6f8f5b2570e7167a37027177..b2fb8d72d8d43df6103502abf57b84eec188a501 100644 (file)
@@ -505,13 +505,14 @@ void
 RubyPort::ruby_eviction_callback(Addr address)
 {
     DPRINTF(RubyPort, "Sending invalidations.\n");
-    // This request is deleted in the stack-allocated packet destructor
-    // when this function exits
+    // Allocate the invalidate request and packet on the stack, as it is
+    // assumed they will not be modified or deleted by receivers.
     // TODO: should this really be using funcMasterId?
-    RequestPtr req = new Request(address, 0, 0, Request::funcMasterId);
+    Request request(address, RubySystem::getBlockSizeBytes(), 0,
+                    Request::funcMasterId);
     // Use a single packet to signal all snooping ports of the invalidation.
     // This assumes that snooping ports do NOT modify the packet/request
-    Packet pkt(req, MemCmd::InvalidateReq);
+    Packet pkt(&request, MemCmd::InvalidateReq);
     for (CpuPortIter p = slave_ports.begin(); p != slave_ports.end(); ++p) {
         // check if the connected master port is snooping
         if ((*p)->isSnooping()) {