From cab862ed8bde21920c7a84857417a51316a9c297 Mon Sep 17 00:00:00 2001 From: elasota Date: Mon, 30 Nov 2020 03:18:09 -0500 Subject: [PATCH] Fix exit to shell not working --- GpApp/GpAppInterface.cpp | 3 ++- GpApp/Utilities.cpp | 5 ++--- PortabilityLayer/HostSuspendCallID.h | 2 +- PortabilityLayer/PLSysCalls.cpp | 23 +++++++++++++++++++++++ PortabilityLayer/PLSysCalls.h | 3 +++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/GpApp/GpAppInterface.cpp b/GpApp/GpAppInterface.cpp index abbc2bd..e352cb5 100644 --- a/GpApp/GpAppInterface.cpp +++ b/GpApp/GpAppInterface.cpp @@ -5,6 +5,7 @@ #include "WindowManager.h" #include "PLDrivers.h" +#include "PLSysCalls.h" int gpAppMain(); void gpAppInit(); @@ -30,7 +31,7 @@ void GpAppInterfaceImpl::ApplicationInit() int GpAppInterfaceImpl::ApplicationMain() { - return gpAppMain(); + return PLSysCalls::MainExitWrapper(gpAppMain); } void GpAppInterfaceImpl::PL_IncrementTickCounter(uint32_t count) diff --git a/GpApp/Utilities.cpp b/GpApp/Utilities.cpp index dd5de82..9eb191c 100644 --- a/GpApp/Utilities.cpp +++ b/GpApp/Utilities.cpp @@ -11,6 +11,7 @@ #include "PLPasStr.h" #include "PLResources.h" #include "PLSound.h" +#include "PLSysCalls.h" #include "PLTimeTaggedVOSEvent.h" #include "QDPixMap.h" #include "BitmapImage.h" @@ -114,9 +115,7 @@ void RedAlert (short errorNumber) // CenterAlert(rDeathAlertID); dummyInt = PortabilityLayer::DialogManager::GetInstance()->DisplayAlert(rDeathAlertID, &substitutions); - //ExitToShell(); - - PL_NotYetImplemented_TODO("Exit"); + PLSysCalls::Exit(-1); } //-------------------------------------------------------------- CreateOffScreenBitMap diff --git a/PortabilityLayer/HostSuspendCallID.h b/PortabilityLayer/HostSuspendCallID.h index c524548..e96ddda 100644 --- a/PortabilityLayer/HostSuspendCallID.h +++ b/PortabilityLayer/HostSuspendCallID.h @@ -10,7 +10,7 @@ namespace PortabilityLayer HostSuspendCallID_Delay, HostSuspendCallID_CallOnVOSThread, - HostSuspendCallID_ForceSyncFrame + HostSuspendCallID_ForceSyncFrame, }; } diff --git a/PortabilityLayer/PLSysCalls.cpp b/PortabilityLayer/PLSysCalls.cpp index 7734ae9..274c1e1 100644 --- a/PortabilityLayer/PLSysCalls.cpp +++ b/PortabilityLayer/PLSysCalls.cpp @@ -16,6 +16,9 @@ #include "PLDrivers.h" +#include +#include + static void TranslateMouseInputEvent(const GpVOSEvent &vosEventBase, uint32_t timestamp, PortabilityLayer::EventQueue *queue) { const GpMouseInputEvent &vosEvent = vosEventBase.m_event.m_mouseInputEvent; @@ -198,4 +201,24 @@ namespace PLSysCalls PortabilityLayer::SuspendApplication(PortabilityLayer::HostSuspendCallID_CallOnVOSThread, args, nullptr); } + + static jmp_buf gs_mainExitWrapper; + static int gs_exitCode = 0; + + void Exit(int exitCode) + { + gs_exitCode = exitCode; + longjmp(gs_mainExitWrapper, 1); + } + + int MainExitWrapper(int (*mainFunc)()) + { + if (!setjmp(gs_mainExitWrapper)) + { + int returnCode = mainFunc(); + return returnCode; + } + else + return gs_exitCode; + } } diff --git a/PortabilityLayer/PLSysCalls.h b/PortabilityLayer/PLSysCalls.h index c332bd6..c395c1b 100644 --- a/PortabilityLayer/PLSysCalls.h +++ b/PortabilityLayer/PLSysCalls.h @@ -9,4 +9,7 @@ namespace PLSysCalls void Sleep(uint32_t ticks); void ForceSyncFrame(); void RunOnVOSThread(void(*callback)(void *context), void *context); + void Exit(int exitCode); + + int MainExitWrapper(int (*mainFunc)()); }