ASSERT(WaitBlock.Count == 0);
}
-/* FIXME: STUBS **************************************************************/
-
/*
* @implemented NT5.2
*/
{
PEX_RUNDOWN_REF RunRef;
- RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber());
return _ExAcquireRundownProtection(RunRef);
}
{
PEX_RUNDOWN_REF RunRef;
- RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber());
return ExfAcquireRundownProtectionEx(RunRef, Count);
}
{
PEX_RUNDOWN_REF RunRef;
- RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware);
- return _ExReleaseRundownProtection(RunRef);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber());
+ _ExReleaseRundownProtection(RunRef);
}
/*
{
PEX_RUNDOWN_REF RunRef;
- RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware);
- return ExfReleaseRundownProtectionEx(RunRef, Count);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber());
+ ExfReleaseRundownProtectionEx(RunRef, Count);
}
/*
for (Current = 0; Current < ProcCount; ++Current)
{
/* Get the runref for the proc */
- RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs +
- RunRefCacheAware->RunRefSize *
- (Current % RunRefCacheAware->Number));
-
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Current);
/* Loop for setting the wait block */
do
{
}
/*
- * @unimplemented NT5.2
+ * @implemented NT5.2
*/
VOID
FASTCALL
ExfRundownCompletedCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware)
{
- DBG_UNREFERENCED_PARAMETER(RunRefCacheAware);
- UNIMPLEMENTED;
+ PEX_RUNDOWN_REF RunRef;
+ ULONG ProcCount, Current;
+
+ ProcCount = RunRefCacheAware->Number;
+ /* No proc, nothing to do */
+ if (ProcCount == 0)
+ {
+ return;
+ }
+
+ /* We will mark all our runrefs active */
+ for (Current = 0; Current < ProcCount; ++Current)
+ {
+ /* Get the runref for the proc */
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Current);
+ ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0);
+
+ ExpSetRundown(RunRef, EX_RUNDOWN_ACTIVE);
+ }
}
/*
- * @unimplemented NT5.2
+ * @implemented NT5.2
*/
VOID
FASTCALL
ExfReInitializeRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware)
{
- DBG_UNREFERENCED_PARAMETER(RunRefCacheAware);
- UNIMPLEMENTED;
+ PEX_RUNDOWN_REF RunRef;
+ ULONG ProcCount, Current;
+
+ ProcCount = RunRefCacheAware->Number;
+ /* No proc, nothing to do */
+ if (ProcCount == 0)
+ {
+ return;
+ }
+
+ /* We will mark all our runrefs inactive */
+ for (Current = 0; Current < ProcCount; ++Current)
+ {
+ /* Get the runref for the proc */
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Current);
+ ASSERT((RunRef->Count & EX_RUNDOWN_ACTIVE) != 0);
+
+ ExpSetRundown(RunRef, 0);
+ }
}
/*
{
PEX_RUNDOWN_REF RunRef;
PVOID PoolToFree, RunRefs;
- ULONG RunRefSize, Count, Offset, Align;
+ ULONG RunRefSize, Count, Align;
PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware;
PAGED_CODE();
{
for (Count = 0; Count < RunRefCacheAware->Number; ++Count)
{
- Offset = RunRefCacheAware->RunRefSize * Count;
- RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + Offset);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Count);
_ExInitializeRundownProtection(RunRef);
}
}
{
PVOID Pool;
PEX_RUNDOWN_REF RunRef;
- ULONG Count, RunRefSize, Offset, Align;
+ ULONG Count, RunRefSize, Align;
PAGED_CODE();
{
for (Count = 0; Count < RunRefCacheAware->Number; ++Count)
{
- Offset = RunRefCacheAware->RunRefSize * Count;
- RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + Offset);
+ RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Count);
_ExInitializeRundownProtection(RunRef);
}
}