hle: kernel: Add a flag for indicating that the kernel is currently shutting down.
This commit is contained in:
		@@ -376,11 +376,21 @@ void KScheduler::ClearSchedulerUpdateNeeded(KernelCore& kernel) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void KScheduler::DisableScheduling(KernelCore& kernel) {
 | 
			
		||||
    // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
    if (kernel.IsShuttingDown()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ASSERT(GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() >= 0);
 | 
			
		||||
    GetCurrentThreadPointer(kernel)->DisableDispatch();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduling) {
 | 
			
		||||
    // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
    if (kernel.IsShuttingDown()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ASSERT(GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() >= 1);
 | 
			
		||||
 | 
			
		||||
    if (GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() > 1) {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,11 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Lock() {
 | 
			
		||||
        // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
        if (kernel.IsShuttingDown()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (IsLockedByCurrentThread()) {
 | 
			
		||||
            // If we already own the lock, we can just increment the count.
 | 
			
		||||
            ASSERT(lock_count > 0);
 | 
			
		||||
@@ -43,6 +48,11 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Unlock() {
 | 
			
		||||
        // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
        if (kernel.IsShuttingDown()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ASSERT(IsLockedByCurrentThread());
 | 
			
		||||
        ASSERT(lock_count > 0);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1089,6 +1089,11 @@ s32 GetCurrentCoreId(KernelCore& kernel) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
KScopedDisableDispatch::~KScopedDisableDispatch() {
 | 
			
		||||
    // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
    if (kernel.IsShuttingDown()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) {
 | 
			
		||||
        auto scheduler = kernel.CurrentScheduler();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -794,6 +794,10 @@ public:
 | 
			
		||||
class KScopedDisableDispatch {
 | 
			
		||||
public:
 | 
			
		||||
    [[nodiscard]] explicit KScopedDisableDispatch(KernelCore& kernel_) : kernel{kernel_} {
 | 
			
		||||
        // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
        if (kernel.IsShuttingDown()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        GetCurrentThread(kernel).DisableDispatch();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
#include "common/assert.h"
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "common/microprofile.h"
 | 
			
		||||
#include "common/scope_exit.h"
 | 
			
		||||
#include "common/thread.h"
 | 
			
		||||
#include "common/thread_worker.h"
 | 
			
		||||
#include "core/arm/arm_interface.h"
 | 
			
		||||
@@ -90,6 +91,9 @@ struct KernelCore::Impl {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Shutdown() {
 | 
			
		||||
        is_shutting_down.store(true, std::memory_order_relaxed);
 | 
			
		||||
        SCOPE_EXIT({ is_shutting_down.store(false, std::memory_order_relaxed); });
 | 
			
		||||
 | 
			
		||||
        process_list.clear();
 | 
			
		||||
 | 
			
		||||
        // Close all open server ports.
 | 
			
		||||
@@ -338,7 +342,16 @@ struct KernelCore::Impl {
 | 
			
		||||
        is_phantom_mode_for_singlecore = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool IsShuttingDown() const {
 | 
			
		||||
        return is_shutting_down.load(std::memory_order_relaxed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    KThread* GetCurrentEmuThread() {
 | 
			
		||||
        // If we are shutting down the kernel, none of this is relevant anymore.
 | 
			
		||||
        if (IsShuttingDown()) {
 | 
			
		||||
            return {};
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const auto thread_id = GetCurrentHostThreadID();
 | 
			
		||||
        if (thread_id >= Core::Hardware::NUM_CPU_CORES) {
 | 
			
		||||
            return GetHostDummyThread();
 | 
			
		||||
@@ -754,6 +767,7 @@ struct KernelCore::Impl {
 | 
			
		||||
    std::vector<std::unique_ptr<KThread>> dummy_threads;
 | 
			
		||||
 | 
			
		||||
    bool is_multicore{};
 | 
			
		||||
    std::atomic_bool is_shutting_down{};
 | 
			
		||||
    bool is_phantom_mode_for_singlecore{};
 | 
			
		||||
    u32 single_core_thread_id{};
 | 
			
		||||
 | 
			
		||||
@@ -1066,6 +1080,10 @@ bool KernelCore::IsMulticore() const {
 | 
			
		||||
    return impl->is_multicore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool KernelCore::IsShuttingDown() const {
 | 
			
		||||
    return impl->IsShuttingDown();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void KernelCore::ExceptionalExit() {
 | 
			
		||||
    exception_exited = true;
 | 
			
		||||
    Suspend(true);
 | 
			
		||||
 
 | 
			
		||||
@@ -274,6 +274,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    bool IsMulticore() const;
 | 
			
		||||
 | 
			
		||||
    bool IsShuttingDown() const;
 | 
			
		||||
 | 
			
		||||
    void EnterSVCProfile();
 | 
			
		||||
 | 
			
		||||
    void ExitSVCProfile();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user