Author: sir_richard
Date: Sat Feb 25 20:40:06 2012
New Revision: 55865

URL: http://svn.reactos.org/svn/reactos?rev=55865&view=rev
Log:
[NTOS]: Implementation of the "Generic DPC" functionality from Windows NT 5.2, 
which is a forced-synchronization all-CPU DPC callback mechanism. Implemented, 
and exported all APIs requireted, and added to NDK. NOTE: This implementation 
only works for Single Processor systems (NT_UP) since this is all that ReactOS 
currently works on.
This is needed for poolmon/querying pool tags.

Modified:
    trunk/reactos/include/ndk/kefuncs.h
    trunk/reactos/ntoskrnl/include/internal/ke.h
    trunk/reactos/ntoskrnl/ke/dpc.c
    trunk/reactos/ntoskrnl/ntoskrnl.spec

Modified: trunk/reactos/include/ndk/kefuncs.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/kefuncs.h?rev=55865&r1=55864&r2=55865&view=diff
==============================================================================
--- trunk/reactos/include/ndk/kefuncs.h [iso-8859-1] (original)
+++ trunk/reactos/include/ndk/kefuncs.h [iso-8859-1] Sat Feb 25 20:40:06 2012
@@ -209,6 +209,28 @@
 );
 
 //
+// Generic DPC Routines
+//
+VOID
+NTAPI
+KeGenericCallDpc(
+    IN PKDEFERRED_ROUTINE Routine,
+    IN PVOID Context
+);
+
+VOID
+NTAPI
+KeSignalCallDpcDone(
+    IN PVOID SystemArgument1
+);
+
+BOOLEAN
+NTAPI
+KeSignalCallDpcSynchronize(
+    IN PVOID SystemArgument2
+);
+
+//
 // ARC Configuration Functions. Only enabled if you have ARC Support
 //
 #ifdef _ARC_

Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/ke.h?rev=55865&r1=55864&r2=55865&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] Sat Feb 25 
20:40:06 2012
@@ -35,6 +35,12 @@
     PKINTERRUPT_ROUTINE ChainedDispatch;
     PKINTERRUPT_ROUTINE *FlatDispatch;
 } DISPATCH_INFO, *PDISPATCH_INFO;
+
+typedef struct _DEFERRED_REVERSE_BARRIER
+{
+    ULONG Barrier;
+    ULONG TotalProcessors;
+} DEFERRED_REVERSE_BARRIER, *PDEFERRED_REVERSE_BARRIER;
 
 typedef struct _KI_SAMPLE_MAP
 {

Modified: trunk/reactos/ntoskrnl/ke/dpc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/dpc.c?rev=55865&r1=55864&r2=55865&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/dpc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/dpc.c [iso-8859-1] Sat Feb 25 20:40:06 2012
@@ -958,4 +958,60 @@
     Dpc->Number = Number + MAXIMUM_PROCESSORS;
 }
 
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeGenericCallDpc(IN PKDEFERRED_ROUTINE Routine,
+                 IN PVOID Context)
+{
+    ULONG Barrier = KeNumberProcessors;
+    KIRQL OldIrql;
+    DEFERRED_REVERSE_BARRIER ReverseBarrier;
+    ASSERT(KeGetCurrentIrql () < DISPATCH_LEVEL);
+
+    //
+    // The barrier is the number of processors, each processor will decrement 
it
+    // by one, so when all processors have run the DPC, the barrier reaches 
zero
+    //
+    ReverseBarrier.Barrier = Barrier;
+    ReverseBarrier.TotalProcessors = Barrier;
+
+    //
+    // But we don't need the barrier on UP, since we can simply call the 
routine
+    // directly while at DISPATCH_LEVEL and not worry about anything else
+    //
+    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+    Routine(&KeGetCurrentPrcb()->CallDpc, Context, &Barrier, &ReverseBarrier);
+    KeLowerIrql(OldIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeSignalCallDpcDone(IN PVOID SystemArgument1)
+{
+    //
+    // Decrement the barrier, which is actually the processor count
+    //
+    InterlockedDecrement((PLONG)SystemArgument1);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+KeSignalCallDpcSynchronize(IN PVOID SystemArgument2)
+{
+    //
+    // There is nothing to do on UP systems -- the processor calling this wins
+    //
+    UNREFERENCED_PARAMETER(SystemArgument2);
+    return TRUE;
+}
+
 /* EOF */

Modified: trunk/reactos/ntoskrnl/ntoskrnl.spec
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.spec?rev=55865&r1=55864&r2=55865&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl.spec [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl.spec [iso-8859-1] Sat Feb 25 20:40:06 2012
@@ -583,7 +583,7 @@
 @ stdcall KeFindConfigurationNextEntry(ptr long long ptr ptr)
 @ stdcall KeFlushEntireTb(long long)
 @ stdcall KeFlushQueuedDpcs()
-;KeGenericCallDpc
+@ stdcall KeGenericCallDpc(ptr ptr)
 @ stdcall KeGetCurrentThread()
 @ stdcall KeGetPreviousMode()
 @ stdcall KeGetRecommendedSharedDataAlignment()
@@ -696,8 +696,8 @@
 @ stdcall KeSetTimeIncrement(long long)
 @ stdcall KeSetTimer(ptr long long ptr)
 @ stdcall KeSetTimerEx(ptr long long long ptr)
-;KeSignalCallDpcDone
-;KeSignalCallDpcSynchronize
+@ stdcall KeSignalCallDpcDone(ptr)
+@ stdcall KeSignalCallDpcSynchronize(ptr)
 @ stdcall KeStackAttachProcess(ptr ptr)
 @ stdcall KeSynchronizeExecution(ptr ptr ptr)
 @ stdcall KeTerminateThread(long)


Reply via email to