summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar Liam2022-10-23 05:45:45 -0400
committerGravatar Liam2022-10-23 05:45:45 -0400
commit2d90a927c9f7652aa7e259ba57fa22ddbf8bed24 (patch)
tree031c7e8278dfea30bbbecd8a971ee4c2fc31feee /src/core/hle/kernel/kernel.cpp
parentMerge pull request #9095 from FernandoS27/meat-good-vegetable-bad (diff)
downloadyuzu-2d90a927c9f7652aa7e259ba57fa22ddbf8bed24.tar.gz
yuzu-2d90a927c9f7652aa7e259ba57fa22ddbf8bed24.tar.xz
yuzu-2d90a927c9f7652aa7e259ba57fa22ddbf8bed24.zip
core: barrier service thread shutdown
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index eed2dc9f3..fdc774e30 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -48,8 +48,8 @@ namespace Kernel {
48 48
49struct KernelCore::Impl { 49struct KernelCore::Impl {
50 explicit Impl(Core::System& system_, KernelCore& kernel_) 50 explicit Impl(Core::System& system_, KernelCore& kernel_)
51 : time_manager{system_}, 51 : time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"},
52 service_threads_manager{1, "ServiceThreadsManager"}, system{system_} {} 52 service_thread_barrier{2}, system{system_} {}
53 53
54 void SetMulticore(bool is_multi) { 54 void SetMulticore(bool is_multi) {
55 is_multicore = is_multi; 55 is_multicore = is_multi;
@@ -737,7 +737,12 @@ struct KernelCore::Impl {
737 } 737 }
738 738
739 void ClearServiceThreads() { 739 void ClearServiceThreads() {
740 service_threads_manager.QueueWork([this]() { service_threads.clear(); }); 740 service_threads_manager.QueueWork([this] {
741 service_threads.clear();
742 default_service_thread.reset();
743 service_thread_barrier.Sync();
744 });
745 service_thread_barrier.Sync();
741 } 746 }
742 747
743 std::mutex server_objects_lock; 748 std::mutex server_objects_lock;
@@ -802,6 +807,7 @@ struct KernelCore::Impl {
802 std::unordered_set<std::shared_ptr<ServiceThread>> service_threads; 807 std::unordered_set<std::shared_ptr<ServiceThread>> service_threads;
803 std::weak_ptr<ServiceThread> default_service_thread; 808 std::weak_ptr<ServiceThread> default_service_thread;
804 Common::ThreadWorker service_threads_manager; 809 Common::ThreadWorker service_threads_manager;
810 Common::Barrier service_thread_barrier;
805 811
806 std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads; 812 std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads;
807 std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; 813 std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};