Thread scheduler rewrite (#393)

* Started to rewrite the thread scheduler

* Add a single core-like scheduling mode, enabled by default

* Clear exclusive monitor on context switch

* Add SetThreadActivity, misc fixes

* Implement WaitForAddress and SignalToAddress svcs, misc fixes

* Misc fixes (on SetActivity and Arbiter), other tweaks

* Rebased

* Add missing null check

* Rename multicore key on config, fix UpdatePriorityInheritance

* Make scheduling data MLQs private

* nit: Ordering
This commit is contained in:
gdkchan 2018-09-18 20:36:43 -03:00 committed by GitHub
parent 33e2810ef3
commit b8133c1997
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
57 changed files with 3262 additions and 1540 deletions

View file

@ -1,28 +1,38 @@
using System;
using System.Threading;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Kernel
{
class KSynchronizationObject : IDisposable
class KSynchronizationObject
{
public ManualResetEvent WaitEvent { get; private set; }
public LinkedList<KThread> WaitingThreads;
public KSynchronizationObject()
protected Horizon System;
public KSynchronizationObject(Horizon System)
{
WaitEvent = new ManualResetEvent(false);
this.System = System;
WaitingThreads = new LinkedList<KThread>();
}
public void Dispose()
public LinkedListNode<KThread> AddWaitingThread(KThread Thread)
{
Dispose(true);
return WaitingThreads.AddLast(Thread);
}
protected virtual void Dispose(bool Disposing)
public void RemoveWaitingThread(LinkedListNode<KThread> Node)
{
if (Disposing)
{
WaitEvent.Dispose();
}
WaitingThreads.Remove(Node);
}
public virtual void Signal()
{
System.Synchronization.SignalObject(this);
}
public virtual bool IsSignaled()
{
return false;
}
}
}