mirror of
https://github.com/wiiu-env/AromaBaseModule.git
synced 2024-12-18 07:51:49 +01:00
Fix crash when exiting NFW games takes too long
This commit is contained in:
parent
abfdc45068
commit
032bdf5b11
@ -30,7 +30,7 @@ void ZombiUFix() {
|
|||||||
* ZombiU doesn't exit properly. It just calls exit(0) after receiving the
|
* ZombiU doesn't exit properly. It just calls exit(0) after receiving the
|
||||||
* request to exit. If exiting takes too long, other threads will run again
|
* request to exit. If exiting takes too long, other threads will run again
|
||||||
* and crash for some reason. The (hacky) solution is to set the priority
|
* and crash for some reason. The (hacky) solution is to set the priority
|
||||||
* of (some) ZombiU threads to something very high.
|
* of (some) ZombiU threads to something very high (=> low priority).
|
||||||
*/
|
*/
|
||||||
if (OSGetTitleID() == 0x000500001010EF00 || // ZombiU EUR
|
if (OSGetTitleID() == 0x000500001010EF00 || // ZombiU EUR
|
||||||
OSGetTitleID() == 0x000500001011A700 || // ZombiU EUR
|
OSGetTitleID() == 0x000500001011A700 || // ZombiU EUR
|
||||||
|
@ -4,9 +4,31 @@
|
|||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include <coreinit/dynload.h>
|
#include <coreinit/dynload.h>
|
||||||
#include <coreinit/filesystem_fsa.h>
|
#include <coreinit/filesystem_fsa.h>
|
||||||
|
#include <coreinit/interrupts.h>
|
||||||
|
#include <coreinit/scheduler.h>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
|
void NWF_Fix() {
|
||||||
|
// Some games using the NWF (like Dot Arcade) keep a thread called "PlatformInputAppStateListenerThread" running,
|
||||||
|
// which will cause a DSI exception if the title is not closing fast enough.
|
||||||
|
auto *curThread = OSGetCurrentThread();
|
||||||
|
__OSLockScheduler(curThread);
|
||||||
|
int state = OSDisableInterrupts();
|
||||||
|
OSThread *t = *((OSThread **) 0x100567F8);
|
||||||
|
while (t) {
|
||||||
|
if (std::string_view(t->name) == "PlatformInputAppStateListenerThread") {
|
||||||
|
t->priority = 0x80;
|
||||||
|
OSReport("Set priority to %d for thread %08X (%s) to prevent it from running/crashing\n", t->priority, t, t->name);
|
||||||
|
}
|
||||||
|
t = t->activeLink.next;
|
||||||
|
}
|
||||||
|
OSRestoreInterrupts(state);
|
||||||
|
__OSUnlockScheduler(curThread);
|
||||||
|
}
|
||||||
|
|
||||||
DECL_FUNCTION(void, __PPCExit, uint32_t u1) {
|
DECL_FUNCTION(void, __PPCExit, uint32_t u1) {
|
||||||
|
NWF_Fix();
|
||||||
|
|
||||||
CallHook(WUMS_HOOK_APPLICATION_ENDS);
|
CallHook(WUMS_HOOK_APPLICATION_ENDS);
|
||||||
CallHook(WUMS_HOOK_FINI_WUT_SOCKETS);
|
CallHook(WUMS_HOOK_FINI_WUT_SOCKETS);
|
||||||
CallHook(WUMS_HOOK_FINI_WUT_DEVOPTAB);
|
CallHook(WUMS_HOOK_FINI_WUT_DEVOPTAB);
|
||||||
|
Loading…
Reference in New Issue
Block a user