diff options
| author | Morph <39850852+Morph1984@users.noreply.github.com> | 2022-02-02 16:04:26 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-02 16:04:26 -0500 | 
| commit | d68eb751c53df785f842d56983ce4dfbb89aae3f (patch) | |
| tree | 510752a162e2bbb0e0f5a1e60b499aa4dca0493e /src/core/hle | |
| parent | 9484519ec368d74a87233e886d4266be2bd2d40e (diff) | |
| parent | ade44ac2ea66777e412644a273a43cbada55e6d6 (diff) | |
Merge pull request #7838 from lioncash/noncopy
common_types: Remove NonCopyable struct
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/kernel/k_auto_object.h | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_auto_object_container.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_handle_table.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_memory_manager.h | 42 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_memory_region.h | 80 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_heap.h | 90 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.h | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_slab_heap.h | 13 | ||||
| -rw-r--r-- | src/core/hle/service/vi/display/vi_display.h | 2 | 
10 files changed, 141 insertions, 109 deletions
| diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h index 165b76747..05779f2d5 100644 --- a/src/core/hle/kernel/k_auto_object.h +++ b/src/core/hle/kernel/k_auto_object.h @@ -20,8 +20,6 @@ class KernelCore;  class KProcess;  #define KERNEL_AUTOOBJECT_TRAITS(CLASS, BASE_CLASS)                                                \ -    YUZU_NON_COPYABLE(CLASS);                                                                      \ -    YUZU_NON_MOVEABLE(CLASS);                                                                      \                                                                                                     \  private:                                                                                           \      friend class ::Kernel::KClassTokenGenerator;                                                   \ @@ -32,6 +30,9 @@ private:      }                                                                                              \                                                                                                     \  public:                                                                                            \ +    YUZU_NON_COPYABLE(CLASS);                                                                      \ +    YUZU_NON_MOVEABLE(CLASS);                                                                      \ +                                                                                                   \      using BaseClass = BASE_CLASS;                                                                  \      static constexpr TypeObj GetStaticTypeObj() {                                                  \          constexpr ClassTokenType Token = ClassToken();                                             \ @@ -224,9 +225,9 @@ private:  template <typename T>  class KScopedAutoObject { +public:      YUZU_NON_COPYABLE(KScopedAutoObject); -public:      constexpr KScopedAutoObject() = default;      constexpr KScopedAutoObject(T* o) : m_obj(o) { diff --git a/src/core/hle/kernel/k_auto_object_container.h b/src/core/hle/kernel/k_auto_object_container.h index 4eadfe99d..697cc4289 100644 --- a/src/core/hle/kernel/k_auto_object_container.h +++ b/src/core/hle/kernel/k_auto_object_container.h @@ -16,13 +16,12 @@ class KernelCore;  class KProcess;  class KAutoObjectWithListContainer { +public:      YUZU_NON_COPYABLE(KAutoObjectWithListContainer);      YUZU_NON_MOVEABLE(KAutoObjectWithListContainer); -public:      using ListType = boost::intrusive::rbtree<KAutoObjectWithList>; -public:      class ListAccessor : public KScopedLightLock {      public:          explicit ListAccessor(KAutoObjectWithListContainer* container) @@ -48,7 +47,6 @@ public:      friend class ListAccessor; -public:      KAutoObjectWithListContainer(KernelCore& kernel) : m_lock(kernel), m_object_list() {}      void Initialize() {} diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h index 4b114ec2f..87004a0f9 100644 --- a/src/core/hle/kernel/k_handle_table.h +++ b/src/core/hle/kernel/k_handle_table.h @@ -22,13 +22,12 @@ namespace Kernel {  class KernelCore;  class KHandleTable { +public:      YUZU_NON_COPYABLE(KHandleTable);      YUZU_NON_MOVEABLE(KHandleTable); -public:      static constexpr size_t MaxTableSize = 1024; -public:      explicit KHandleTable(KernelCore& kernel_);      ~KHandleTable(); diff --git a/src/core/hle/kernel/k_memory_manager.h b/src/core/hle/kernel/k_memory_manager.h index abd6c8ace..17c7690f1 100644 --- a/src/core/hle/kernel/k_memory_manager.h +++ b/src/core/hle/kernel/k_memory_manager.h @@ -8,6 +8,7 @@  #include <mutex>  #include <tuple> +#include "common/common_funcs.h"  #include "common/common_types.h"  #include "core/hle/kernel/k_page_heap.h"  #include "core/hle/result.h" @@ -20,8 +21,11 @@ namespace Kernel {  class KPageLinkedList; -class KMemoryManager final : NonCopyable { +class KMemoryManager final {  public: +    YUZU_NON_COPYABLE(KMemoryManager); +    YUZU_NON_MOVEABLE(KMemoryManager); +      enum class Pool : u32 {          Application = 0,          Applet = 1, @@ -88,26 +92,13 @@ public:      }  private: -    class Impl final : NonCopyable { -    private: -        using RefCount = u16; - -    private: -        KPageHeap heap; -        Pool pool{}; - +    class Impl final {      public: -        static std::size_t CalculateManagementOverheadSize(std::size_t region_size); - -        static constexpr std::size_t CalculateOptimizedProcessOverheadSize( -            std::size_t region_size) { -            return (Common::AlignUp((region_size / PageSize), Common::BitSize<u64>()) / -                    Common::BitSize<u64>()) * -                   sizeof(u64); -        } +        YUZU_NON_COPYABLE(Impl); +        YUZU_NON_MOVEABLE(Impl); -    public:          Impl() = default; +        ~Impl() = default;          std::size_t Initialize(Pool new_pool, u64 start_address, u64 end_address); @@ -130,6 +121,21 @@ private:          constexpr VAddr GetEndAddress() const {              return heap.GetEndAddress();          } + +        static std::size_t CalculateManagementOverheadSize(std::size_t region_size); + +        static constexpr std::size_t CalculateOptimizedProcessOverheadSize( +            std::size_t region_size) { +            return (Common::AlignUp((region_size / PageSize), Common::BitSize<u64>()) / +                    Common::BitSize<u64>()) * +                   sizeof(u64); +        } + +    private: +        using RefCount = u16; + +        KPageHeap heap; +        Pool pool{};      };  private: diff --git a/src/core/hle/kernel/k_memory_region.h b/src/core/hle/kernel/k_memory_region.h index 90ab8fd62..e9bdf4e59 100644 --- a/src/core/hle/kernel/k_memory_region.h +++ b/src/core/hle/kernel/k_memory_region.h @@ -5,6 +5,7 @@  #pragma once  #include "common/assert.h" +#include "common/common_funcs.h"  #include "common/common_types.h"  #include "common/intrusive_red_black_tree.h"  #include "core/hle/kernel/k_memory_region_type.h" @@ -13,11 +14,13 @@ namespace Kernel {  class KMemoryRegionAllocator; -class KMemoryRegion final : public Common::IntrusiveRedBlackTreeBaseNode<KMemoryRegion>, -                            NonCopyable { +class KMemoryRegion final : public Common::IntrusiveRedBlackTreeBaseNode<KMemoryRegion> {      friend class KMemoryRegionTree;  public: +    YUZU_NON_COPYABLE(KMemoryRegion); +    YUZU_NON_MOVEABLE(KMemoryRegion); +      constexpr KMemoryRegion() = default;      constexpr KMemoryRegion(u64 address_, u64 last_address_)          : address{address_}, last_address{last_address_} {} @@ -29,6 +32,8 @@ public:          : KMemoryRegion(address_, last_address_, std::numeric_limits<u64>::max(), attributes_,                          type_id_) {} +    ~KMemoryRegion() = default; +      static constexpr int Compare(const KMemoryRegion& lhs, const KMemoryRegion& rhs) {          if (lhs.GetAddress() < rhs.GetAddress()) {              return -1; @@ -39,16 +44,6 @@ public:          }      } -private: -    constexpr void Reset(u64 a, u64 la, u64 p, u32 r, u32 t) { -        address = a; -        pair_address = p; -        last_address = la; -        attributes = r; -        type_id = t; -    } - -public:      constexpr u64 GetAddress() const {          return address;      } @@ -108,6 +103,14 @@ public:      }  private: +    constexpr void Reset(u64 a, u64 la, u64 p, u32 r, u32 t) { +        address = a; +        pair_address = p; +        last_address = la; +        attributes = r; +        type_id = t; +    } +      u64 address{};      u64 last_address{};      u64 pair_address{}; @@ -115,8 +118,25 @@ private:      u32 type_id{};  }; -class KMemoryRegionTree final : NonCopyable { +class KMemoryRegionTree final { +private: +    using TreeType = +        Common::IntrusiveRedBlackTreeBaseTraits<KMemoryRegion>::TreeType<KMemoryRegion>; +  public: +    YUZU_NON_COPYABLE(KMemoryRegionTree); +    YUZU_NON_MOVEABLE(KMemoryRegionTree); + +    using value_type = TreeType::value_type; +    using size_type = TreeType::size_type; +    using difference_type = TreeType::difference_type; +    using pointer = TreeType::pointer; +    using const_pointer = TreeType::const_pointer; +    using reference = TreeType::reference; +    using const_reference = TreeType::const_reference; +    using iterator = TreeType::iterator; +    using const_iterator = TreeType::const_iterator; +      struct DerivedRegionExtents {          const KMemoryRegion* first_region{};          const KMemoryRegion* last_region{}; @@ -140,29 +160,9 @@ public:          }      }; -private: -    using TreeType = -        Common::IntrusiveRedBlackTreeBaseTraits<KMemoryRegion>::TreeType<KMemoryRegion>; - -public: -    using value_type = TreeType::value_type; -    using size_type = TreeType::size_type; -    using difference_type = TreeType::difference_type; -    using pointer = TreeType::pointer; -    using const_pointer = TreeType::const_pointer; -    using reference = TreeType::reference; -    using const_reference = TreeType::const_reference; -    using iterator = TreeType::iterator; -    using const_iterator = TreeType::const_iterator; - -private: -    TreeType m_tree{}; -    KMemoryRegionAllocator& memory_region_allocator; - -public:      explicit KMemoryRegionTree(KMemoryRegionAllocator& memory_region_allocator_); +    ~KMemoryRegionTree() = default; -public:      KMemoryRegion* FindModifiable(u64 address) {          if (auto it = this->find(KMemoryRegion(address, address, 0, 0)); it != this->end()) {              return std::addressof(*it); @@ -241,7 +241,6 @@ public:          return GetDerivedRegionExtents(static_cast<KMemoryRegionType>(type_id));      } -public:      void InsertDirectly(u64 address, u64 last_address, u32 attr = 0, u32 type_id = 0);      bool Insert(u64 address, size_t size, u32 type_id, u32 new_attr = 0, u32 old_attr = 0); @@ -252,7 +251,6 @@ public:          return this->GetRandomAlignedRegion(size + 2 * guard_size, alignment, type_id) + guard_size;      } -public:      // Iterator accessors.      iterator begin() {          return m_tree.begin(); @@ -322,13 +320,21 @@ public:      iterator nfind(const_reference ref) const {          return m_tree.nfind(ref);      } + +private: +    TreeType m_tree{}; +    KMemoryRegionAllocator& memory_region_allocator;  }; -class KMemoryRegionAllocator final : NonCopyable { +class KMemoryRegionAllocator final {  public: +    YUZU_NON_COPYABLE(KMemoryRegionAllocator); +    YUZU_NON_MOVEABLE(KMemoryRegionAllocator); +      static constexpr size_t MaxMemoryRegions = 200;      constexpr KMemoryRegionAllocator() = default; +    constexpr ~KMemoryRegionAllocator() = default;      template <typename... Args>      KMemoryRegion* Allocate(Args&&... args) { diff --git a/src/core/hle/kernel/k_page_heap.h b/src/core/hle/kernel/k_page_heap.h index 8d9f30523..a65aa28a0 100644 --- a/src/core/hle/kernel/k_page_heap.h +++ b/src/core/hle/kernel/k_page_heap.h @@ -8,14 +8,44 @@  #include <vector>  #include "common/alignment.h" +#include "common/common_funcs.h"  #include "common/common_types.h"  #include "core/hle/kernel/k_page_bitmap.h"  #include "core/hle/kernel/memory_types.h"  namespace Kernel { -class KPageHeap final : NonCopyable { +class KPageHeap final {  public: +    YUZU_NON_COPYABLE(KPageHeap); +    YUZU_NON_MOVEABLE(KPageHeap); + +    KPageHeap() = default; +    ~KPageHeap() = default; + +    constexpr VAddr GetAddress() const { +        return heap_address; +    } +    constexpr std::size_t GetSize() const { +        return heap_size; +    } +    constexpr VAddr GetEndAddress() const { +        return GetAddress() + GetSize(); +    } +    constexpr std::size_t GetPageOffset(VAddr block) const { +        return (block - GetAddress()) / PageSize; +    } + +    void Initialize(VAddr heap_address, std::size_t heap_size, std::size_t metadata_size); +    VAddr AllocateBlock(s32 index, bool random); +    void Free(VAddr addr, std::size_t num_pages); + +    void UpdateUsedSize() { +        used_size = heap_size - (GetNumFreePages() * PageSize); +    } + +    static std::size_t CalculateManagementOverheadSize(std::size_t region_size); +      static constexpr s32 GetAlignedBlockIndex(std::size_t num_pages, std::size_t align_pages) {          const auto target_pages{std::max(num_pages, align_pages)};          for (std::size_t i = 0; i < NumMemoryBlockPageShifts; i++) { @@ -45,21 +75,13 @@ public:      }  private: -    static constexpr std::size_t NumMemoryBlockPageShifts{7}; -    static constexpr std::array<std::size_t, NumMemoryBlockPageShifts> MemoryBlockPageShifts{ -        0xC, 0x10, 0x15, 0x16, 0x19, 0x1D, 0x1E, -    }; - -    class Block final : NonCopyable { -    private: -        KPageBitmap bitmap; -        VAddr heap_address{}; -        uintptr_t end_offset{}; -        std::size_t block_shift{}; -        std::size_t next_block_shift{}; - +    class Block final {      public: +        YUZU_NON_COPYABLE(Block); +        YUZU_NON_MOVEABLE(Block); +          Block() = default; +        ~Block() = default;          constexpr std::size_t GetShift() const {              return block_shift; @@ -129,7 +151,6 @@ private:              return heap_address + (offset << GetShift());          } -    public:          static constexpr std::size_t CalculateManagementOverheadSize(std::size_t region_size,                                                                       std::size_t cur_block_shift,                                                                       std::size_t next_block_shift) { @@ -139,35 +160,15 @@ private:              return KPageBitmap::CalculateManagementOverheadSize(                  (align * 2 + Common::AlignUp(region_size, align)) / cur_block_size);          } -    }; - -public: -    KPageHeap() = default; - -    constexpr VAddr GetAddress() const { -        return heap_address; -    } -    constexpr std::size_t GetSize() const { -        return heap_size; -    } -    constexpr VAddr GetEndAddress() const { -        return GetAddress() + GetSize(); -    } -    constexpr std::size_t GetPageOffset(VAddr block) const { -        return (block - GetAddress()) / PageSize; -    } -    void Initialize(VAddr heap_address, std::size_t heap_size, std::size_t metadata_size); -    VAddr AllocateBlock(s32 index, bool random); -    void Free(VAddr addr, std::size_t num_pages); - -    void UpdateUsedSize() { -        used_size = heap_size - (GetNumFreePages() * PageSize); -    } - -    static std::size_t CalculateManagementOverheadSize(std::size_t region_size); +    private: +        KPageBitmap bitmap; +        VAddr heap_address{}; +        uintptr_t end_offset{}; +        std::size_t block_shift{}; +        std::size_t next_block_shift{}; +    }; -private:      constexpr std::size_t GetNumFreePages() const {          std::size_t num_free{}; @@ -180,6 +181,11 @@ private:      void FreeBlock(VAddr block, s32 index); +    static constexpr std::size_t NumMemoryBlockPageShifts{7}; +    static constexpr std::array<std::size_t, NumMemoryBlockPageShifts> MemoryBlockPageShifts{ +        0xC, 0x10, 0x15, 0x16, 0x19, 0x1D, 0x1E, +    }; +      VAddr heap_address{};      std::size_t heap_size{};      std::size_t used_size{}; diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp index 2ebbc0819..393214082 100644 --- a/src/core/hle/kernel/k_page_table.cpp +++ b/src/core/hle/kernel/k_page_table.cpp @@ -63,6 +63,8 @@ constexpr std::size_t GetSizeInRange(const KMemoryInfo& info, VAddr start, VAddr  KPageTable::KPageTable(Core::System& system_) : system{system_} {} +KPageTable::~KPageTable() = default; +  ResultCode KPageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type,                                              bool enable_aslr, VAddr code_addr,                                              std::size_t code_size, KMemoryManager::Pool pool) { diff --git a/src/core/hle/kernel/k_page_table.h b/src/core/hle/kernel/k_page_table.h index 60ae9b9e8..ecae939a0 100644 --- a/src/core/hle/kernel/k_page_table.h +++ b/src/core/hle/kernel/k_page_table.h @@ -7,6 +7,7 @@  #include <memory>  #include <mutex> +#include "common/common_funcs.h"  #include "common/common_types.h"  #include "common/page_table.h"  #include "core/file_sys/program_metadata.h" @@ -22,9 +23,13 @@ namespace Kernel {  class KMemoryBlockManager; -class KPageTable final : NonCopyable { +class KPageTable final {  public: +    YUZU_NON_COPYABLE(KPageTable); +    YUZU_NON_MOVEABLE(KPageTable); +      explicit KPageTable(Core::System& system_); +    ~KPageTable();      ResultCode InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, bool enable_aslr,                                      VAddr code_addr, std::size_t code_size, diff --git a/src/core/hle/kernel/k_slab_heap.h b/src/core/hle/kernel/k_slab_heap.h index 0ad74b0a0..05c0bec9c 100644 --- a/src/core/hle/kernel/k_slab_heap.h +++ b/src/core/hle/kernel/k_slab_heap.h @@ -7,6 +7,7 @@  #include <atomic>  #include "common/assert.h" +#include "common/common_funcs.h"  #include "common/common_types.h"  namespace Kernel { @@ -15,13 +16,17 @@ class KernelCore;  namespace impl { -class KSlabHeapImpl final : NonCopyable { +class KSlabHeapImpl final {  public: +    YUZU_NON_COPYABLE(KSlabHeapImpl); +    YUZU_NON_MOVEABLE(KSlabHeapImpl); +      struct Node {          Node* next{};      };      constexpr KSlabHeapImpl() = default; +    constexpr ~KSlabHeapImpl() = default;      void Initialize(std::size_t size) {          ASSERT(head == nullptr); @@ -64,9 +69,13 @@ private:  } // namespace impl -class KSlabHeapBase : NonCopyable { +class KSlabHeapBase {  public: +    YUZU_NON_COPYABLE(KSlabHeapBase); +    YUZU_NON_MOVEABLE(KSlabHeapBase); +      constexpr KSlabHeapBase() = default; +    constexpr ~KSlabHeapBase() = default;      constexpr bool Contains(uintptr_t addr) const {          return start <= addr && addr < end; diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h index 0979fc421..329f4ba86 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h @@ -28,10 +28,10 @@ class Layer;  /// Represents a single display type  class Display { +public:      YUZU_NON_COPYABLE(Display);      YUZU_NON_MOVEABLE(Display); -public:      /// Constructs a display with a given unique ID and name.      ///      /// @param id The unique ID for this display. | 
