@@ -596,54 +596,61 @@ static LONG WINAPI ExceptionHandler(EXCE
CrashLog::AfterCrashLogCleanup();
return EXCEPTION_EXECUTE_HANDLER;
}
static void CDECL CustomAbort(int signal)
{
RaiseException(0xE1212012, 0, 0, nullptr);
}
/* static */ void CrashLog::InitialiseCrashLog()
{
CrashLog::InitThread();
/* SIGABRT is not an unhandled exception, so we need to intercept it. */
signal(SIGABRT, CustomAbort);
#if defined(_MSC_VER)
/* Don't show abort message as we will get the crashlog window anyway. */
_set_abort_behavior(0, _WRITE_ABORT_MSG);
#endif
SetUnhandledExceptionFilter(ExceptionHandler);
}
/* static */ void CrashLog::InitThread()
{
#if defined(_M_AMD64) || defined(_M_ARM64)
CONTEXT ctx;
RtlCaptureContext(&ctx);
/* The stack pointer for AMD64 must always be 16-byte aligned inside a
* function. As we are simulating a function call with the safe ESP value,
* we need to subtract 8 for the imaginary return address otherwise stack
* alignment would be wrong in the called function. */
#if defined(_M_ARM64)
#if defined(_M_ARM64)
_safe_esp = (void *)(ctx.Sp - 8);
#else
#else
_safe_esp = (void *)(ctx.Rsp - 8);
#endif
#else
#if defined(_MSC_VER)
_asm {
mov _safe_esp, esp
}
#endif
#else
asm("movl %esp, __safe_esp");
#endif
void *safe_esp;
#if defined(_MSC_VER)
_asm {
mov safe_esp, esp
}
#else
asm("movl %esp, _safe_esp");
#endif
_safe_esp = safe_esp;
#endif
/* SIGABRT is not an unhandled exception, so we need to intercept it. */
signal(SIGABRT, CustomAbort);
#if defined(_MSC_VER)
/* Don't show abort message as we will get the crashlog window anyway. */
_set_abort_behavior(0, _WRITE_ABORT_MSG);
#endif
SetUnhandledExceptionFilter(ExceptionHandler);
}
/* The crash log GUI */
static bool _expanded;
static const wchar_t _crash_desc[] =
L"A serious fault condition occurred in the game. The game will shut down.\n"
L"Please send the crash information and the crash.dmp file (if any) to the developers.\n"
L"This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues. "
L"The information contained in the report is displayed below.\n"
L"Press \"Emergency save\" to attempt saving the game. Generated file(s):\n"
src/thread.h
➞
Show inline comments
@@ -2,24 +2,25 @@
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file thread.h Base of all threads. */
#ifndef THREAD_H
#define THREAD_H
#include "debug.h"
#include "crashlog.h"
#include <system_error>
#include <thread>
/**
* Sleep on the current thread for a defined time.
* @param milliseconds Time to sleep for in milliseconds.