aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-09 22:41:07 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-09 22:41:07 -0300
commitadeb8793c21e8128ef50ecb555663dfa7ea9fda6 (patch)
tree42722201469aaa158cd29058bdcd11424d4c9a95
parentaa75957ce242d58043e4af83e02a39480c7025b4 (diff)
Fix a thread sync bug as is the usual...
-rw-r--r--Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs14
1 files changed, 10 insertions, 4 deletions
diff --git a/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs b/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
index 70107c3a..12bc657a 100644
--- a/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
+++ b/Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs
@@ -254,7 +254,7 @@ namespace Ryujinx.Core.OsHle.Kernel
WaitThread.MutexAddress = MutexAddress;
WaitThread.CondVarAddress = CondVarAddress;
- lock (Process.ThreadArbiterList)
+ lock (Process.ThreadSyncLock)
{
WaitThread.CondVarSignaled = false;
@@ -267,12 +267,18 @@ namespace Ryujinx.Core.OsHle.Kernel
{
Process.Scheduler.EnterWait(WaitThread, NsTimeConverter.GetTimeMs(Timeout));
- lock (Process.ThreadArbiterList)
+ lock (Process.ThreadSyncLock)
{
- if (!WaitThread.CondVarSignaled)
+ WaitThread.MutexOwner?.MutexWaiters.Remove(WaitThread);
+
+ if (!WaitThread.CondVarSignaled || WaitThread.MutexOwner != null)
{
+ WaitThread.MutexOwner = null;
+
Process.ThreadArbiterList.Remove(WaitThread);
+ Ns.Log.PrintDebug(LogClass.KernelSvc, "Timed out...");
+
return false;
}
}
@@ -287,7 +293,7 @@ namespace Ryujinx.Core.OsHle.Kernel
private void CondVarSignal(KThread CurrThread, long CondVarAddress, int Count)
{
- lock (Process.ThreadArbiterList)
+ lock (Process.ThreadSyncLock)
{
while (Count == -1 || Count-- > 0)
{