kernel: Fix resource release exception on exit
After rewriting the resource limit, objects releasing reserved resources require a live kernel instance. This commit fixes exceptions that occur due to the kernel being destroyed before some objects released their resources, allowing for a graceful exit.
This commit is contained in:
parent
2807a98168
commit
8e4c9c9852
|
@ -308,6 +308,9 @@ struct System::Impl {
|
||||||
// Close all CPU/threading state
|
// Close all CPU/threading state
|
||||||
cpu_manager.Shutdown();
|
cpu_manager.Shutdown();
|
||||||
|
|
||||||
|
// Release the Time Manager's resources
|
||||||
|
time_manager.Shutdown();
|
||||||
|
|
||||||
// Shutdown kernel and core timing
|
// Shutdown kernel and core timing
|
||||||
core_timing.Shutdown();
|
core_timing.Shutdown();
|
||||||
kernel.Shutdown();
|
kernel.Shutdown();
|
||||||
|
|
|
@ -101,8 +101,6 @@ struct KernelCore::Impl {
|
||||||
|
|
||||||
current_process = nullptr;
|
current_process = nullptr;
|
||||||
|
|
||||||
system_resource_limit = nullptr;
|
|
||||||
|
|
||||||
global_handle_table.Clear();
|
global_handle_table.Clear();
|
||||||
|
|
||||||
preemption_event = nullptr;
|
preemption_event = nullptr;
|
||||||
|
@ -111,6 +109,13 @@ struct KernelCore::Impl {
|
||||||
|
|
||||||
exclusive_monitor.reset();
|
exclusive_monitor.reset();
|
||||||
|
|
||||||
|
hid_shared_mem = nullptr;
|
||||||
|
font_shared_mem = nullptr;
|
||||||
|
irs_shared_mem = nullptr;
|
||||||
|
time_shared_mem = nullptr;
|
||||||
|
|
||||||
|
system_resource_limit = nullptr;
|
||||||
|
|
||||||
// Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
|
// Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
|
||||||
next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
|
next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,6 +279,10 @@ const SharedMemory& TimeManager::GetSharedMemory() const {
|
||||||
return impl->shared_memory;
|
return impl->shared_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TimeManager::Shutdown() {
|
||||||
|
impl.reset();
|
||||||
|
}
|
||||||
|
|
||||||
void TimeManager::UpdateLocalSystemClockTime(s64 posix_time) {
|
void TimeManager::UpdateLocalSystemClockTime(s64 posix_time) {
|
||||||
impl->UpdateLocalSystemClockTime(system, posix_time);
|
impl->UpdateLocalSystemClockTime(system, posix_time);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ public:
|
||||||
|
|
||||||
const SharedMemory& GetSharedMemory() const;
|
const SharedMemory& GetSharedMemory() const;
|
||||||
|
|
||||||
|
void Shutdown();
|
||||||
|
|
||||||
void SetupTimeZoneManager(std::string location_name,
|
void SetupTimeZoneManager(std::string location_name,
|
||||||
Clock::SteadyClockTimePoint time_zone_updated_time_point,
|
Clock::SteadyClockTimePoint time_zone_updated_time_point,
|
||||||
std::size_t total_location_name_count, u128 time_zone_rule_version,
|
std::size_t total_location_name_count, u128 time_zone_rule_version,
|
||||||
|
|
Reference in New Issue