Author: janderwald
Date: Sun Apr  5 20:05:54 2009
New Revision: 40373

URL: http://svn.reactos.org/svn/reactos?rev=40373&view=rev
Log:
- Fix leaking of work item for each detected audio device

Modified:
    trunk/reactos/drivers/wdm/audio/sysaudio/deviface.c
    trunk/reactos/drivers/wdm/audio/sysaudio/main.c

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/deviface.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/deviface.c?rev=40373&r1=40372&r2=40373&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/deviface.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/deviface.c [iso-8859-1] Sun Apr  5 
20:05:54 2009
@@ -17,7 +17,7 @@
 NTAPI
 FilterPinWorkerRoutine(
     IN PDEVICE_OBJECT DeviceObject,
-    IN PVOID  Context)
+    IN PVOID Context)
 {
     KSPROPERTY PropertyRequest;
     KSP_PIN PinRequest;
@@ -27,6 +27,7 @@
     ULONG Count, Index;
     NTSTATUS Status;
     ULONG BytesReturned;
+    PSYSAUDIODEVEXT DeviceExtension;
     PKSAUDIO_DEVICE_ENTRY DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)Context;
 
 
@@ -40,17 +41,22 @@
     Status = KsSynchronousIoControlDevice(DeviceEntry->FileObject, KernelMode, 
IOCTL_KS_PROPERTY, (PVOID)&PropertyRequest, sizeof(KSPROPERTY), (PVOID)&Count, 
sizeof(ULONG), &BytesReturned);
     if (!NT_SUCCESS(Status))
     {
+        ExFreePool(DeviceEntry);
         return;
     }
 
     if (!Count)
+    {
+        ExFreePool(DeviceEntry);
         return;
+    }
 
     /* allocate pin array */
     DeviceEntry->Pins = ExAllocatePool(NonPagedPool, Count * sizeof(PIN_INFO));
     if (!DeviceEntry->Pins)
     {
         /* no memory */
+        ExFreePool(DeviceEntry);
         return;
     }
     /* clear array */
@@ -96,6 +102,12 @@
     }
 
     DPRINT1("Num Pins %u Num WaveIn Pins %u Name WaveOut Pins %u\n", 
DeviceEntry->NumberOfPins, DeviceEntry->NumWaveInPin, 
DeviceEntry->NumWaveOutPin);
+
+    DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
+
+    InsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry);
+    DeviceExtension->NumberOfKsAudioDevices++;
+
 }
 
 NTSTATUS
@@ -153,6 +165,7 @@
     DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event;
     NTSTATUS Status = STATUS_SUCCESS;
     PSYSAUDIODEVEXT DeviceExtension;
+    PKSAUDIO_DEVICE_ENTRY DeviceEntry;
     PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context;
 
     DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
@@ -163,10 +176,6 @@
                            &GUID_DEVICE_INTERFACE_ARRIVAL))
     {
         /* a new device has arrived */
-
-        PKSAUDIO_DEVICE_ENTRY DeviceEntry;
-        PIO_WORKITEM WorkItem;
-
         DeviceEntry = ExAllocatePool(NonPagedPool, 
sizeof(KSAUDIO_DEVICE_ENTRY));
         if (!DeviceEntry)
         {
@@ -206,16 +215,11 @@
             return Status;
         }
 
-        DPRINT1("Successfully opened audio device %u handle %p file object %p 
device object %p\n", DeviceExtension->KsAudioDeviceList, DeviceEntry->Handle, 
DeviceEntry->FileObject, DeviceEntry->FileObject->DeviceObject);
-        DeviceExtension->NumberOfKsAudioDevices++;
-
-        WorkItem = IoAllocateWorkItem(DeviceObject);
-        if (WorkItem)
-        {
-            IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, 
DelayedWorkQueue, (PVOID)DeviceEntry);
-        }
-        InsertTailList(&DeviceExtension->KsAudioDeviceList, 
&DeviceEntry->Entry);
-
+        DPRINT1("Successfully opened audio device %u handle %p file object %p 
device object %p\n", DeviceExtension->NumberOfKsAudioDevices, 
DeviceEntry->Handle, DeviceEntry->FileObject, 
DeviceEntry->FileObject->DeviceObject);
+
+        //FIXME
+        // mutal exclusion
+        IoQueueWorkItem(DeviceExtension->WorkItem, FilterPinWorkerRoutine, 
DelayedWorkQueue, (PVOID)DeviceEntry);
         return Status;
     }
     else

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/main.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/main.c?rev=40373&r1=40372&r2=40373&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/main.c [iso-8859-1] Sun Apr  5 
20:05:54 2009
@@ -131,6 +131,22 @@
         goto cleanup;
     }
 
+    /* allocate work item */
+    DeviceExtension->WorkItem = IoAllocateWorkItem(DeviceObject);
+    if (!DeviceExtension->WorkItem)
+    {
+        DPRINT1("Failed to allocate work item\n");
+        goto cleanup;
+    }
+
+    /* allocate work item context */
+    DeviceExtension->WorkerContext = ExAllocatePool(NonPagedPool, 
sizeof(PIN_WORKER_CONTEXT));
+    if (!DeviceExtension->WorkerContext)
+    {
+        DPRINT1("Failed to allocate work item context\n");
+        goto cleanup;
+    }
+
     /* Register device notification hooks */
     Status = SysAudioRegisterNotifications(DriverObject,
                                            DeviceObject);
@@ -139,23 +155,6 @@
         DPRINT1("Failed to register device notifications\n");
         goto cleanup;
     }
-
-    /* allocate work item */
-    DeviceExtension->WorkItem = IoAllocateWorkItem(DeviceObject);
-    if (!DeviceExtension->WorkItem)
-    {
-        DPRINT1("Failed to allocate work item\n");
-        goto cleanup;
-    }
-
-    /* allocate work item context */
-    DeviceExtension->WorkerContext = ExAllocatePool(NonPagedPool, 
sizeof(PIN_WORKER_CONTEXT));
-    if (!DeviceExtension->WorkerContext)
-    {
-        DPRINT1("Failed to allocate work item context\n");
-        goto cleanup;
-    }
-
 
     /* Load kmixer */
     Status = SysAudioOpenKMixer(DeviceExtension);

Reply via email to