From 4e2b200a91c8ed4d5e06fcf27c084e463be4343d Mon Sep 17 00:00:00 2001 From: SamG-Coder <13449963+SamG-Coder@users.noreply.github.com> Date: Tue, 29 Sep 2026 06:36:22 +1000 Subject: [PATCH] fix(libc): invoke guest exit callbacks with the SysV ABI --- core/libs/prx/libc/src/Process.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/core/libs/prx/libc/src/Process.cpp b/core/libs/prx/libc/src/Process.cpp index 98f0d2636..48526ffff 100644 --- a/core/libs/prx/libc/src/Process.cpp +++ b/core/libs/prx/libc/src/Process.cpp @@ -27,6 +27,19 @@ std::exception_ptr shutdownFailure; std::stop_source shutdownSource; std::atomic exitRequested{false}; std::atomic exitStarted{false}; +using GuestExitCallback = void (APS5_VABI*)(); +std::mutex exitCallbackMutex; +std::vector exitCallbacks; + +void runGuestExitCallback() { + GuestExitCallback callback; + { + std::lock_guard lock(exitCallbackMutex); + callback = exitCallbacks.back(); + exitCallbacks.pop_back(); + } + callback(); +} } @@ -139,10 +152,14 @@ int* APS5_VABI __error_nid_postfix() { std::abort(); } -int APS5_VABI atexit_nid_postfix(atexit_func_t func) { +int APS5_VABI atexit_nid_postfix(GuestExitCallback func) { if (func == nullptr) return 0; - return std::atexit(func); + std::lock_guard lock(exitCallbackMutex); + exitCallbacks.push_back(func); + const int result = std::atexit(runGuestExitCallback); + if (result != 0) exitCallbacks.pop_back(); + return result; } }