|
|
|
@ -0,0 +1,58 @@ |
|
|
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project |
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later |
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
|
|
#include "common/common_funcs.h" |
|
|
|
#include "core/hle/kernel/k_dynamic_slab_heap.h" |
|
|
|
#include "core/hle/kernel/k_memory_block.h" |
|
|
|
|
|
|
|
namespace Kernel { |
|
|
|
|
|
|
|
template <typename T, bool ClearNode = false> |
|
|
|
class KDynamicResourceManager { |
|
|
|
YUZU_NON_COPYABLE(KDynamicResourceManager); |
|
|
|
YUZU_NON_MOVEABLE(KDynamicResourceManager); |
|
|
|
|
|
|
|
public: |
|
|
|
using DynamicSlabType = KDynamicSlabHeap<T, ClearNode>; |
|
|
|
|
|
|
|
public: |
|
|
|
constexpr KDynamicResourceManager() = default; |
|
|
|
|
|
|
|
constexpr size_t GetSize() const { |
|
|
|
return m_slab_heap->GetSize(); |
|
|
|
} |
|
|
|
constexpr size_t GetUsed() const { |
|
|
|
return m_slab_heap->GetUsed(); |
|
|
|
} |
|
|
|
constexpr size_t GetPeak() const { |
|
|
|
return m_slab_heap->GetPeak(); |
|
|
|
} |
|
|
|
constexpr size_t GetCount() const { |
|
|
|
return m_slab_heap->GetCount(); |
|
|
|
} |
|
|
|
|
|
|
|
void Initialize(KDynamicPageManager* page_allocator, DynamicSlabType* slab_heap) { |
|
|
|
m_page_allocator = page_allocator; |
|
|
|
m_slab_heap = slab_heap; |
|
|
|
} |
|
|
|
|
|
|
|
T* Allocate() const { |
|
|
|
return m_slab_heap->Allocate(m_page_allocator); |
|
|
|
} |
|
|
|
|
|
|
|
void Free(T* t) const { |
|
|
|
m_slab_heap->Free(t); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
KDynamicPageManager* m_page_allocator{}; |
|
|
|
DynamicSlabType* m_slab_heap{}; |
|
|
|
}; |
|
|
|
|
|
|
|
class KMemoryBlockSlabManager : public KDynamicResourceManager<KMemoryBlock> {}; |
|
|
|
|
|
|
|
using KMemoryBlockSlabHeap = typename KMemoryBlockSlabManager::DynamicSlabType; |
|
|
|
|
|
|
|
} // namespace Kernel |