namespace Ryujinx.HLE.HOS.Kernel
{
class ThreadQueue
private const int LowestPriority = 0x3f;
private SchedulerThread Head;
private object ListLock;
public ThreadQueue()
ListLock = new object();
}
public void Push(SchedulerThread Wait)
lock (ListLock)
//Ensure that we're not creating circular references
//by adding a thread that is already on the list.
if (HasThread(Wait))
return;
if (Head == null || Head.Thread.ActualPriority >= Wait.Thread.ActualPriority)
Wait.Next = Head;
Head = Wait;
SchedulerThread Curr = Head;
while (Curr.Next != null)
if (Curr.Next.Thread.ActualPriority >= Wait.Thread.ActualPriority)
break;
Curr = Curr.Next;
Wait.Next = Curr.Next;
Curr.Next = Wait;
public SchedulerThread Pop(int Core, int MinPriority = LowestPriority)
int CoreMask = 1 << Core;
SchedulerThread Prev = null;
while (Curr != null)
KThread Thread = Curr.Thread;
if (Thread.ActualPriority <= MinPriority && (Thread.CoreMask & CoreMask) != 0)
if (Prev != null)
Prev.Next = Curr.Next;
else
Head = Head.Next;
Prev = Curr;
return Curr;
public bool Remove(SchedulerThread Thread)
if (Head == null)
return false;
else if (Head == Thread)
return true;
SchedulerThread Prev = Head;
SchedulerThread Curr = Head.Next;
if (Curr == Thread)
public bool Resort(SchedulerThread Thread)
if (Remove(Thread))
Push(Thread);
public bool HasThread(SchedulerThread Thread)