diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-06-09 22:41:07 -0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-06-09 22:41:07 -0300 |
| commit | adeb8793c21e8128ef50ecb555663dfa7ea9fda6 (patch) | |
| tree | 42722201469aaa158cd29058bdcd11424d4c9a95 | |
| parent | aa75957ce242d58043e4af83e02a39480c7025b4 (diff) | |
Fix a thread sync bug as is the usual...
| -rw-r--r-- | Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs | 14 |
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) { |
