| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- namespace Ryujinx.HLE.HOS.Kernel.Memory
- {
- class KMemoryRegionBlock
- {
- public long[][] Masks;
- public ulong FreeCount;
- public int MaxLevel;
- public ulong StartAligned;
- public ulong SizeInBlocksTruncated;
- public ulong SizeInBlocksRounded;
- public int Order;
- public int NextOrder;
- public bool TryCoalesce(int index, int size)
- {
- long mask = ((1L << size) - 1) << (index & 63);
- index /= 64;
- if ((mask & ~Masks[MaxLevel - 1][index]) != 0)
- {
- return false;
- }
- Masks[MaxLevel - 1][index] &= ~mask;
- for (int level = MaxLevel - 2; level >= 0; level--, index /= 64)
- {
- Masks[level][index / 64] &= ~(1L << (index & 63));
- if (Masks[level][index / 64] != 0)
- {
- break;
- }
- }
- FreeCount -= (ulong)size;
- return true;
- }
- }
- }
|