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=…
==============================================================================
--- 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/…
==============================================================================
--- 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=5586…
==============================================================================
--- 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…
==============================================================================
--- 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)