ProducerConsumerBufferComplete

__int64 __fastcall ProducerConsumerBufferComplete(__int64 a1, __int64 a2, int a3, unsigned int a4){
  __int64 v4; 
  unsigned __int64 v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 result; 
  v4 = a4;
  while( _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 24), 1, 0) )
  {
    do
    {
      _mm_pause();
      PopHiberCheckForDebugBreak();
    }
    while( *(_DWORD *)(a1 + 24) );
  }
  v8 = *(_QWORD *)(a2 + 8);
  v9 = a3 - *(_DWORD *)a1;
  v10 = v8 % *(unsigned int *)(a1 + 8);
  v11 = *(_DWORD *)(a1 + 8) + v9;
  if( (unsigned int)v10 <= v9 )
    v11 = v9;
  v12 = v8 + v11 - (unsigned int)v10;
  while( v12 != v8 )
  {
    *(_DWORD *)(a1 + 24) = 0;
    do
    {
      _mm_pause();
      PopHiberCheckForDebugBreak();
    }
    while( v12 != *(_QWORD *)(a2 + 8) );
    while( _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 24), 1, 0) )
    {
      do
      {
        _mm_pause();
        PopHiberCheckForDebugBreak();
      }
      while( *(_DWORD *)(a1 + 24) );
    }
    v8 = *(_QWORD *)(a2 + 8);
  }
  result = v8 + v4;
  *(_QWORD *)(a2 + 8) = v8 + v4;
  *(_DWORD *)(a1 + 24) = 0;
  return result;
}

Referenced by:

PopCountDataAsProduced
PopDecompressHiberBlocks
PopRequestRead
PopRequestWrite