From 704d1f94a67d43bb85a80b2fd40a17110a99e50e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Wed, 15 Sep 2021 01:13:39 +0700 Subject: [PATCH] Fix freezing issue during GameMode initialization on some games (ie. Hammerin' Hero) --- Core/HLE/sceNetAdhoc.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9b130a2a65..d792b16cc6 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -4201,10 +4201,12 @@ static int sceNetAdhocGameModeCreateMaster(u32 dataAddr, int size) { masterGameModeArea = { 0, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 1, 0, localMac, data }; StartGameModeScheduler(); - // Block current thread to sync initial master data + // Block current thread to sync initial master data after Master and all Replicas have been created if (replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { - __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, 0, 0, false, "syncing master data"); - DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + if (CoreTiming::IsScheduled(gameModeNotifyEvent)) { + __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, 0, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } } return hleLogDebug(SCENET, 0, "success"); // returned an id just like CreateReplica? always return 0? } @@ -4259,10 +4261,12 @@ static int sceNetAdhocGameModeCreateReplica(const char *mac, u32 dataAddr, int s replicaGameModeAreas.push_back(gma); ret = gma.id; // Valid id for replica is higher than 0? - // Block current thread to sync initial master data + // Block current thread to sync initial master data after Master and all Replicas have been created if (replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { - __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, ret, 0, false, "syncing master data"); - DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + if (CoreTiming::IsScheduled(gameModeNotifyEvent)) { + __KernelWaitCurThread(WAITTYPE_NET, GAMEMODE_WAITID, ret, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } } return hleLogSuccessInfoI(SCENET, ret, "success"); }