summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_memory_region.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-03-21 22:36:26 +0100
committerbunnei <bunneidev@gmail.com>2021-03-21 22:45:13 +0100
commit1996cae9cbcddadeb42db571e9c491efd91374b9 (patch)
tree63694005b8e9fb8006260c698f1598d89f984ec5 /src/core/hle/kernel/k_memory_region.h
parenthle: kernel: k_memory_layout: Derive memory regions based on board layout. (diff)
downloadyuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar.gz
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar.bz2
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar.lz
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar.xz
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.tar.zst
yuzu-1996cae9cbcddadeb42db571e9c491efd91374b9.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/k_memory_region.h30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/core/hle/kernel/k_memory_region.h b/src/core/hle/kernel/k_memory_region.h
index 1d4fcde6f..374b24bd3 100644
--- a/src/core/hle/kernel/k_memory_region.h
+++ b/src/core/hle/kernel/k_memory_region.h
@@ -11,6 +11,8 @@
namespace Kernel {
+class KMemoryRegionAllocator;
+
class KMemoryRegion final : public Common::IntrusiveRedBlackTreeBaseNode<KMemoryRegion>,
NonCopyable {
friend class KMemoryRegionTree;
@@ -155,9 +157,10 @@ public:
private:
TreeType m_tree{};
+ KMemoryRegionAllocator& memory_region_allocator;
public:
- constexpr KMemoryRegionTree() = default;
+ KMemoryRegionTree(KMemoryRegionAllocator& memory_region_allocator_);
public:
KMemoryRegion* FindModifiable(u64 address) {
@@ -321,4 +324,29 @@ public:
}
};
+class KMemoryRegionAllocator final : NonCopyable {
+public:
+ static constexpr size_t MaxMemoryRegions = 200;
+
+private:
+ std::array<KMemoryRegion, MaxMemoryRegions> region_heap{};
+ size_t num_regions{};
+
+public:
+ constexpr KMemoryRegionAllocator() = default;
+
+public:
+ template <typename... Args>
+ KMemoryRegion* Allocate(Args&&... args) {
+ // Ensure we stay within the bounds of our heap.
+ ASSERT(this->num_regions < MaxMemoryRegions);
+
+ // Create the new region.
+ KMemoryRegion* region = std::addressof(this->region_heap[this->num_regions++]);
+ new (region) KMemoryRegion(std::forward<Args>(args)...);
+
+ return region;
+ }
+};
+
} // namespace Kernel