HalpMceHandlerWithRendezvous

INT64 __fastcall HalpMceHandlerWithRendezvous(INT64 a1){
  unsigned int ActiveProcessorCount; 
  INT64 result; 
  int v4[10]; 
  ULONG_PTR BugCheckParameter1; 
  HIDWORD(BugCheckParameter1) = 0;
  while( HalpMceRendezvousInProgress )
    _mm_pause();
  ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
  if( _InterlockedIncrement(&HalpMceProcessorCount) == ActiveProcessorCount )
    HalpMceRendezvousInProgress = 1;
  if( HalpMcaRecoverySupported )
  {
    if( HalpMceHandler(a1, 1) )
      HalpMceErrorFound = 1;
    if( _InterlockedIncrement(&HalpMceRendezvousSrarOnlyCount) == 1 )
    {
      if( !HalpMceBarrierWait(&HalpMceRendezvousSrarOnlyCount, ActiveProcessorCount, 5000i64) )
      {
        BugCheckParameter1 = 2147483650i64;
        HalpMcaReportError(0i64, 0i64, 0x80000002ui64);
      }
      _InterlockedAdd(&HalpMceRendezvousSrarOnlyCount, 1u);
    }
    else
    {
      HalpMceBarrierWait(&HalpMceRendezvousSrarOnlyCount, ActiveProcessorCount + 1, 0i64);
    }
  }
  if( HalpMceHandler(a1, 0) )
    HalpMceErrorFound = 1;
  if( _InterlockedIncrement(&HalpMceRendezvousCount) == 1 )
  {
    if( !HalpMceBarrierWait(&HalpMceRendezvousCount, ActiveProcessorCount, 5000i64) || !HalpMceErrorFound )
    {
      LODWORD(BugCheckParameter1) = -2147483647;
      HalpMcaReportError(0i64, 0i64, BugCheckParameter1);
    }
    _InterlockedAdd(&HalpMceRendezvousCount, 1u);
  }
  else
  {
    HalpMceBarrierWait(&HalpMceRendezvousCount, ActiveProcessorCount + 1, 0i64);
  }
  result = (unsigned int)_InterlockedExchangeAdd(&HalpMceProcessorCount, 0xFFFFFFFF);
  if( (_DWORD)result == 1 )
  {
    HalpMceErrorFound = 0;
    HalpMceRendezvousSrarOnlyCount = 0;
    HalpMceRendezvousCount = 0;
    _InterlockedOr(v4, 0);
    HalpMceRendezvousInProgress = 0;
  }
  return result;
}

Referenced by:

HalpHandleMachineCheck