summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2022-10-25 12:45:51 +0200
committerGitHub <noreply@github.com>2022-10-25 12:45:51 +0200
commit3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986 (patch)
tree94deaac51d8ca9abd7c9b3f4bce3a420c6ab8ac8 /src/core/hle/kernel
parentMerge pull request #8873 from vonchenplus/fix_legacy_location_error (diff)
parentcore: barrier service thread shutdown (diff)
downloadyuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar.gz
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar.bz2
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar.lz
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar.xz
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.tar.zst
yuzu-3c38bd7cf0dbe73f72c008cb6fc0df38b50dc986.zip
Diffstat (limited to 'src/core/hle/kernel')
-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 {
struct KernelCore::Impl {
explicit Impl(Core::System& system_, KernelCore& kernel_)
- : time_manager{system_},
- service_threads_manager{1, "ServiceThreadsManager"}, system{system_} {}
+ : time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"},
+ service_thread_barrier{2}, system{system_} {}
void SetMulticore(bool is_multi) {
is_multicore = is_multi;
@@ -737,7 +737,12 @@ struct KernelCore::Impl {
}
void ClearServiceThreads() {
- service_threads_manager.QueueWork([this]() { service_threads.clear(); });
+ service_threads_manager.QueueWork([this] {
+ service_threads.clear();
+ default_service_thread.reset();
+ service_thread_barrier.Sync();
+ });
+ service_thread_barrier.Sync();
}
std::mutex server_objects_lock;
@@ -802,6 +807,7 @@ struct KernelCore::Impl {
std::unordered_set<std::shared_ptr<ServiceThread>> service_threads;
std::weak_ptr<ServiceThread> default_service_thread;
Common::ThreadWorker service_threads_manager;
+ Common::Barrier service_thread_barrier;
std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads;
std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};