1 of 4 commit (sorry my svn clinet is crazy for moment)
authorMagnus Olsen <magnus@greatlord.com>
Mon, 3 Jul 2006 20:23:10 +0000 (20:23 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Mon, 3 Jul 2006 20:23:10 +0000 (20:23 +0000)
Commit w3seek patch from bug 1609 : file attachment (id=910)
The attached patch implements QueueUserWorkItem()/RtlQueueWorkItem() (lacks
optimizations!!!). WINE's latest rpcrt4 relies on it.

1. Implement QueueUserWorkItem()/RtlQueueWorkItem() :
2. A slightly optimized
3. Supports WT_TRANSFER_IMPERSONATION
4. Slightly improved handling of growing/shrinking the pool by assuming work items with WT_EXECUTELONGFUNCTION run longer
5. Fixes a hack that made a worker thread always terminate if there were at least one more thread available

svn path=/trunk/; revision=22804

reactos/ntoskrnl/ps/query.c

index c402b1b..ceef2a0 100644 (file)
@@ -93,7 +93,7 @@ static const struct
     {TRUE, 0},                                 // ThreadIdealProcessor
     {FALSE, 0},                                        // ThreadPriorityBoost
     {TRUE, 0},                                 // ThreadSetTlsArrayAddress
-    {FALSE, 0},                                        // ThreadIsIoPending
+    {TRUE, sizeof(ULONG)},             // ThreadIsIoPending
     {TRUE, 0}                                  // ThreadHideFromDebugger
 };
 
@@ -1191,6 +1191,7 @@ NtQueryInformationThread (IN      HANDLE          ThreadHandle,
       PVOID Address;
       LARGE_INTEGER Count;
       BOOLEAN Last;
+      ULONG IsIoPending;
    }u;
    KPROCESSOR_MODE PreviousMode;
    NTSTATUS Status = STATUS_SUCCESS;
@@ -1292,6 +1293,18 @@ NtQueryInformationThread (IN     HANDLE          ThreadHandle,
             u.Last = FALSE;
           }
          break;
+
+       case ThreadIsIoPending:
+       {
+           KIRQL OldIrql;
+
+           /* Raise the IRQL to protect the IRP list */
+           KeRaiseIrql(APC_LEVEL, &OldIrql);
+           u.IsIoPending = !IsListEmpty(&Thread->IrpList);
+           KeLowerIrql(OldIrql);
+           break;
+       }
+
        default:
         /* Shoult never occure if the data table is correct */
         KEBUGCHECK(0);