-reorder InsertXscendingOrder macro argument order and update uses
-start to macrofy list enums in ntoskrnl using LIST_FOR_EACH macros
-use IsListEmpty some places instead of manual coding
-profile.c:KeStartProfile() zero correct buffer in (and not the NULL
ptr;-)
-improve LIST_FOR_EACH macros so that the iterator is set to NULL at end
of enum
-kthread.c:KiServiceCheck() set the shadowtable before calling the
win32k proc/thread init funcs
-apc.c:KiInsertQueueApc() insert special apcs in correct fifo order
-apc.c:KeFlushQueueApc() simplify
-timer.c:KiExpireTimers() calling RemoveEntryList on a possibly empty
list is not ok
Modified: trunk/reactos/include/reactos/helper.h
Modified: trunk/reactos/ntoskrnl/io/device.c
Modified: trunk/reactos/ntoskrnl/io/driver.c
Modified: trunk/reactos/ntoskrnl/io/file.c
Modified: trunk/reactos/ntoskrnl/io/fs.c
Modified: trunk/reactos/ntoskrnl/io/irp.c
Modified: trunk/reactos/ntoskrnl/io/pnpnotify.c
Modified: trunk/reactos/ntoskrnl/io/pnproot.c
Modified: trunk/reactos/ntoskrnl/ke/apc.c
Modified: trunk/reactos/ntoskrnl/ke/bug.c
Modified: trunk/reactos/ntoskrnl/ke/kqueue.c
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
Modified: trunk/reactos/ntoskrnl/ke/profile.c
Modified: trunk/reactos/ntoskrnl/ke/queue.c
Modified: trunk/reactos/ntoskrnl/ke/timer.c
Modified: trunk/reactos/subsys/system/usetup/partlist.c
Modified: trunk/reactos/subsys/win32k/ntuser/class.c
_____
Modified: trunk/reactos/include/reactos/helper.h
--- trunk/reactos/include/reactos/helper.h 2005-09-26 22:06:31 UTC
(rev 18112)
+++ trunk/reactos/include/reactos/helper.h 2005-09-26 22:57:48 UTC
(rev 18113)
@@ -18,17 +18,21 @@
#define EXPORTED __declspec(dllexport)
#define IMPORTED __declspec(dllimport)
-/* iterate through the list using a list entry */
+/* iterate through the list using a list entry.
+ * elem is set to NULL if the list is run thru without breaking out or
if list is empty.
+ */
#define LIST_FOR_EACH(elem, list, type, field) \
for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
- &(elem)->field != (list); \
+ &(elem)->field != (list) || (elem = NULL); \
(elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
-/* iterate through the list using a list entry, with safety against
removal */
+/* iterate through the list using a list entry, with safety against
removal
+ * elem is set to NULL if the list is run thru without breaking out or
if list is empty.
+ */
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
(cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type,
field); \
- &(cursor)->field != (list); \
+ &(cursor)->field != (list) || (cursor = NULL); \
(cursor) = (cursor2), \
(cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type,
field))
@@ -55,7 +59,7 @@
#define HOURS_TO_100NS(hours) (((LONGLONG)(hours)) *
MINUTES_TO_100NS(60))
#define UNICODIZE1(x) L##x
#define UNICODIZE(x) UNICODIZE1(x)
-#define InsertAscendingListFIFO(ListHead, Type, ListEntryField,
NewEntry, SortField)\
+#define InsertAscendingListFIFO(ListHead, NewEntry, Type,
ListEntryField, SortField)\
{\
PLIST_ENTRY current;\
\
@@ -73,7 +77,7 @@
InsertTailList(current, &((NewEntry)->ListEntryField));\
}
-#define InsertDescendingListFIFO(ListHead, Type, ListEntryField,
NewEntry, SortField)\
+#define InsertDescendingListFIFO(ListHead, NewEntry, Type,
ListEntryField, SortField)\
{\
PLIST_ENTRY current;\
\
@@ -91,7 +95,7 @@
InsertTailList(current, &((NewEntry)->ListEntryField));\
}
-#define InsertAscendingList(ListHead, Type, ListEntryField, NewEntry,
SortField)\
+#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField,
SortField)\
{\
PLIST_ENTRY current;\
\
@@ -109,7 +113,7 @@
InsertTailList(current, &((NewEntry)->ListEntryField));\
}
-#define InsertDescendingList(ListHead, Type, ListEntryField, NewEntry,
SortField)\
+#define InsertDescendingList(ListHead, NewEntry, Type, ListEntryField,
SortField)\
{\
PLIST_ENTRY current;\
\
_____
Modified: trunk/reactos/ntoskrnl/io/device.c
--- trunk/reactos/ntoskrnl/io/device.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/device.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -33,17 +33,13 @@
IoShutdownRegisteredDevices(VOID)
{
PSHUTDOWN_ENTRY ShutdownEntry;
- PLIST_ENTRY Entry;
IO_STATUS_BLOCK StatusBlock;
PIRP Irp;
KEVENT Event;
NTSTATUS Status;
- Entry = ShutdownListHead.Flink;
- while (Entry != &ShutdownListHead)
+ LIST_FOR_EACH(ShutdownEntry, &ShutdownListHead, SHUTDOWN_ENTRY,
ShutdownList)
{
- ShutdownEntry = CONTAINING_RECORD(Entry, SHUTDOWN_ENTRY,
ShutdownList);
-
KeInitializeEvent (&Event,
NotificationEvent,
FALSE);
@@ -66,8 +62,6 @@
FALSE,
NULL);
}
-
- Entry = Entry->Flink;
}
}
@@ -1082,27 +1076,24 @@
STDCALL
IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
{
- PSHUTDOWN_ENTRY ShutdownEntry;
- PLIST_ENTRY Entry;
+ PSHUTDOWN_ENTRY ShutdownEntry, tmp;
KIRQL oldlvl;
- Entry = ShutdownListHead.Flink;
- while (Entry != &ShutdownListHead)
+ LIST_FOR_EACH_SAFE(ShutdownEntry, tmp, &ShutdownListHead,
SHUTDOWN_ENTRY, ShutdownList)
{
- ShutdownEntry = CONTAINING_RECORD(Entry, SHUTDOWN_ENTRY,
ShutdownList);
+
if (ShutdownEntry->DeviceObject == DeviceObject)
{
DeviceObject->Flags &= ~DO_SHUTDOWN_REGISTERED;
KeAcquireSpinLock(&ShutdownListLock,&oldlvl);
- RemoveEntryList(Entry);
+ RemoveEntryList(&ShutdownEntry->ShutdownList);
KeReleaseSpinLock(&ShutdownListLock,oldlvl);
- ExFreePool(Entry);
+ ExFreePool(ShutdownEntry);
return;
}
- Entry = Entry->Flink;
}
}
_____
Modified: trunk/reactos/ntoskrnl/io/driver.c
--- trunk/reactos/ntoskrnl/io/driver.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/driver.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -1118,44 +1118,32 @@
NTSTATUS INIT_FUNCTION
IoDestroyDriverList(VOID)
{
- PLIST_ENTRY GroupEntry;
- PLIST_ENTRY ServiceEntry;
- PSERVICE_GROUP CurrentGroup;
- PSERVICE CurrentService;
+ PSERVICE_GROUP CurrentGroup, tmp1;
+ PSERVICE CurrentService, tmp2;
DPRINT("IoDestroyDriverList() called\n");
/* Destroy group list */
- GroupEntry = GroupListHead.Flink;
- while (GroupEntry != &GroupListHead)
+ LIST_FOR_EACH_SAFE(CurrentGroup, tmp1, &GroupListHead, SERVICE_GROUP,
GroupListEntry)
{
- CurrentGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP,
GroupListEntry);
-
ExFreePool(CurrentGroup->GroupName.Buffer);
- RemoveEntryList(GroupEntry);
+ RemoveEntryList(&CurrentGroup->GroupListEntry);
if (CurrentGroup->TagArray)
{
ExFreePool(CurrentGroup->TagArray);
}
ExFreePool(CurrentGroup);
-
- GroupEntry = GroupListHead.Flink;
}
/* Destroy service list */
- ServiceEntry = ServiceListHead.Flink;
- while (ServiceEntry != &ServiceListHead)
+ LIST_FOR_EACH_SAFE(CurrentService, tmp2, &ServiceListHead, SERVICE,
ServiceListEntry)
{
- CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE,
ServiceListEntry);
-
ExFreePool(CurrentService->ServiceName.Buffer);
ExFreePool(CurrentService->RegistryPath.Buffer);
ExFreePool(CurrentService->ServiceGroup.Buffer);
ExFreePool(CurrentService->ImagePath.Buffer);
- RemoveEntryList(ServiceEntry);
+ RemoveEntryList(&CurrentService->ServiceListEntry);
ExFreePool(CurrentService);
-
- ServiceEntry = ServiceListHead.Flink;
}
DPRINT("IoDestroyDriverList() done\n");
@@ -1423,8 +1411,6 @@
VOID FASTCALL
IopInitializeSystemDrivers(VOID)
{
- PLIST_ENTRY GroupEntry;
- PLIST_ENTRY ServiceEntry;
PSERVICE_GROUP CurrentGroup;
PSERVICE CurrentService;
NTSTATUS Status;
@@ -1432,21 +1418,15 @@
DPRINT("IopInitializeSystemDrivers()\n");
- GroupEntry = GroupListHead.Flink;
- while (GroupEntry != &GroupListHead)
+ LIST_FOR_EACH(CurrentGroup, &GroupListHead, SERVICE_GROUP,
GroupListEntry)
{
- CurrentGroup = CONTAINING_RECORD(GroupEntry, SERVICE_GROUP,
GroupListEntry);
-
DPRINT("Group: %wZ\n", &CurrentGroup->GroupName);
/* Load all drivers with a valid tag */
for (i = 0; i < CurrentGroup->TagCount; i++)
{
- ServiceEntry = ServiceListHead.Flink;
- while (ServiceEntry != &ServiceListHead)
+ LIST_FOR_EACH(CurrentService, &ServiceListHead, SERVICE,
ServiceListEntry)
{
- CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE,
ServiceListEntry);
-
if ((RtlCompareUnicodeString(&CurrentGroup->GroupName,
&CurrentService->ServiceGroup,
TRUE) == 0) &&
(CurrentService->Start == 1 /*SERVICE_SYSTEM_START*/) &&
@@ -1455,15 +1435,12 @@
DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath);
Status = IopLoadDriver(CurrentService);
}
- ServiceEntry = ServiceEntry->Flink;
}
}
/* Load all drivers without a tag or with an invalid tag */
- ServiceEntry = ServiceListHead.Flink;
- while (ServiceEntry != &ServiceListHead)
+ LIST_FOR_EACH(CurrentService, &ServiceListHead, SERVICE,
ServiceListEntry)
{
- CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE,
ServiceListEntry);
if ((RtlCompareUnicodeString(&CurrentGroup->GroupName,
&CurrentService->ServiceGroup,
TRUE) == 0) &&
(CurrentService->Start == 1 /*SERVICE_SYSTEM_START*/))
@@ -1481,10 +1458,8 @@
Status = IopLoadDriver(CurrentService);
}
}
- ServiceEntry = ServiceEntry->Flink;
}
- GroupEntry = GroupEntry->Flink;
}
DPRINT("IopInitializeSystemDrivers() done\n");
_____
Modified: trunk/reactos/ntoskrnl/io/file.c
--- trunk/reactos/ntoskrnl/io/file.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/file.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -1383,7 +1383,6 @@
NTSTATUS Status;
PFILE_OBJECT FileObject;
PETHREAD Thread;
- PLIST_ENTRY IrpEntry;
PIRP Irp;
KIRQL OldIrql;
BOOLEAN OurIrpsInList = FALSE;
@@ -1408,11 +1407,9 @@
*/
Thread = PsGetCurrentThread();
- for (IrpEntry = Thread->IrpList.Flink;
- IrpEntry != &Thread->IrpList;
- IrpEntry = IrpEntry->Flink)
+
+ LIST_FOR_EACH(Irp, &Thread->IrpList, IRP, ThreadListEntry)
{
- Irp = CONTAINING_RECORD(IrpEntry, IRP, ThreadListEntry);
if (Irp->Tail.Overlay.OriginalFileObject == FileObject)
{
IoCancelIrp(Irp);
@@ -1440,11 +1437,8 @@
* forever.
*/
- for (IrpEntry = Thread->IrpList.Flink;
- IrpEntry != &Thread->IrpList;
- IrpEntry = IrpEntry->Flink)
+ LIST_FOR_EACH(Irp, &Thread->IrpList, IRP, ThreadListEntry)
{
- Irp = CONTAINING_RECORD(IrpEntry, IRP, ThreadListEntry);
if (Irp->Tail.Overlay.OriginalFileObject == FileObject)
{
OurIrpsInList = TRUE;
_____
Modified: trunk/reactos/ntoskrnl/io/fs.c
--- trunk/reactos/ntoskrnl/io/fs.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/fs.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -72,7 +72,6 @@
VOID
IoShutdownRegisteredFileSystems(VOID)
{
- PLIST_ENTRY current_entry;
FILE_SYSTEM_OBJECT* current;
PIRP Irp;
KEVENT Event;
@@ -87,11 +86,8 @@
NotificationEvent,
FALSE);
- current_entry = FileSystemListHead.Flink;
- while (current_entry!=(&FileSystemListHead))
+ LIST_FOR_EACH(current, &FileSystemListHead, FILE_SYSTEM_OBJECT,Entry)
{
- current =
CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
-
/* send IRP_MJ_SHUTDOWN */
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
current->DeviceObject,
@@ -110,8 +106,6 @@
FALSE,
NULL);
}
-
- current_entry = current_entry->Flink;
}
ExReleaseResourceLite(&FileSystemListLock);
@@ -224,8 +218,7 @@
* RETURNS: Status
*/
{
- PLIST_ENTRY current_entry;
- FILE_SYSTEM_OBJECT* current;
+ PFILE_SYSTEM_OBJECT current;
NTSTATUS Status;
DEVICE_TYPE MatchingDeviceType;
PDEVICE_OBJECT DevObject;
@@ -262,13 +255,12 @@
KeEnterCriticalRegion();
ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
- current_entry = FileSystemListHead.Flink;
- while (current_entry!=(&FileSystemListHead))
+
+restart:
+ LIST_FOR_EACH(current,&FileSystemListHead, FILE_SYSTEM_OBJECT, Entry)
{
- current =
CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
if (current->DeviceObject->DeviceType != MatchingDeviceType)
{
- current_entry = current_entry->Flink;
continue;
}
/* If we are not allowed to mount this volume as a raw filesystem
volume
@@ -294,8 +286,7 @@
return(Status);
}
ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
- current_entry = FileSystemListHead.Flink;
- continue;
+ goto restart;
case STATUS_SUCCESS:
DeviceObject->Vpb->Flags = DeviceObject->Vpb->Flags |
@@ -306,7 +297,8 @@
case STATUS_UNRECOGNIZED_VOLUME:
default:
- current_entry = current_entry->Flink;
+ /* do nothing */
+ break;
}
}
ExReleaseResourceLite(&FileSystemListLock);
@@ -504,28 +496,26 @@
VOID STDCALL
IoUnregisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
{
- PLIST_ENTRY current_entry;
PFILE_SYSTEM_OBJECT current;
DPRINT("IoUnregisterFileSystem(DeviceObject 0x%p)\n", DeviceObject);
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&FileSystemListLock, TRUE);
- current_entry = FileSystemListHead.Flink;
- while (current_entry!=(&FileSystemListHead))
+
+ LIST_FOR_EACH(current,&FileSystemListHead, FILE_SYSTEM_OBJECT,Entry)
{
- current =
CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
if (current->DeviceObject == DeviceObject)
{
- RemoveEntryList(current_entry);
+ RemoveEntryList(¤t->Entry);
ExFreePoolWithTag(current, TAG_FILE_SYSTEM);
ExReleaseResourceLite(&FileSystemListLock);
KeLeaveCriticalRegion();
IopNotifyFileSystemChange(DeviceObject, FALSE);
return;
}
- current_entry = current_entry->Flink;
}
+
ExReleaseResourceLite(&FileSystemListLock);
KeLeaveCriticalRegion();
}
@@ -595,17 +585,11 @@
BOOLEAN DriverActive)
{
PFS_CHANGE_NOTIFY_ENTRY ChangeEntry;
- PLIST_ENTRY Entry;
KeAcquireGuardedMutex(&FsChangeNotifyListLock);
- Entry = FsChangeNotifyListHead.Flink;
- while (Entry != &FsChangeNotifyListHead)
+ LIST_FOR_EACH(ChangeEntry,
&FsChangeNotifyListHead,FS_CHANGE_NOTIFY_ENTRY, FsChangeNotifyList)
{
- ChangeEntry = CONTAINING_RECORD(Entry, FS_CHANGE_NOTIFY_ENTRY,
FsChangeNotifyList);
-
(ChangeEntry->FSDNotificationProc)(DeviceObject, DriverActive);
-
- Entry = Entry->Flink;
}
KeReleaseGuardedMutex(&FsChangeNotifyListLock);
}
@@ -646,24 +630,20 @@
IN PDRIVER_FS_NOTIFICATION
FSDNotificationProc)
{
PFS_CHANGE_NOTIFY_ENTRY ChangeEntry;
- PLIST_ENTRY Entry;
- Entry = FsChangeNotifyListHead.Flink;
- while (Entry != &FsChangeNotifyListHead)
+ LIST_FOR_EACH(ChangeEntry, &FsChangeNotifyListHead,
FS_CHANGE_NOTIFY_ENTRY, FsChangeNotifyList)
{
- ChangeEntry = CONTAINING_RECORD(Entry, FS_CHANGE_NOTIFY_ENTRY,
FsChangeNotifyList);
if (ChangeEntry->DriverObject == DriverObject &&
ChangeEntry->FSDNotificationProc == FSDNotificationProc)
{
KeAcquireGuardedMutex(&FsChangeNotifyListLock);
- RemoveEntryList(Entry);
+ RemoveEntryList(&ChangeEntry->FsChangeNotifyList);
KeReleaseGuardedMutex(&FsChangeNotifyListLock);
- ExFreePoolWithTag(Entry, TAG_FS_CHANGE_NOTIFY);
+ ExFreePoolWithTag(ChangeEntry, TAG_FS_CHANGE_NOTIFY);
return;
}
- Entry = Entry->Flink;
}
}
_____
Modified: trunk/reactos/ntoskrnl/io/irp.c
--- trunk/reactos/ntoskrnl/io/irp.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/irp.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -962,7 +962,6 @@
STDCALL
IoCancelThreadIo(PETHREAD Thread)
{
- PLIST_ENTRY IrpEntry;
PIRP Irp;
KIRQL OldIrql;
ULONG Retries = 3000;
@@ -972,13 +971,8 @@
OldIrql = KfRaiseIrql(APC_LEVEL);
/* Start by cancelling all the IRPs in the current thread queue. */
- for (IrpEntry = Thread->IrpList.Flink;
- IrpEntry != &Thread->IrpList;
- IrpEntry = IrpEntry->Flink)
+ LIST_FOR_EACH(Irp, &Thread->IrpList, IRP, ThreadListEntry)
{
- /* Get the IRP */
- Irp = CONTAINING_RECORD(IrpEntry, IRP, ThreadListEntry);
-
/* Cancel it */
IoCancelIrp(Irp);
}
_____
Modified: trunk/reactos/ntoskrnl/io/pnpnotify.c
--- trunk/reactos/ntoskrnl/io/pnpnotify.c 2005-09-26 22:06:31 UTC
(rev 18112)
+++ trunk/reactos/ntoskrnl/io/pnpnotify.c 2005-09-26 22:57:48 UTC
(rev 18113)
@@ -184,7 +184,6 @@
IN PVOID EventCategoryData2)
{
PPNP_NOTIFY_ENTRY ChangeEntry;
- PLIST_ENTRY Entry;
PVOID NotificationStructure;
BOOLEAN CallCurrentEntry;
@@ -249,10 +248,8 @@
* list to find those that meet some criteria.
*/
- Entry = PnpNotifyListHead.Flink;
- while (Entry != &PnpNotifyListHead)
+ LIST_FOR_EACH(ChangeEntry,&PnpNotifyListHead, PNP_NOTIFY_ENTRY,
PnpNotifyList)
{
- ChangeEntry = CONTAINING_RECORD(Entry, PNP_NOTIFY_ENTRY,
PnpNotifyList);
CallCurrentEntry = FALSE;
switch (EventCategory)
@@ -294,7 +291,6 @@
ChangeEntry->Context);
}
- Entry = Entry->Flink;
}
KeReleaseGuardedMutex(&PnpNotifyListLock);
ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY);
_____
Modified: trunk/reactos/ntoskrnl/io/pnproot.c
--- trunk/reactos/ntoskrnl/io/pnproot.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/io/pnproot.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -766,7 +766,6 @@
PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
PDEVICE_RELATIONS Relations;
- PLIST_ENTRY CurrentEntry;
PPNPROOT_DEVICE Device;
NTSTATUS Status;
ULONG Size;
@@ -796,11 +795,8 @@
Relations->Count = DeviceExtension->DeviceListCount;
i = 0;
- CurrentEntry = DeviceExtension->DeviceListHead.Flink;
- while (CurrentEntry != &DeviceExtension->DeviceListHead)
+ LIST_FOR_EACH(Device,&DeviceExtension->DeviceListHead,PNPROOT_DEVICE,
ListEntry)
{
- Device = CONTAINING_RECORD(CurrentEntry, PNPROOT_DEVICE,
ListEntry);
-
if (!Device->Pdo)
{
/* Create a physical device object for the
@@ -894,8 +890,6 @@
Relations->Objects[i] = Device->Pdo;
i++;
-
- CurrentEntry = CurrentEntry->Flink;
}
if (NT_SUCCESS(Status))
_____
Modified: trunk/reactos/ntoskrnl/ke/apc.c
--- trunk/reactos/ntoskrnl/ke/apc.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/apc.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -254,8 +254,6 @@
KPRIORITY PriorityBoost)
{
PKTHREAD Thread = Apc->Thread;
- PLIST_ENTRY ApcListEntry;
- PKAPC QueuedApc;
KeAcquireSpinLockAtDpcLevel(&Thread->ApcQueueLock);
@@ -282,18 +280,15 @@
DPRINT("Inserting Special APC %x for '%.16s' into the
Queue\n",
Apc, ((PETHREAD)Thread)->ThreadsProcess->ImageFileName);
- for (ApcListEntry =
Thread->ApcStatePointer[(int)Apc->ApcStateIndex]->ApcListHead[(int)Apc->
ApcMode].Flink;
- ApcListEntry !=
&Thread->ApcStatePointer[(int)Apc->ApcStateIndex]->ApcListHead[(int)Apc-
ApcMode];
- ApcListEntry =
ApcListEntry->Flink) {
+ /* insert special apc before normal apcs (if any) but after the
last special apc (fifo) */
+ InsertAscendingListFIFO(
+
&Thread->ApcStatePointer[(int)Apc->ApcStateIndex]->ApcListHead[(int)Apc-
ApcMode],
+ Apc,
+ KAPC,
+ ApcListEntry,
+ NormalRoutine /* sort field */
+ );
- QueuedApc = CONTAINING_RECORD(ApcListEntry, KAPC,
ApcListEntry);
- if (Apc->NormalRoutine != NULL) break;
- }
-
- /* We found the first "Normal" APC, so write right before it */
- ApcListEntry = ApcListEntry->Blink;
- InsertHeadList(ApcListEntry, &Apc->ApcListEntry);
-
} else {
DPRINT("Inserting Normal APC %x for '%.16s' into the %x
Queue\n", Apc, ((PETHREAD)Thread)->ThreadsProcess->ImageFileName,
Apc->ApcMode);
@@ -469,25 +464,23 @@
{
KIRQL OldIrql;
PKAPC Apc;
- PLIST_ENTRY FirstEntry, CurrentEntry;
+ PLIST_ENTRY FirstEntry = NULL;
/* Lock the Dispatcher Database and APC Queue */
OldIrql = KeAcquireDispatcherDatabaseLock();
KeAcquireSpinLockAtDpcLevel(&Thread->ApcQueueLock);
- if (IsListEmpty(&Thread->ApcState.ApcListHead[PreviousMode])) {
- FirstEntry = NULL;
- } else {
+ /* mark all apcs as not-inserted */
+ LIST_FOR_EACH(Apc, &Thread->ApcState.ApcListHead[PreviousMode],
KAPC, ApcListEntry) {
+ Apc->Inserted = FALSE;
+ }
+
+ if (!IsListEmpty(&Thread->ApcState.ApcListHead[PreviousMode])) {
FirstEntry = Thread->ApcState.ApcListHead[PreviousMode].Flink;
+ /* unlink list head from the rest of the list */
RemoveEntryList(&Thread->ApcState.ApcListHead[PreviousMode]);
- CurrentEntry = FirstEntry;
- do {
- Apc = CONTAINING_RECORD(CurrentEntry, KAPC, ApcListEntry);
- Apc->Inserted = FALSE;
- CurrentEntry = CurrentEntry->Flink;
- } while (CurrentEntry != FirstEntry);
}
-
+
/* Release the locks */
KeReleaseSpinLockFromDpcLevel(&Thread->ApcQueueLock);
KeReleaseDispatcherDatabaseLock(OldIrql);
_____
Modified: trunk/reactos/ntoskrnl/ke/bug.c
--- trunk/reactos/ntoskrnl/ke/bug.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/bug.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -252,7 +252,6 @@
{
PKBUGCHECK_CALLBACK_RECORD CurrentRecord;
PLIST_ENTRY ListHead;
- PLIST_ENTRY NextEntry;
/* FIXME: Check Checksum and add support for WithReason Callbacks
*/
@@ -261,14 +260,8 @@
if (ListHead->Flink && ListHead->Blink) {
/* Loop the list */
- NextEntry = ListHead->Flink;
- while (NextEntry != ListHead) {
-
- /* Get the Callback Record */
- CurrentRecord = CONTAINING_RECORD(NextEntry,
-
KBUGCHECK_CALLBACK_RECORD,
- Entry);
-
+ LIST_FOR_EACH(CurrentRecord, ListHead,
KBUGCHECK_CALLBACK_RECORD, Entry)
+ {
/* Make sure it's inserted */
if (CurrentRecord->State == BufferInserted) {
@@ -278,9 +271,6 @@
CurrentRecord->Length);
CurrentRecord->State = BufferFinished;
}
-
- /* Move to next Entry */
- NextEntry = NextEntry->Flink;
}
}
}
@@ -297,7 +287,6 @@
KIRQL OldIrql;
BOOLEAN GotExtendedCrashInfo = FALSE;
PVOID Address = 0;
- PLIST_ENTRY CurrentEntry;
PLDR_DATA_TABLE_ENTRY CurrentModule = NULL;
extern LIST_ENTRY ModuleListHead;
#if 0
@@ -322,14 +311,8 @@
Address = (PVOID)Tf->Eip;
/* Try to get information on the module */
- CurrentEntry = ModuleListHead.Flink;
- while (CurrentEntry != &ModuleListHead)
+ LIST_FOR_EACH(CurrentModule, &ModuleListHead,
LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList)
{
- /* Get the current Section */
- CurrentModule = CONTAINING_RECORD(CurrentEntry,
- LDR_DATA_TABLE_ENTRY,
- InLoadOrderModuleList);
-
/* Check if this is the right one */
if ((Address != NULL && (Address >=
(PVOID)CurrentModule->DllBase &&
Address < (PVOID)((ULONG_PTR)CurrentModule->DllBase +
CurrentModule->SizeOfImage))))
@@ -338,9 +321,6 @@
GotExtendedCrashInfo = TRUE;
break;
}
-
- /* Loop again */
- CurrentEntry = CurrentEntry->Flink;
}
}
_____
Modified: trunk/reactos/ntoskrnl/ke/kqueue.c
--- trunk/reactos/ntoskrnl/ke/kqueue.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/kqueue.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -118,9 +118,9 @@
/* Insert new entry after the last entry with SortKey less or
equal to passed-in SortKey */
InsertAscendingListFIFO(&DeviceQueue->DeviceListHead,
+ DeviceQueueEntry,
KDEVICE_QUEUE_ENTRY,
DeviceListEntry,
- DeviceQueueEntry,
SortKey);
Inserted = TRUE;
}
@@ -204,35 +204,26 @@
} else {
/* Find entry with SortKey greater than or equal to the
passed-in SortKey */
- ListEntry = DeviceQueue->DeviceListHead.Flink;
- while (ListEntry != &DeviceQueue->DeviceListHead) {
-
- /* Get Entry */
- ReturnEntry = CONTAINING_RECORD(ListEntry,
- KDEVICE_QUEUE_ENTRY,
- DeviceListEntry);
-
+ LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead,
KDEVICE_QUEUE_ENTRY, DeviceListEntry)
+ {
/* Check if keys match */
- if (ReturnEntry->SortKey >= SortKey) break;
-
- /* Move to next item */
- ListEntry = ListEntry->Flink;
+ if (ReturnEntry->SortKey >= SortKey) {
+ /* We found it, so just remove it */
+ RemoveEntryList(&ReturnEntry->DeviceListEntry);
+ break;
+ }
}
/* Check if we found something */
- if (ListEntry == &DeviceQueue->DeviceListHead) {
+ if (!ReturnEntry) {
/* Not found, return the first entry */
ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead);
ReturnEntry = CONTAINING_RECORD(ListEntry,
KDEVICE_QUEUE_ENTRY,
DeviceListEntry);
- } else {
+ }
- /* We found it, so just remove it */
- RemoveEntryList(&ReturnEntry->DeviceListEntry);
- }
-
/* Set it as non-inserted */
ReturnEntry->Inserted = FALSE;
}
_____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
--- trunk/reactos/ntoskrnl/ke/kthread.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/kthread.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -76,7 +76,6 @@
KiScanThreadList(KPRIORITY Priority,
KAFFINITY Affinity)
{
- PLIST_ENTRY current_entry;
PKTHREAD current;
ULONG Mask;
@@ -84,12 +83,8 @@
if (PriorityListMask & Mask) {
- current_entry = PriorityListHead[Priority].Flink;
+ LIST_FOR_EACH(current, &PriorityListHead[Priority], KTHREAD,
WaitListEntry) {
- while (current_entry != &PriorityListHead[Priority]) {
-
- current = CONTAINING_RECORD(current_entry, KTHREAD,
WaitListEntry);
-
if (current->State != Ready) {
DPRINT1("%d/%d\n", ¤t, current->State);
@@ -102,8 +97,6 @@
KiRemoveFromThreadList(current);
return(current);
}
-
- current_entry = current_entry->Flink;
}
}
@@ -548,7 +541,6 @@
KeFreezeAllThreads(PKPROCESS Process)
{
KIRQL OldIrql;
- PLIST_ENTRY CurrentEntry;
PKTHREAD Current;
PKTHREAD CurrentThread = KeGetCurrentThread();
@@ -556,12 +548,8 @@
OldIrql = KeAcquireDispatcherDatabaseLock();
/* Loop the Process's Threads */
- CurrentEntry = Process->ThreadListHead.Flink;
- while (CurrentEntry != &Process->ThreadListHead)
+ LIST_FOR_EACH(Current, &Process->ThreadListHead, KTHREAD,
ThreadListEntry)
{
- /* Get the Thread */
- Current = CONTAINING_RECORD(CurrentEntry, KTHREAD,
ThreadListEntry);
-
/* Make sure it's not ours */
if (Current == CurrentThread) continue;
@@ -575,8 +563,6 @@
Current->SuspendSemaphore.Header.SignalState--;
}
}
-
- CurrentEntry = CurrentEntry->Flink;
}
/* Release the lock */
@@ -1456,8 +1442,8 @@
if (Thread->ServiceTable != KeServiceDescriptorTableShadow) {
/* We do. Initialize it and save the new table */
- PsInitWin32Thread((PETHREAD)Thread);
Thread->ServiceTable = KeServiceDescriptorTableShadow;
+ PsInitWin32Thread((PETHREAD)Thread);
}
}
_____
Modified: trunk/reactos/ntoskrnl/ke/profile.c
--- trunk/reactos/ntoskrnl/ke/profile.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/profile.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -53,17 +53,15 @@
{
KIRQL OldIrql;
PKPROFILE_SOURCE_OBJECT SourceBuffer;
- PKPROFILE_SOURCE_OBJECT Source = NULL;
PKPROFILE_SOURCE_OBJECT CurrentSource;
BOOLEAN FreeBuffer = TRUE;
PKPROCESS ProfileProcess;
- PLIST_ENTRY ListEntry;
/* Allocate a buffer first, before we raise IRQL */
SourceBuffer = ExAllocatePoolWithTag(NonPagedPool,
sizeof(KPROFILE_SOURCE_OBJECT),
TAG('P', 'r', 'o',
'f'));
- RtlZeroMemory(Source, sizeof(KPROFILE_SOURCE_OBJECT));
+ RtlZeroMemory(SourceBuffer, sizeof(KPROFILE_SOURCE_OBJECT));
/* Raise to PROFILE_LEVEL */
KeRaiseIrql(PROFILE_LEVEL, &OldIrql);
@@ -90,32 +88,23 @@
}
/* Check if this type of profile (source) is already running */
- for (ListEntry = KiProfileSourceListHead.Flink;
- ListEntry != &KiProfileSourceListHead;
- ListEntry = ListEntry->Flink) {
-
- /* Get the Source Object */
- CurrentSource = CONTAINING_RECORD(ListEntry,
- KPROFILE_SOURCE_OBJECT,
- ListEntry);
-
+ LIST_FOR_EACH(CurrentSource, &KiProfileSourceListHead,
KPROFILE_SOURCE_OBJECT, ListEntry)
+ {
/* Check if it's the same as the one being requested now */
if (CurrentSource->Source == Profile->Source) {
-
- Source = CurrentSource;
break;
}
}
/* See if the loop found something */
- if (!Source) {
+ if (!CurrentSource) {
/* Nothing found, use our allocated buffer */
- Source = SourceBuffer;
+ CurrentSource = SourceBuffer;
/* Set up the Source Object */
- Source->Source = Profile->Source;
- InsertHeadList(&KiProfileSourceListHead,
&Source->ListEntry);
+ CurrentSource->Source = Profile->Source;
+ InsertHeadList(&KiProfileSourceListHead,
&CurrentSource->ListEntry);
/* Don't free the pool later on */
FreeBuffer = FALSE;
@@ -138,7 +127,6 @@
KeStopProfile(PKPROFILE Profile)
{
KIRQL OldIrql;
- PLIST_ENTRY ListEntry;
PKPROFILE_SOURCE_OBJECT CurrentSource = NULL;
/* Raise to PROFILE_LEVEL and acquire spinlock */
@@ -153,18 +141,15 @@
Profile->Active = FALSE;
/* Find the Source Object */
- for (ListEntry = KiProfileSourceListHead.Flink;
- CurrentSource->Source != Profile->Source;
- ListEntry = ListEntry->Flink) {
-
- /* Get the Source Object */
- CurrentSource = CONTAINING_RECORD(ListEntry,
- KPROFILE_SOURCE_OBJECT,
- ListEntry);
+ LIST_FOR_EACH(CurrentSource, &KiProfileSourceListHead,
KPROFILE_SOURCE_OBJECT, ListEntry)
+ {
+ if (CurrentSource->Source == Profile->Source) {
+ /* Remove it */
+ RemoveEntryList(&CurrentSource->ListEntry);
+ break;
+ }
}
- /* Remove it */
- RemoveEntryList(&CurrentSource->ListEntry);
}
/* Lower IRQL */
@@ -240,14 +225,10 @@
{
PULONG BucketValue;
PKPROFILE Profile;
- PLIST_ENTRY NextEntry;
/* Loop the List */
- for (NextEntry = ListHead->Flink; NextEntry != ListHead; NextEntry
= NextEntry->Flink) {
-
- /* Get the Current Profile in the List */
- Profile = CONTAINING_RECORD(NextEntry, KPROFILE, ListEntry);
-
+ LIST_FOR_EACH(Profile, ListHead, KPROFILE, ListEntry)
+ {
/* Check if the source is good, and if it's within the range */
if ((Profile->Source != Source) ||
(TrapFrame->Eip < (ULONG_PTR)Profile->RegionStart) ||
_____
Modified: trunk/reactos/ntoskrnl/ke/queue.c
--- trunk/reactos/ntoskrnl/ke/queue.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/queue.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -182,17 +182,14 @@
/* Loop until the queue is processed */
while (TRUE) {
- /* Get the Entry */
- ListEntry = Queue->EntryListHead.Flink;
-
/* Check if the counts are valid and if there is still a queued
entry */
if ((Queue->CurrentCount < Queue->MaximumCount) &&
- (ListEntry != &Queue->EntryListHead)) {
+ !IsListEmpty(&Queue->EntryListHead)) {
/* Remove the Entry and Save it */
DPRINT("Removing Queue Entry. CurrentCount: %d, Maximum
Count: %d\n",
Queue->CurrentCount, Queue->MaximumCount);
- ListEntry = RemoveHeadList(&Queue->EntryListHead);
+ ListEntry = Queue->EntryListHead.Flink;
/* Decrease the number of entries */
Queue->Header.SignalState--;
@@ -328,7 +325,7 @@
KeRundownQueue(IN PKQUEUE Queue)
{
PLIST_ENTRY EnumEntry;
- PLIST_ENTRY FirstEntry;
+ PLIST_ENTRY FirstEntry = NULL;
PKTHREAD Thread;
KIRQL OldIrql;
@@ -337,19 +334,11 @@
/* Get the Dispatcher Lock */
OldIrql = KeAcquireDispatcherDatabaseLock();
- /* Get the First Empty Entry */
- FirstEntry = Queue->EntryListHead.Flink;
-
/* Make sure the list is not empty */
- if (FirstEntry == &Queue->EntryListHead) {
-
- /* It is, so don't return anything */
- FirstEntry = NULL;
-
- } else {
-
+ if (!IsListEmpty(&Queue->EntryListHead))
+ {
/* Remove it */
- RemoveEntryList(&Queue->EntryListHead);
+ FirstEntry = RemoveHeadList(&Queue->EntryListHead);
}
/* Unlink threads and clear their Thread->Queue */
_____
Modified: trunk/reactos/ntoskrnl/ke/timer.c
--- trunk/reactos/ntoskrnl/ke/timer.c 2005-09-26 22:06:31 UTC (rev
18112)
+++ trunk/reactos/ntoskrnl/ke/timer.c 2005-09-26 22:57:48 UTC (rev
18113)
@@ -217,7 +217,7 @@
PVOID SystemArgument1,
PVOID SystemArgument2)
[truncated at 1000 lines; 128 more skipped]