Fix performance regression caused by the new scheduler changes (#422)

* Call interrupt less often, remove some leftovers from the old scheduler code

* Remove unneeded attribute
This commit is contained in:
gdkchan 2018-09-19 12:16:20 -03:00 committed by GitHub
parent fae097408e
commit 99b2692425
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 66 deletions

View file

@ -28,7 +28,10 @@ namespace Ryujinx.HLE.HOS.Kernel
Thread.LastScheduledTicks = (uint)Environment.TickCount;
}
ContextSwitchNeeded = true;
if (SelectedThread != CurrentThread)
{
ContextSwitchNeeded = true;
}
}
public void UpdateCurrentThread()
@ -58,10 +61,5 @@ namespace Ryujinx.HLE.HOS.Kernel
CurrentThread.Context.Execute();
}
}
public void RemoveThread(KThread Thread)
{
//TODO.
}
}
}

View file

@ -1,48 +0,0 @@
using System;
using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel
{
class SchedulerThread : IDisposable
{
public KThread Thread { get; private set; }
public SchedulerThread Next { get; set; }
public bool IsActive { get; set; }
public AutoResetEvent WaitSync { get; private set; }
public ManualResetEvent WaitActivity { get; private set; }
public AutoResetEvent WaitSched { get; private set; }
public SchedulerThread(KThread Thread)
{
this.Thread = Thread;
IsActive = true;
WaitSync = new AutoResetEvent(false);
WaitActivity = new ManualResetEvent(true);
WaitSched = new AutoResetEvent(false);
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool Disposing)
{
if (Disposing)
{
WaitSync.Dispose();
WaitActivity.Dispose();
WaitSched.Dispose();
}
}
}
}

View file

@ -81,8 +81,6 @@ namespace Ryujinx.HLE.HOS.Kernel
CurrentThread.Exit();
System.Scheduler.StopThread(CurrentThread);
System.Scheduler.CoreContexts[CurrentThread.CurrentCore].RemoveThread(CurrentThread);
}
private void SvcSleepThread(AThreadState ThreadState)

View file

@ -356,7 +356,10 @@ namespace Ryujinx.HLE.HOS
{
if (sender is AThread Thread)
{
Threads.TryRemove(Thread.ThreadState.Tpidr, out KThread KernelThread);
if (Threads.TryRemove(Thread.ThreadState.Tpidr, out KThread KernelThread))
{
Device.System.Scheduler.RemoveThread(KernelThread);
}
}
if (Threads.Count == 0)