// RuntimeForStatic base library | C+- (SysRoutine) | Author: Sergei Y.Kitáev
#include "Precompiled.h"
#include "SharedIncludes.h"
namespace RuntimeForStatic {
//==================================================================================================
DWORD $FatalError::_RaiseCallerThreadId_, $FatalError::_TerminationThreadId_;
//==================================================================================================

bool $FatalError::IsInTermination()
{
   return $BOOL( GetTerminationThreadId() );
}
bool $FatalError::IsInTerminationThread()
{
   DWORD terminationThreadId = GetTerminationThreadId();
   return terminationThreadId && terminationThreadId == ::GetCurrentThreadId();
}

DWORD $FatalError::RaiseCallerThreadId($O) $strict_result
{
   return $Checking::VerifyNotZero($ci, GetRaiseCallerThreadId() );
}
DWORD $FatalError::GetRaiseCallerThreadId() $zero_on_failure
{
   return $Interlocked::Read($, &_RaiseCallerThreadId_ );
}

DWORD $FatalError::TerminationThreadId($O) $strict_result
{
   return $Checking::VerifyNotZero($ci, GetTerminationThreadId() );
}
DWORD $FatalError::GetTerminationThreadId() $zero_on_failure
{
   return $Interlocked::Read($, &_TerminationThreadId_ );
}

bool $FatalError::UseDesktopInteraction() $or_true
{
   return $RT::GetAllowDesktopInteraction( true ) || !$RT::WasInitializationAttempt();
}

//--------------------------------------------------------------------------------------------------

$ActionRoutine $FatalError::GetRaiseTrigger() $or_null
{
   auto settingsPtr = $RT::GetFatalErrorSettings();
   return settingsPtr ? settingsPtr->RaiseTrigger : nullptr;
}
$EmergencyCallback $FatalError::GetEmergencyHandler() $or_null
{
   auto settingsPtr = $RT::GetFatalErrorSettings();
   return settingsPtr ? settingsPtr->EmergencyHandler : nullptr;
}
$EmergencyCallback $FatalError::GetEmergencyFinalHandler() $or_null
{
   auto settingsPtr = $RT::GetFatalErrorSettings();
   return settingsPtr ? settingsPtr->EmergencyFinalHandler : nullptr;
}

//==================================================================================================

void $FatalError::TraceExceptionMessage(PCWSTR causePhrase,const std::exception& e)
{
   PWSTR exceptionMessage = HelpersRT::ToUnicodeSZ($$, e.what() );
   if ( exceptionMessage )
      HelpersRT::TraceErrorFmt($$, L"=== %s: ===\r\n%s", causePhrase, exceptionMessage );
   else
      HelpersRT::TraceErrorFmt($$, L"%s.", causePhrase );
   $Memory::Free( exceptionMessage );
}

PCWSTR $FatalError::VerifyFormatAlloc($CI_REF,PCWSTR str) $fatal_error_on_failure
{
   if ( !str )
      Raise($ci, $TEXT(
         L"String formatting error (with concominant memory allocation).",
         L"Ошибка форматирования строки (с сопутствующим выделением памяти)." ));
   return str;
}

//==================================================================================================
} // RuntimeForStatic
