| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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--;
- }
- }
- }
|