summaryrefslogtreecommitdiffstats
path: root/src/core/hle
diff options
context:
space:
mode:
authorMai M <mathew1800@gmail.com>2022-01-14 06:46:16 +0100
committerGitHub <noreply@github.com>2022-01-14 06:46:16 +0100
commitb2d45a4072cbce22eaba58700982306ba1a7e605 (patch)
tree8263584ca2e8e954035dfd45115fac0dd9c7bbfa /src/core/hle
parentMerge pull request #7698 from bunnei/mem-code-memory-updates (diff)
parenthle: kernel: Fix service_threads access to be thread safe. (diff)
downloadyuzu-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')
-rw-r--r--src/core/hle/kernel/kernel.cpp34
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() {