using System;
namespace Ryujinx.HLE.HOS.Kernel
{
class KTlsPageManager
private const int TlsEntrySize = 0x200;
private long PagePosition;
private int UsedSlots;
private bool[] Slots;
public bool IsEmpty => UsedSlots == 0;
public bool IsFull => UsedSlots == Slots.Length;
public KTlsPageManager(long PagePosition)
this.PagePosition = PagePosition;
Slots = new bool[KMemoryManager.PageSize / TlsEntrySize];
}
public bool TryGetFreeTlsAddr(out long Position)
Position = PagePosition;
for (int Index = 0; Index < Slots.Length; Index++)
if (!Slots[Index])
Slots[Index] = true;
UsedSlots++;
return true;
Position += TlsEntrySize;
Position = 0;
return false;
public void FreeTlsSlot(int Slot)
if ((uint)Slot > Slots.Length)
throw new ArgumentOutOfRangeException(nameof(Slot));
Slots[Slot] = false;
UsedSlots--;