typedef struct _SYNC_CONTEXT {
KDPC Dpc[MAXIMUM_PROCESSORS];
ULONG Sequence;
+ LONG CpuCount;
LONG CompletionCount;
BOOLEAN DisableInterrupts[MAXIMUM_PROCESSORS];
BOOLEAN Exit[MAXIMUM_PROCESSORS];
{
BOOLEAN InterruptsDisabled;
ULONG Cpu;
- LONG CpuCount;
UNREFERENCED_PARAMETER(Dpc);
UNREFERENCED_PARAMETER(Context);
Trace("====> (%u)\n", Cpu);
InterlockedIncrement(&SyncContext.CompletionCount);
- CpuCount = KeNumberProcessors;
-
for (;;) {
ULONG Sequence;
Attempts = 0;
while (SyncContext.Sequence == Sequence &&
- SyncContext.CompletionCount < CpuCount) {
+ SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
Old = SyncContext.CompletionCount;
New = Old - 1;
- if (Old == CpuCount)
+ if (Old == SyncContext.CpuCount)
break;
} while (InterlockedCompareExchange(&SyncContext.CompletionCount, New, Old) != Old);
- if (Old < CpuCount) {
+ if (Old < SyncContext.CpuCount) {
#pragma prefast(suppress:28138) // Use constant rather than variable
KeLowerIrql(DISPATCH_LEVEL);
status = STATUS_UNSUCCESSFUL;
InterlockedIncrement(&SyncContext.CompletionCount);
while (SyncContext.Sequence == Sequence &&
- SyncContext.CompletionCount < CpuCount) {
+ SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
}
)
{
ULONG Cpu;
- LONG CpuCount;
ULONG Index;
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
SyncContext.Sequence++;
SyncContext.CompletionCount = 0;
+ SyncContext.CpuCount = KeQueryActiveProcessorCount(NULL);
- CpuCount = KeNumberProcessors;
-
- for (Index = 0; Index < (ULONG)CpuCount; Index++) {
+ for (Index = 0; Index < (ULONG)SyncContext.CpuCount; Index++) {
PKDPC Dpc = &SyncContext.Dpc[Index];
SyncContext.DisableInterrupts[Index] = FALSE;
InterlockedIncrement(&SyncContext.CompletionCount);
- while (SyncContext.CompletionCount < CpuCount) {
+ while (SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
}
VOID
)
{
- LONG CpuCount;
ULONG Index;
ULONG Attempts;
NTSTATUS status;
SyncContext.Sequence++;
SyncContext.CompletionCount = 0;
- CpuCount = KeNumberProcessors;
-
- for (Index = 0; Index < (ULONG)CpuCount; Index++)
+ for (Index = 0; Index < (ULONG)SyncContext.CpuCount; Index++)
SyncContext.DisableInterrupts[Index] = TRUE;
again:
InterlockedIncrement(&SyncContext.CompletionCount);
Attempts = 0;
- while (SyncContext.CompletionCount < CpuCount) {
+ while (SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
Old = SyncContext.CompletionCount;
New = Old - 1;
- if (Old == CpuCount)
+ if (Old == SyncContext.CpuCount)
break;
} while (InterlockedCompareExchange(&SyncContext.CompletionCount, New, Old) != Old);
- if (Old < CpuCount) {
+ if (Old < SyncContext.CpuCount) {
LogPrintf(LOG_LEVEL_WARNING,
"SYNC: %d < %d\n",
Old,
- CpuCount);
+ SyncContext.CpuCount);
#pragma prefast(suppress:28138) // Use constant rather than variable
KeLowerIrql(DISPATCH_LEVEL);
)
{
KIRQL Irql;
- LONG CpuCount;
ULONG Index;
_enable();
SyncContext.Sequence++;
SyncContext.CompletionCount = 0;
- CpuCount = KeNumberProcessors;
-
- for (Index = 0; Index < (ULONG)CpuCount; Index++)
+ for (Index = 0; Index < (ULONG)SyncContext.CpuCount; Index++)
SyncContext.DisableInterrupts[Index] = FALSE;
InterlockedIncrement(&SyncContext.CompletionCount);
- while (SyncContext.CompletionCount < CpuCount) {
+ while (SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
}
VOID
)
{
- LONG CpuCount;
ULONG Cpu;
ULONG Index;
SyncContext.Sequence++;
SyncContext.CompletionCount = 0;
- CpuCount = KeNumberProcessors;
-
- for (Index = 0; Index < (ULONG)CpuCount; Index++)
+ for (Index = 0; Index < (ULONG)SyncContext.CpuCount; Index++)
SyncContext.Exit[Index] = TRUE;
InterlockedIncrement(&SyncContext.CompletionCount);
- while (SyncContext.CompletionCount < CpuCount) {
+ while (SyncContext.CompletionCount < SyncContext.CpuCount) {
_mm_pause();
KeMemoryBarrier();
}