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

@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
private BufferEntry[] BufferQueue;
private ManualResetEvent WaitBufferFree;
private AutoResetEvent WaitBufferFree;
private bool Disposed;
@ -88,7 +88,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
BufferQueue = new BufferEntry[0x40];
WaitBufferFree = new ManualResetEvent(false);
WaitBufferFree = new AutoResetEvent(false);
}
public long ProcessParcelRequest(ServiceCtx Context, byte[] ParcelData, int Code)
@ -220,6 +220,8 @@ namespace Ryujinx.HLE.HOS.Services.Android
BufferQueue[Slot].State = BufferState.Free;
WaitBufferFree.Set();
return MakeReplyParcel(Context, 0);
}
@ -336,12 +338,9 @@ namespace Ryujinx.HLE.HOS.Services.Android
{
BufferQueue[Slot].State = BufferState.Free;
BinderEvent.WaitEvent.Set();
BinderEvent.Signal();
lock (WaitBufferFree)
{
WaitBufferFree.Set();
}
WaitBufferFree.Set();
}
private int GetFreeSlotBlocking(int Width, int Height)
@ -350,19 +349,14 @@ namespace Ryujinx.HLE.HOS.Services.Android
do
{
lock (WaitBufferFree)
if ((Slot = GetFreeSlot(Width, Height)) != -1)
{
if ((Slot = GetFreeSlot(Width, Height)) != -1)
{
break;
}
break;
}
if (Disposed)
{
break;
}
WaitBufferFree.Reset();
if (Disposed)
{
break;
}
WaitBufferFree.WaitOne();
@ -409,11 +403,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
{
Disposed = true;
lock (WaitBufferFree)
{
WaitBufferFree.Set();
}
WaitBufferFree.Set();
WaitBufferFree.Dispose();
}
}