aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs')
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs
new file mode 100644
index 00000000..9051e84c
--- /dev/null
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+
+namespace Ryujinx.HLE.HOS.Kernel.Memory
+{
+ class KSlabHeap
+ {
+ private LinkedList<ulong> _items;
+
+ public KSlabHeap(ulong pa, ulong itemSize, ulong size)
+ {
+ _items = new LinkedList<ulong>();
+
+ int itemsCount = (int)(size / itemSize);
+
+ for (int index = 0; index < itemsCount; index++)
+ {
+ _items.AddLast(pa);
+
+ pa += itemSize;
+ }
+ }
+
+ public bool TryGetItem(out ulong pa)
+ {
+ lock (_items)
+ {
+ if (_items.First != null)
+ {
+ pa = _items.First.Value;
+
+ _items.RemoveFirst();
+
+ return true;
+ }
+ }
+
+ pa = 0;
+
+ return false;
+ }
+
+ public void Free(ulong pa)
+ {
+ lock (_items)
+ {
+ _items.AddFirst(pa);
+ }
+ }
+ }
+} \ No newline at end of file