slab_helpers.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "core/hle/kernel/k_auto_object.h"
  5. #include "core/hle/kernel/k_auto_object_container.h"
  6. #include "core/hle/kernel/kernel.h"
  7. namespace Kernel {
  8. template <class Derived>
  9. class KSlabAllocated {
  10. public:
  11. constexpr KSlabAllocated() = default;
  12. size_t GetSlabIndex(KernelCore& kernel) const {
  13. return kernel.SlabHeap<Derived>().GetIndex(static_cast<const Derived*>(this));
  14. }
  15. public:
  16. static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) {
  17. kernel.SlabHeap<Derived>().Initialize(memory, memory_size);
  18. }
  19. static Derived* Allocate(KernelCore& kernel) {
  20. return kernel.SlabHeap<Derived>().Allocate(kernel);
  21. }
  22. static void Free(KernelCore& kernel, Derived* obj) {
  23. kernel.SlabHeap<Derived>().Free(obj);
  24. }
  25. static size_t GetObjectSize(KernelCore& kernel) {
  26. return kernel.SlabHeap<Derived>().GetObjectSize();
  27. }
  28. static size_t GetSlabHeapSize(KernelCore& kernel) {
  29. return kernel.SlabHeap<Derived>().GetSlabHeapSize();
  30. }
  31. static size_t GetPeakIndex(KernelCore& kernel) {
  32. return kernel.SlabHeap<Derived>().GetPeakIndex();
  33. }
  34. static uintptr_t GetSlabHeapAddress(KernelCore& kernel) {
  35. return kernel.SlabHeap<Derived>().GetSlabHeapAddress();
  36. }
  37. static size_t GetNumRemaining(KernelCore& kernel) {
  38. return kernel.SlabHeap<Derived>().GetNumRemaining();
  39. }
  40. };
  41. template <typename Derived, typename Base>
  42. class KAutoObjectWithSlabHeapAndContainer : public Base {
  43. static_assert(std::is_base_of<KAutoObjectWithList, Base>::value);
  44. private:
  45. static Derived* Allocate(KernelCore& kernel) {
  46. return kernel.SlabHeap<Derived>().Allocate(kernel);
  47. }
  48. static void Free(KernelCore& kernel, Derived* obj) {
  49. kernel.SlabHeap<Derived>().Free(obj);
  50. }
  51. public:
  52. KAutoObjectWithSlabHeapAndContainer(KernelCore& kernel_) : Base(kernel_), kernel(kernel_) {}
  53. virtual ~KAutoObjectWithSlabHeapAndContainer() {}
  54. virtual void Destroy() override {
  55. const bool is_initialized = this->IsInitialized();
  56. uintptr_t arg = 0;
  57. if (is_initialized) {
  58. kernel.ObjectListContainer().Unregister(this);
  59. arg = this->GetPostDestroyArgument();
  60. this->Finalize();
  61. }
  62. Free(kernel, static_cast<Derived*>(this));
  63. if (is_initialized) {
  64. Derived::PostDestroy(arg);
  65. }
  66. }
  67. virtual bool IsInitialized() const {
  68. return true;
  69. }
  70. virtual uintptr_t GetPostDestroyArgument() const {
  71. return 0;
  72. }
  73. size_t GetSlabIndex() const {
  74. return SlabHeap<Derived>(kernel).GetObjectIndex(static_cast<const Derived*>(this));
  75. }
  76. public:
  77. static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) {
  78. kernel.SlabHeap<Derived>().Initialize(memory, memory_size);
  79. kernel.ObjectListContainer().Initialize();
  80. }
  81. static Derived* Create(KernelCore& kernel) {
  82. Derived* obj = Allocate(kernel);
  83. if (obj != nullptr) {
  84. KAutoObject::Create(obj);
  85. }
  86. return obj;
  87. }
  88. static void Register(KernelCore& kernel, Derived* obj) {
  89. return kernel.ObjectListContainer().Register(obj);
  90. }
  91. static size_t GetObjectSize(KernelCore& kernel) {
  92. return kernel.SlabHeap<Derived>().GetObjectSize();
  93. }
  94. static size_t GetSlabHeapSize(KernelCore& kernel) {
  95. return kernel.SlabHeap<Derived>().GetSlabHeapSize();
  96. }
  97. static size_t GetPeakIndex(KernelCore& kernel) {
  98. return kernel.SlabHeap<Derived>().GetPeakIndex();
  99. }
  100. static uintptr_t GetSlabHeapAddress(KernelCore& kernel) {
  101. return kernel.SlabHeap<Derived>().GetSlabHeapAddress();
  102. }
  103. static size_t GetNumRemaining(KernelCore& kernel) {
  104. return kernel.SlabHeap<Derived>().GetNumRemaining();
  105. }
  106. protected:
  107. KernelCore& kernel;
  108. };
  109. } // namespace Kernel