ProducerGetBuffer

UINT64 __fastcall ProducerGetBuffer(INT64 a1, UINT64 a2, UINT64 a3, CHAR a4){
  __int64 v4; 
  __int64 v6; 
  unsigned __int64 v8; 
  UINT64 result; 
  v4 = (unsigned int)a3;
  v6 = (unsigned int)a2;
  while( _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 24), 1, 0) )
  {
    do
    {
      _mm_pause();
      PopHiberCheckForDebugBreak();
    }
    while( *(_DWORD *)(a1 + 24) );
  }
  while( 1 )
  {
    if( (unsigned int)v6 <= *(_DWORD *)(a1 + 56) + *(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 32) )
    {
      v8 = *(_QWORD *)(a1 + 32);
      result = *(_QWORD *)a1 + v8 % *(unsigned int *)(a1 + 8);
      *(_QWORD *)(a1 + 16) -= v4;
      *(_QWORD *)(a1 + 32) = v8 + v6;
      goto LABEL_4;
    }
    if( (a4 & 1) != 0 )
      break;
    *(_DWORD *)(a1 + 24) = 0;
    do
    {
      _mm_pause();
      PopHiberCheckForDebugBreak();
    }
    while( (unsigned int)v6 > *(_DWORD *)(a1 + 8) + *(_DWORD *)(a1 + 56) - *(_DWORD *)(a1 + 32) );
    while( _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 24), 1, 0) )
    {
      do
      {
        _mm_pause();
        PopHiberCheckForDebugBreak();
      }
      while( *(_DWORD *)(a1 + 24) );
    }
  }
  result = 0i64;
LABEL_4:
  *(_DWORD *)(a1 + 24) = 0;
  return result;
}

Referenced by:

PopCountDataAsProduced
PopRequestRead