diff options
| author | 2021-11-17 15:00:55 -0800 | |
|---|---|---|
| committer | 2021-11-17 15:29:25 -0800 | |
| commit | d8a783a368cf2df4a2c7143cabd33cc134d6d79b (patch) | |
| tree | ce1ca215518769eb01541fdf57e3a1aa3b470a14 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #7219 from FernandoS27/aristotles-right-testicle (diff) | |
| download | yuzu-d8a783a368cf2df4a2c7143cabd33cc134d6d79b.tar.gz yuzu-d8a783a368cf2df4a2c7143cabd33cc134d6d79b.tar.xz yuzu-d8a783a368cf2df4a2c7143cabd33cc134d6d79b.zip | |
Fix crash on exit due to static scoped dummy threads
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index e42a6d36f..45e86a677 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -300,15 +300,16 @@ struct KernelCore::Impl { | |||
| 300 | // Gets the dummy KThread for the caller, allocating a new one if this is the first time | 300 | // Gets the dummy KThread for the caller, allocating a new one if this is the first time |
| 301 | KThread* GetHostDummyThread() { | 301 | KThread* GetHostDummyThread() { |
| 302 | auto make_thread = [this]() { | 302 | auto make_thread = [this]() { |
| 303 | std::unique_ptr<KThread> thread = std::make_unique<KThread>(system.Kernel()); | 303 | std::lock_guard lk(dummy_thread_lock); |
| 304 | auto& thread = dummy_threads.emplace_back(std::make_unique<KThread>(system.Kernel())); | ||
| 304 | KAutoObject::Create(thread.get()); | 305 | KAutoObject::Create(thread.get()); |
| 305 | ASSERT(KThread::InitializeDummyThread(thread.get()).IsSuccess()); | 306 | ASSERT(KThread::InitializeDummyThread(thread.get()).IsSuccess()); |
| 306 | thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId())); | 307 | thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId())); |
| 307 | return thread; | 308 | return thread.get(); |
| 308 | }; | 309 | }; |
| 309 | 310 | ||
| 310 | thread_local auto thread = make_thread(); | 311 | thread_local KThread* saved_thread = make_thread(); |
| 311 | return thread.get(); | 312 | return saved_thread; |
| 312 | } | 313 | } |
| 313 | 314 | ||
| 314 | /// Registers a CPU core thread by allocating a host thread ID for it | 315 | /// Registers a CPU core thread by allocating a host thread ID for it |
| @@ -695,6 +696,12 @@ struct KernelCore::Impl { | |||
| 695 | return port; | 696 | return port; |
| 696 | } | 697 | } |
| 697 | 698 | ||
| 699 | std::mutex server_ports_lock; | ||
| 700 | std::mutex server_sessions_lock; | ||
| 701 | std::mutex registered_objects_lock; | ||
| 702 | std::mutex registered_in_use_objects_lock; | ||
| 703 | std::mutex dummy_thread_lock; | ||
| 704 | |||
| 698 | std::atomic<u32> next_object_id{0}; | 705 | std::atomic<u32> next_object_id{0}; |
| 699 | std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; | 706 | std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; |
| 700 | std::atomic<u64> next_user_process_id{KProcess::ProcessIDMin}; | 707 | std::atomic<u64> next_user_process_id{KProcess::ProcessIDMin}; |
| @@ -725,10 +732,6 @@ struct KernelCore::Impl { | |||
| 725 | std::unordered_set<KServerSession*> server_sessions; | 732 | std::unordered_set<KServerSession*> server_sessions; |
| 726 | std::unordered_set<KAutoObject*> registered_objects; | 733 | std::unordered_set<KAutoObject*> registered_objects; |
| 727 | std::unordered_set<KAutoObject*> registered_in_use_objects; | 734 | std::unordered_set<KAutoObject*> registered_in_use_objects; |
| 728 | std::mutex server_ports_lock; | ||
| 729 | std::mutex server_sessions_lock; | ||
| 730 | std::mutex registered_objects_lock; | ||
| 731 | std::mutex registered_in_use_objects_lock; | ||
| 732 | 735 | ||
| 733 | std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; | 736 | std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; |
| 734 | std::vector<Kernel::PhysicalCore> cores; | 737 | std::vector<Kernel::PhysicalCore> cores; |
| @@ -753,6 +756,9 @@ struct KernelCore::Impl { | |||
| 753 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; | 756 | std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; |
| 754 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; | 757 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; |
| 755 | 758 | ||
| 759 | // Specifically tracked to be automatically destroyed with kernel | ||
| 760 | std::vector<std::unique_ptr<KThread>> dummy_threads; | ||
| 761 | |||
| 756 | bool is_multicore{}; | 762 | bool is_multicore{}; |
| 757 | bool is_phantom_mode_for_singlecore{}; | 763 | bool is_phantom_mode_for_singlecore{}; |
| 758 | u32 single_core_thread_id{}; | 764 | u32 single_core_thread_id{}; |