summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2022-10-29 14:19:45 -0700
committerGravatar bunnei2022-11-03 21:17:06 -0700
commitd928ba8e40211d5334ea77e0cec6b22f0b241a8d (patch)
treed60ce63ff3f9e280494d6290d492dbf73a13b20e
parentcore: hle: kernel: k_dynamic_resource_manager: Add KBlockInfoManager, KBlockI... (diff)
downloadyuzu-d928ba8e40211d5334ea77e0cec6b22f0b241a8d.tar.gz
yuzu-d928ba8e40211d5334ea77e0cec6b22f0b241a8d.tar.xz
yuzu-d928ba8e40211d5334ea77e0cec6b22f0b241a8d.zip
core: hle: kernel: slab_helpers: Add KAutoObjectWithSlabHeap.
-rw-r--r--src/core/hle/kernel/slab_helpers.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/core/hle/kernel/slab_helpers.h b/src/core/hle/kernel/slab_helpers.h
index 06b51e919..0228ce188 100644
--- a/src/core/hle/kernel/slab_helpers.h
+++ b/src/core/hle/kernel/slab_helpers.h
@@ -53,6 +53,84 @@ public:
53}; 53};
54 54
55template <typename Derived, typename Base> 55template <typename Derived, typename Base>
56class KAutoObjectWithSlabHeap : public Base {
57 static_assert(std::is_base_of<KAutoObject, Base>::value);
58
59private:
60 static Derived* Allocate(KernelCore& kernel) {
61 return kernel.SlabHeap<Derived>().Allocate(kernel);
62 }
63
64 static void Free(KernelCore& kernel, Derived* obj) {
65 kernel.SlabHeap<Derived>().Free(obj);
66 }
67
68public:
69 explicit KAutoObjectWithSlabHeap(KernelCore& kernel_) : Base(kernel_), kernel(kernel_) {}
70 virtual ~KAutoObjectWithSlabHeap() = default;
71
72 virtual void Destroy() override {
73 const bool is_initialized = this->IsInitialized();
74 uintptr_t arg = 0;
75 if (is_initialized) {
76 arg = this->GetPostDestroyArgument();
77 this->Finalize();
78 }
79 Free(kernel, static_cast<Derived*>(this));
80 if (is_initialized) {
81 Derived::PostDestroy(arg);
82 }
83 }
84
85 virtual bool IsInitialized() const {
86 return true;
87 }
88 virtual uintptr_t GetPostDestroyArgument() const {
89 return 0;
90 }
91
92 size_t GetSlabIndex() const {
93 return SlabHeap<Derived>(kernel).GetObjectIndex(static_cast<const Derived*>(this));
94 }
95
96public:
97 static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) {
98 kernel.SlabHeap<Derived>().Initialize(memory, memory_size);
99 }
100
101 static Derived* Create(KernelCore& kernel) {
102 Derived* obj = Allocate(kernel);
103 if (obj != nullptr) {
104 KAutoObject::Create(obj);
105 }
106 return obj;
107 }
108
109 static size_t GetObjectSize(KernelCore& kernel) {
110 return kernel.SlabHeap<Derived>().GetObjectSize();
111 }
112
113 static size_t GetSlabHeapSize(KernelCore& kernel) {
114 return kernel.SlabHeap<Derived>().GetSlabHeapSize();
115 }
116
117 static size_t GetPeakIndex(KernelCore& kernel) {
118 return kernel.SlabHeap<Derived>().GetPeakIndex();
119 }
120
121 static uintptr_t GetSlabHeapAddress(KernelCore& kernel) {
122 return kernel.SlabHeap<Derived>().GetSlabHeapAddress();
123 }
124
125 static size_t GetNumRemaining(KernelCore& kernel) {
126 return kernel.SlabHeap<Derived>().GetNumRemaining();
127 }
128
129protected:
130 KernelCore& kernel;
131};
132
133template <typename Derived, typename Base>
56class KAutoObjectWithSlabHeapAndContainer : public Base { 134class KAutoObjectWithSlabHeapAndContainer : public Base {
57 static_assert(std::is_base_of<KAutoObjectWithList, Base>::value); 135 static_assert(std::is_base_of<KAutoObjectWithList, Base>::value);
58 136