mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-16 16:14:25 -04:00
kern: avoid constexpr init for many objects (avoids unnecessary memory clear) (#1668)
This commit is contained in:
parent
20716cb3de
commit
36e4914be8
77 changed files with 489 additions and 339 deletions
|
@ -19,7 +19,7 @@ namespace ams::kern {
|
|||
|
||||
/* Declare kernel data members in kernel TU. */
|
||||
constinit Kernel::State Kernel::s_state = Kernel::State::Invalid;
|
||||
constinit KResourceLimit Kernel::s_system_resource_limit;
|
||||
constinit KResourceLimit Kernel::s_system_resource_limit{util::ConstantInitialize};
|
||||
KMemoryManager Kernel::s_memory_manager;
|
||||
constinit KSupervisorPageTable Kernel::s_supervisor_page_table;
|
||||
constinit KUnsafeMemory Kernel::s_unsafe_memory;
|
||||
|
@ -33,8 +33,8 @@ namespace ams::kern {
|
|||
constinit KMemoryBlockSlabHeap Kernel::s_app_memory_block_heap;
|
||||
constinit KMemoryBlockSlabHeap Kernel::s_sys_memory_block_heap;
|
||||
constinit KBlockInfoSlabHeap Kernel::s_block_info_heap;
|
||||
constinit KPageTableManager Kernel::s_app_page_table_manager;
|
||||
constinit KPageTableManager Kernel::s_sys_page_table_manager;
|
||||
constinit KPageTableManager Kernel::s_app_page_table_manager{util::ConstantInitialize};
|
||||
constinit KPageTableManager Kernel::s_sys_page_table_manager{util::ConstantInitialize};
|
||||
constinit KMemoryBlockSlabManager Kernel::s_app_memory_block_manager;
|
||||
constinit KMemoryBlockSlabManager Kernel::s_sys_memory_block_manager;
|
||||
constinit KBlockInfoManager Kernel::s_app_block_info_manager;
|
||||
|
@ -42,11 +42,70 @@ namespace ams::kern {
|
|||
|
||||
namespace {
|
||||
|
||||
constinit std::array<KThread, cpu::NumCores> g_main_threads;
|
||||
constinit std::array<KThread, cpu::NumCores> g_idle_threads;
|
||||
template<size_t N> requires (N > 0)
|
||||
union KThreadArray {
|
||||
struct RecursiveHolder {
|
||||
KThread m_thread;
|
||||
KThreadArray<N - 1> m_next;
|
||||
|
||||
consteval RecursiveHolder() : m_thread{util::ConstantInitialize}, m_next() { /* ... */ }
|
||||
} m_holder;
|
||||
KThread m_arr[N];
|
||||
|
||||
consteval KThreadArray() : m_holder() { /* ... */ }
|
||||
};
|
||||
|
||||
template<>
|
||||
union KThreadArray<1>{
|
||||
struct RecursiveHolder {
|
||||
KThread m_thread;
|
||||
|
||||
consteval RecursiveHolder() : m_thread{util::ConstantInitialize} { /* ... */ }
|
||||
} m_holder;
|
||||
KThread m_arr[1];
|
||||
|
||||
consteval KThreadArray() : m_holder() { /* ... */ }
|
||||
};
|
||||
|
||||
template<size_t Ix>
|
||||
consteval bool IsKThreadArrayValid(const KThreadArray<Ix> &v, const KThread *thread) {
|
||||
if (std::addressof(v.m_holder.m_thread) != thread) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if constexpr (Ix == 1) {
|
||||
return true;
|
||||
} else {
|
||||
return IsKThreadArrayValid(v.m_holder.m_next, thread + 1);
|
||||
}
|
||||
}
|
||||
|
||||
template<size_t N>
|
||||
consteval bool IsKThreadArrayValid() {
|
||||
const KThreadArray<N> v{};
|
||||
|
||||
if (!IsKThreadArrayValid(v, v.m_arr)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if constexpr (N == 1) {
|
||||
return true;
|
||||
} else {
|
||||
return IsKThreadArrayValid<N - 1>();
|
||||
}
|
||||
}
|
||||
|
||||
static_assert(IsKThreadArrayValid<cpu::NumCores>());
|
||||
|
||||
constinit KThreadArray<cpu::NumCores> g_main_threads;
|
||||
constinit KThreadArray<cpu::NumCores> g_idle_threads;
|
||||
|
||||
static_assert(sizeof(g_main_threads) == cpu::NumCores * sizeof(KThread));
|
||||
static_assert(sizeof(g_main_threads.m_holder) == sizeof(g_main_threads.m_arr));
|
||||
|
||||
}
|
||||
|
||||
KThread &Kernel::GetMainThread(s32 core_id) { return g_main_threads[core_id]; }
|
||||
KThread &Kernel::GetIdleThread(s32 core_id) { return g_idle_threads[core_id]; }
|
||||
KThread &Kernel::GetMainThread(s32 core_id) { return g_main_threads.m_arr[core_id]; }
|
||||
KThread &Kernel::GetIdleThread(s32 core_id) { return g_idle_threads.m_arr[core_id]; }
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue