diff options
author | bunnei <bunneidev@gmail.com> | 2021-03-21 22:36:26 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2021-03-21 22:45:13 +0100 |
commit | 1996cae9cbcddadeb42db571e9c491efd91374b9 (patch) | |
tree | 63694005b8e9fb8006260c698f1598d89f984ec5 /src/core/hle/kernel/k_memory_region.h | |
parent | hle: kernel: k_memory_layout: Derive memory regions based on board layout. (diff) | |
download | yuzu-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.h | 30 |
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 |