|
@@ -254,7 +254,7 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|
|
WaitThread.MutexAddress = MutexAddress;
|
|
WaitThread.MutexAddress = MutexAddress;
|
|
|
WaitThread.CondVarAddress = CondVarAddress;
|
|
WaitThread.CondVarAddress = CondVarAddress;
|
|
|
|
|
|
|
|
- lock (Process.ThreadArbiterList)
|
|
|
|
|
|
|
+ lock (Process.ThreadSyncLock)
|
|
|
{
|
|
{
|
|
|
WaitThread.CondVarSignaled = false;
|
|
WaitThread.CondVarSignaled = false;
|
|
|
|
|
|
|
@@ -267,12 +267,18 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|
|
{
|
|
{
|
|
|
Process.Scheduler.EnterWait(WaitThread, NsTimeConverter.GetTimeMs(Timeout));
|
|
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);
|
|
Process.ThreadArbiterList.Remove(WaitThread);
|
|
|
|
|
|
|
|
|
|
+ Ns.Log.PrintDebug(LogClass.KernelSvc, "Timed out...");
|
|
|
|
|
+
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -287,7 +293,7 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|
|
|
|
|
|
|
private void CondVarSignal(KThread CurrThread, long CondVarAddress, int Count)
|
|
private void CondVarSignal(KThread CurrThread, long CondVarAddress, int Count)
|
|
|
{
|
|
{
|
|
|
- lock (Process.ThreadArbiterList)
|
|
|
|
|
|
|
+ lock (Process.ThreadSyncLock)
|
|
|
{
|
|
{
|
|
|
while (Count == -1 || Count-- > 0)
|
|
while (Count == -1 || Count-- > 0)
|
|
|
{
|
|
{
|