From 183243bf1677bb67bcd67f4e98689306365c9d8b Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 17 Sep 2021 15:03:21 -0700 Subject: [PATCH] kern: optimize handle table layout --- .../mesosphere/kern_k_handle_table.hpp | 25 ++++--------------- .../source/kern_k_handle_table.cpp | 12 ++++----- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/libraries/libmesosphere/include/mesosphere/kern_k_handle_table.hpp b/libraries/libmesosphere/include/mesosphere/kern_k_handle_table.hpp index 0babf545b..dbc18d8a6 100644 --- a/libraries/libmesosphere/include/mesosphere/kern_k_handle_table.hpp +++ b/libraries/libmesosphere/include/mesosphere/kern_k_handle_table.hpp @@ -54,14 +54,10 @@ namespace ams::kern { } union EntryInfo { - struct { - u16 linear_id; - u16 type; - } info; - s32 next_free_index; + u16 linear_id; + s16 next_free_index; - constexpr ALWAYS_INLINE u16 GetLinearId() const { return info.linear_id; } - constexpr ALWAYS_INLINE u16 GetType() const { return info.type; } + constexpr ALWAYS_INLINE u16 GetLinearId() const { return linear_id; } constexpr ALWAYS_INLINE s32 GetNextFreeIndex() const { return next_free_index; } }; private: @@ -187,17 +183,8 @@ namespace ams::kern { NOINLINE Result Reserve(ams::svc::Handle *out_handle); NOINLINE void Unreserve(ams::svc::Handle handle); - template - ALWAYS_INLINE Result Add(ams::svc::Handle *out_handle, T *obj) { - static_assert(std::is_base_of::value); - return this->Add(out_handle, obj, obj->GetTypeObj().GetClassToken()); - } - - template - ALWAYS_INLINE void Register(ams::svc::Handle handle, T *obj) { - static_assert(std::is_base_of::value); - return this->Register(handle, obj, obj->GetTypeObj().GetClassToken()); - } + NOINLINE Result Add(ams::svc::Handle *out_handle, KAutoObject *obj); + NOINLINE void Register(ams::svc::Handle handle, KAutoObject *obj); template ALWAYS_INLINE bool GetMultipleObjects(T **out, const ams::svc::Handle *handles, size_t num_handles) const { @@ -242,8 +229,6 @@ namespace ams::kern { return false; } private: - NOINLINE Result Add(ams::svc::Handle *out_handle, KAutoObject *obj, u16 type); - NOINLINE void Register(ams::svc::Handle handle, KAutoObject *obj, u16 type); constexpr ALWAYS_INLINE s32 AllocateEntry() { MESOSPHERE_ASSERT_THIS(); diff --git a/libraries/libmesosphere/source/kern_k_handle_table.cpp b/libraries/libmesosphere/source/kern_k_handle_table.cpp index 8a78013d2..6b366b9a4 100644 --- a/libraries/libmesosphere/source/kern_k_handle_table.cpp +++ b/libraries/libmesosphere/source/kern_k_handle_table.cpp @@ -74,7 +74,7 @@ namespace ams::kern { return true; } - Result KHandleTable::Add(ams::svc::Handle *out_handle, KAutoObject *obj, u16 type) { + Result KHandleTable::Add(ams::svc::Handle *out_handle, KAutoObject *obj) { MESOSPHERE_ASSERT_THIS(); KScopedDisableDispatch dd; KScopedSpinLock lk(m_lock); @@ -87,8 +87,8 @@ namespace ams::kern { const auto linear_id = this->AllocateLinearId(); const auto index = this->AllocateEntry(); - m_entry_infos[index].info = { .linear_id = linear_id, .type = type }; - m_objects[index] = obj; + m_entry_infos[index].linear_id = linear_id; + m_objects[index] = obj; obj->Open(); @@ -131,7 +131,7 @@ namespace ams::kern { } } - void KHandleTable::Register(ams::svc::Handle handle, KAutoObject *obj, u16 type) { + void KHandleTable::Register(ams::svc::Handle handle, KAutoObject *obj) { MESOSPHERE_ASSERT_THIS(); KScopedDisableDispatch dd; KScopedSpinLock lk(m_lock); @@ -149,8 +149,8 @@ namespace ams::kern { /* Set the entry. */ MESOSPHERE_ASSERT(m_objects[index] == nullptr); - m_entry_infos[index].info = { .linear_id = linear_id, .type = type }; - m_objects[index] = obj; + m_entry_infos[index].linear_id = linear_id; + m_objects[index] = obj; obj->Open(); }