diff options
author | Mai M <mathew1800@gmail.com> | 2022-01-14 06:46:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-14 06:46:16 +0100 |
commit | b2d45a4072cbce22eaba58700982306ba1a7e605 (patch) | |
tree | 8263584ca2e8e954035dfd45115fac0dd9c7bbfa /src/core/hle/kernel | |
parent | Merge pull request #7698 from bunnei/mem-code-memory-updates (diff) | |
parent | hle: kernel: Fix service_threads access to be thread safe. (diff) | |
download | yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar.gz yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar.bz2 yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar.lz yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar.xz yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.tar.zst yuzu-b2d45a4072cbce22eaba58700982306ba1a7e605.zip |
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 1225e1fba..e1e17db13 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -121,7 +121,7 @@ struct KernelCore::Impl { object_list_container.Finalize(); // Ensures all service threads gracefully shutdown. - service_threads.clear(); + ClearServiceThreads(); next_object_id = 0; next_kernel_process_id = KProcess::InitialKIPIDMin; @@ -704,11 +704,35 @@ struct KernelCore::Impl { return port; } + std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, + const std::string& name) { + auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); + { + std::lock_guard lk(service_threads_lock); + service_threads.emplace(service_thread); + } + return service_thread; + } + + void ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { + auto strong_ptr = service_thread.lock(); + { + std::lock_guard lk(service_threads_lock); + service_threads.erase(strong_ptr); + } + } + + void ClearServiceThreads() { + std::lock_guard lk(service_threads_lock); + service_threads.clear(); + } + std::mutex server_ports_lock; std::mutex server_sessions_lock; std::mutex registered_objects_lock; std::mutex registered_in_use_objects_lock; std::mutex dummy_thread_lock; + std::mutex service_threads_lock; std::atomic<u32> next_object_id{0}; std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; @@ -1099,15 +1123,11 @@ void KernelCore::ExitSVCProfile() { } std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { - auto service_thread = std::make_shared<Kernel::ServiceThread>(*this, 1, name); - impl->service_threads.emplace(service_thread); - return service_thread; + return impl->CreateServiceThread(*this, name); } void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { - if (auto strong_ptr = service_thread.lock()) { - impl->service_threads.erase(strong_ptr); - } + impl->ReleaseServiceThread(service_thread); } Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { |