[ros-diffs] [janderwald] 49356: [PORTCLS] - Do not leak KSSTREAM_HEADER (48 bytes) for each IOCTL_KS_WRITE_STREAM / IOCTL_KS_READ_STREAM request - Audio stack should now leak less memory

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Oct 30 15:40:55 UTC 2010


Author: janderwald
Date: Sat Oct 30 15:40:54 2010
New Revision: 49356

URL: http://svn.reactos.org/svn/reactos?rev=49356&view=rev
Log:
[PORTCLS]
- Do not leak KSSTREAM_HEADER (48 bytes) for each IOCTL_KS_WRITE_STREAM / IOCTL_KS_READ_STREAM request
- Audio stack should now leak less memory

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp?rev=49356&r1=49355&r2=49356&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1] Sat Oct 30 15:40:54 2010
@@ -293,6 +293,7 @@
 {
     PKSSTREAM_HEADER StreamHeader;
     ULONG Size, NumData, Index;
+    PMDL CurMdl, NextMdl;
 
     if (!m_Irp)
     {
@@ -385,13 +386,50 @@
             return;
         }
 
+        // now free allocated mdls
+        CurMdl = m_Irp->MdlAddress;
+        for(Index = 0; Index < STREAMHEADER_COUNT(m_Irp); Index++)
+        {
+            // sanity check
+            ASSERT(CurMdl);
+
+            // get next mdl
+            NextMdl = CurMdl->Next;
+
+            // check if mdl is locked
+            if (CurMdl->MdlFlags & MDL_PAGES_LOCKED)
+            {
+                // unlock pages
+                MmUnlockPages(CurMdl);
+            }
+
+            // free mdl
+            IoFreeMdl(CurMdl);
+
+            // proceed to next mdl
+            CurMdl = NextMdl;
+        }
+
+        // all mdls have been freed now
+        m_Irp->MdlAddress = NULL;
+
+        // free allocated KSSTREAM_HEADER
+        ExFreePool(m_Irp->AssociatedIrp.SystemBuffer);
+
+        // is this really needed?
+        m_Irp->AssociatedIrp.SystemBuffer = NULL;
+
+        // store operation status
         m_Irp->IoStatus.Status = STATUS_SUCCESS;
         m_Irp->IoStatus.Information = NumData;
 
         // complete the request
         IoCompleteRequest(m_Irp, IO_SOUND_INCREMENT);
+
         // remove irp as it is complete
         m_Irp = NULL;
+
+        // reset offset
         m_CurrentOffset = 0;
     }
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp?rev=49356&r1=49355&r2=49356&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp [iso-8859-1] Sat Oct 30 15:40:54 2010
@@ -251,7 +251,7 @@
     // create the subdevice descriptor
     Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor,
                                          2,
-                                         InterfaceGuids, 
+                                         InterfaceGuids,
                                          0, 
                                          NULL,
                                          2, 




More information about the Ros-diffs mailing list