- Fix leaking of work item for each detected audio device

svn path=/trunk/; revision=40373
This commit is contained in:
Johannes Anderwald 2009-04-05 16:05:54 +00:00
parent b9a7dffffa
commit d8ae8a179f
2 changed files with 26 additions and 23 deletions

View file

@ -17,7 +17,7 @@ VOID
NTAPI
FilterPinWorkerRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context)
IN PVOID Context)
{
KSPROPERTY PropertyRequest;
KSP_PIN PinRequest;
@ -27,6 +27,7 @@ FilterPinWorkerRoutine(
ULONG Count, Index;
NTSTATUS Status;
ULONG BytesReturned;
PSYSAUDIODEVEXT DeviceExtension;
PKSAUDIO_DEVICE_ENTRY DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)Context;
@ -40,17 +41,22 @@ FilterPinWorkerRoutine(
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 @@ FilterPinWorkerRoutine(
}
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 @@ DeviceInterfaceChangeCallback(
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 @@ DeviceInterfaceChangeCallback(
&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 @@ DeviceInterfaceChangeCallback(
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

View file

@ -131,15 +131,6 @@ SysAudio_InstallDevice(
goto cleanup;
}
/* Register device notification hooks */
Status = SysAudioRegisterNotifications(DriverObject,
DeviceObject);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to register device notifications\n");
goto cleanup;
}
/* allocate work item */
DeviceExtension->WorkItem = IoAllocateWorkItem(DeviceObject);
if (!DeviceExtension->WorkItem)
@ -156,6 +147,14 @@ SysAudio_InstallDevice(
goto cleanup;
}
/* Register device notification hooks */
Status = SysAudioRegisterNotifications(DriverObject,
DeviceObject);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to register device notifications\n");
goto cleanup;
}
/* Load kmixer */
Status = SysAudioOpenKMixer(DeviceExtension);