Author: fireball Date: Sun Mar 25 17:23:30 2007 New Revision: 26165
URL: http://svn.reactos.org/svn/reactos?rev=26165&view=rev Log: - Fix (and optimize) KeRemoveByKeyDeviceQueue() routine. - Add DPRINTs for easier testing/debugging.
Modified: trunk/reactos/ntoskrnl/ke/devqueue.c
Modified: trunk/reactos/ntoskrnl/ke/devqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/devqueue.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ke/devqueue.c (original) +++ trunk/reactos/ntoskrnl/ke/devqueue.c Sun Mar 25 17:23:30 2007 @@ -45,6 +45,8 @@ BOOLEAN Inserted; ASSERT_DEVICE_QUEUE(DeviceQueue);
+ DPRINT("KeInsertDeviceQueue() DevQueue %p, Entry %p\n", DeviceQueue, DeviceQueueEntry); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock);
@@ -85,6 +87,8 @@ KLOCK_QUEUE_HANDLE DeviceLock; BOOLEAN Inserted; ASSERT_DEVICE_QUEUE(DeviceQueue); + + DPRINT("KeInsertByKeyDeviceQueue() DevQueue %p, Entry %p, SortKey 0x%x\n", DeviceQueue, DeviceQueueEntry, SortKey);
/* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); @@ -129,6 +133,8 @@ KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue);
+ DPRINT("KeRemoveDeviceQueue() DevQueue %p\n", DeviceQueue); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); ASSERT(DeviceQueue->Busy); @@ -172,12 +178,92 @@ KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue);
+ DPRINT("KeRemoveByKeyDeviceQueue() DevQueue %p, SortKey 0x%x\n", DeviceQueue, SortKey); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); ASSERT(DeviceQueue->Busy);
/* Check if this is an empty queue */ if (IsListEmpty(&DeviceQueue->DeviceListHead)) + { + /* Set it to idle and return nothing*/ + DeviceQueue->Busy = FALSE; + ReturnEntry = NULL; + } + else + { + /* If SortKey is greater than the last key, then return the first entry right away */ + ListEntry = &DeviceQueue->DeviceListHead; + ReturnEntry = CONTAINING_RECORD(ListEntry->Blink, + KDEVICE_QUEUE_ENTRY, + DeviceListEntry); + + if (SortKey >= ReturnEntry->SortKey) + { + ReturnEntry = CONTAINING_RECORD(ListEntry->Flink, + KDEVICE_QUEUE_ENTRY, + DeviceListEntry); + + /* Remove it from the list */ + RemoveEntryList(&ReturnEntry->DeviceListEntry); + } + else + { + /* Find entry with SortKey greater than or equal to the passed-in SortKey */ + LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead, KDEVICE_QUEUE_ENTRY, DeviceListEntry) + { + /* Check if keys match */ + if (ReturnEntry->SortKey >= SortKey) + { + /* We found it, so just remove it */ + RemoveEntryList(&ReturnEntry->DeviceListEntry); + break; + } + } + + /* Check if we found something */ + if (!ReturnEntry) + { + /* Not found, return the first entry */ + ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead); + ReturnEntry = CONTAINING_RECORD(ListEntry, + KDEVICE_QUEUE_ENTRY, + DeviceListEntry); + } + } + + /* Set it as non-inserted */ + ReturnEntry->Inserted = FALSE; + } + + /* Release the lock */ + KiReleaseDeviceQueueLock(&DeviceLock); + + /* Return the entry */ + return ReturnEntry; +} + +/* + * @implemented + */ +PKDEVICE_QUEUE_ENTRY +NTAPI +KeRemoveByKeyDeviceQueueIfBusy(IN PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey) +{ + PLIST_ENTRY ListEntry; + PKDEVICE_QUEUE_ENTRY ReturnEntry; + KLOCK_QUEUE_HANDLE DeviceLock; + ASSERT_DEVICE_QUEUE(DeviceQueue); + + DPRINT("KeRemoveByKeyDeviceQueueIfBusy() DevQueue %p, SortKey 0x%x\n", DeviceQueue, SortKey); + + /* Lock the queue */ + KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); + + /* Check if this is an empty or idle queue */ + if (!(DeviceQueue->Busy) || (IsListEmpty(&DeviceQueue->DeviceListHead))) { /* Set it to idle and return nothing*/ DeviceQueue->Busy = FALSE; @@ -221,64 +307,6 @@ /* * @implemented */ -PKDEVICE_QUEUE_ENTRY -NTAPI -KeRemoveByKeyDeviceQueueIfBusy(IN PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey) -{ - PLIST_ENTRY ListEntry; - PKDEVICE_QUEUE_ENTRY ReturnEntry; - KLOCK_QUEUE_HANDLE DeviceLock; - ASSERT_DEVICE_QUEUE(DeviceQueue); - - /* Lock the queue */ - KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); - - /* Check if this is an empty or idle queue */ - if (!(DeviceQueue->Busy) || (IsListEmpty(&DeviceQueue->DeviceListHead))) - { - /* Set it to idle and return nothing*/ - DeviceQueue->Busy = FALSE; - ReturnEntry = NULL; - } - else - { - /* Find entry with SortKey greater than or equal to the passed-in SortKey */ - LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead, KDEVICE_QUEUE_ENTRY, DeviceListEntry) - { - /* Check if keys match */ - if (ReturnEntry->SortKey >= SortKey) - { - /* We found it, so just remove it */ - RemoveEntryList(&ReturnEntry->DeviceListEntry); - break; - } - } - - /* Check if we found something */ - if (!ReturnEntry) - { - /* Not found, return the first entry */ - ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead); - ReturnEntry = CONTAINING_RECORD(ListEntry, - KDEVICE_QUEUE_ENTRY, - DeviceListEntry); - } - - /* Set it as non-inserted */ - ReturnEntry->Inserted = FALSE; - } - - /* Release the lock */ - KiReleaseDeviceQueueLock(&DeviceLock); - - /* Return the entry */ - return ReturnEntry; -} - -/* - * @implemented - */ BOOLEAN NTAPI KeRemoveEntryDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, @@ -287,6 +315,8 @@ BOOLEAN OldState; KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue); + + DPRINT("KeRemoveEntryDeviceQueue() DevQueue %p, Entry %p\n", DeviceQueue, DeviceQueueEntry);
/* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock);