summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2020-12-03 22:26:42 -0800
committerGravatar bunnei2020-12-06 00:03:24 -0800
commitccce6cb3be062fc7ae162bed32202538ebc2e3d9 (patch)
tree206612bfc3718371d2355c8e3447aba288b1828f /src
parenthle: kernel: Separate KScopedSchedulerLockAndSleep from k_scheduler. (diff)
downloadyuzu-ccce6cb3be062fc7ae162bed32202538ebc2e3d9.tar.gz
yuzu-ccce6cb3be062fc7ae162bed32202538ebc2e3d9.tar.xz
yuzu-ccce6cb3be062fc7ae162bed32202538ebc2e3d9.zip
hle: kernel: Migrate to KScopedSchedulerLock.
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt1
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp10
-rw-r--r--src/core/hle/kernel/global_scheduler_context.h12
-rw-r--r--src/core/hle/kernel/k_scheduler.cpp15
-rw-r--r--src/core/hle/kernel/k_scheduler.h10
-rw-r--r--src/core/hle/kernel/k_scoped_lock.h39
-rw-r--r--src/core/hle/kernel/kernel.cpp4
-rw-r--r--src/core/hle/kernel/mutex.cpp6
-rw-r--r--src/core/hle/kernel/process.cpp8
-rw-r--r--src/core/hle/kernel/readable_event.cpp2
-rw-r--r--src/core/hle/kernel/server_session.cpp2
-rw-r--r--src/core/hle/kernel/svc.cpp8
-rw-r--r--src/core/hle/kernel/synchronization.cpp4
-rw-r--r--src/core/hle/kernel/thread.cpp17
-rw-r--r--src/core/hle/kernel/time_manager.cpp2
15 files changed, 92 insertions, 48 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 5f6dce52a..eb1fbcb61 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -159,6 +159,7 @@ add_library(core STATIC
159 hle/kernel/k_scheduler.cpp 159 hle/kernel/k_scheduler.cpp
160 hle/kernel/k_scheduler.h 160 hle/kernel/k_scheduler.h
161 hle/kernel/k_scheduler_lock.h 161 hle/kernel/k_scheduler_lock.h
162 hle/kernel/k_scoped_lock.h
162 hle/kernel/k_scoped_scheduler_lock_and_sleep.h 163 hle/kernel/k_scoped_scheduler_lock_and_sleep.h
163 hle/kernel/kernel.cpp 164 hle/kernel/kernel.cpp
164 hle/kernel/kernel.h 165 hle/kernel/kernel.h
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index ac4913173..20ffa7d47 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -59,7 +59,7 @@ ResultCode AddressArbiter::SignalToAddress(VAddr address, SignalType type, s32 v
59} 59}
60 60
61ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) { 61ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) {
62 SchedulerLock lock(system.Kernel()); 62 KScopedSchedulerLock lock(system.Kernel());
63 const std::vector<std::shared_ptr<Thread>> waiting_threads = 63 const std::vector<std::shared_ptr<Thread>> waiting_threads =
64 GetThreadsWaitingOnAddress(address); 64 GetThreadsWaitingOnAddress(address);
65 WakeThreads(waiting_threads, num_to_wake); 65 WakeThreads(waiting_threads, num_to_wake);
@@ -68,7 +68,7 @@ ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) {
68 68
69ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, 69ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32 value,
70 s32 num_to_wake) { 70 s32 num_to_wake) {
71 SchedulerLock lock(system.Kernel()); 71 KScopedSchedulerLock lock(system.Kernel());
72 auto& memory = system.Memory(); 72 auto& memory = system.Memory();
73 73
74 // Ensure that we can write to the address. 74 // Ensure that we can write to the address.
@@ -93,7 +93,7 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32
93 93
94ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, 94ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value,
95 s32 num_to_wake) { 95 s32 num_to_wake) {
96 SchedulerLock lock(system.Kernel()); 96 KScopedSchedulerLock lock(system.Kernel());
97 auto& memory = system.Memory(); 97 auto& memory = system.Memory();
98 98
99 // Ensure that we can write to the address. 99 // Ensure that we can write to the address.
@@ -211,7 +211,7 @@ ResultCode AddressArbiter::WaitForAddressIfLessThan(VAddr address, s32 value, s6
211 } 211 }
212 212
213 { 213 {
214 SchedulerLock lock(kernel); 214 KScopedSchedulerLock lock(kernel);
215 if (current_thread->IsWaitingForArbitration()) { 215 if (current_thread->IsWaitingForArbitration()) {
216 RemoveThread(SharedFrom(current_thread)); 216 RemoveThread(SharedFrom(current_thread));
217 current_thread->WaitForArbitration(false); 217 current_thread->WaitForArbitration(false);
@@ -266,7 +266,7 @@ ResultCode AddressArbiter::WaitForAddressIfEqual(VAddr address, s32 value, s64 t
266 } 266 }
267 267
268 { 268 {
269 SchedulerLock lock(kernel); 269 KScopedSchedulerLock lock(kernel);
270 if (current_thread->IsWaitingForArbitration()) { 270 if (current_thread->IsWaitingForArbitration()) {
271 RemoveThread(SharedFrom(current_thread)); 271 RemoveThread(SharedFrom(current_thread));
272 current_thread->WaitForArbitration(false); 272 current_thread->WaitForArbitration(false);
diff --git a/src/core/hle/kernel/global_scheduler_context.h b/src/core/hle/kernel/global_scheduler_context.h
index 39c383746..c4bc23eed 100644
--- a/src/core/hle/kernel/global_scheduler_context.h
+++ b/src/core/hle/kernel/global_scheduler_context.h
@@ -27,6 +27,8 @@ class GlobalSchedulerContext final {
27 friend class KScheduler; 27 friend class KScheduler;
28 28
29public: 29public:
30 using LockType = KAbstractSchedulerLock<KScheduler>;
31
30 explicit GlobalSchedulerContext(KernelCore& kernel); 32 explicit GlobalSchedulerContext(KernelCore& kernel);
31 ~GlobalSchedulerContext(); 33 ~GlobalSchedulerContext();
32 34
@@ -53,8 +55,16 @@ public:
53 /// Returns true if the global scheduler lock is acquired 55 /// Returns true if the global scheduler lock is acquired
54 bool IsLocked() const; 56 bool IsLocked() const;
55 57
58 LockType& SchedulerLock() {
59 return scheduler_lock;
60 }
61
62 const LockType& SchedulerLock() const {
63 return scheduler_lock;
64 }
65
56private: 66private:
57 friend class SchedulerLock; 67 friend class KScopedSchedulerLock;
58 friend class KScopedSchedulerLockAndSleep; 68 friend class KScopedSchedulerLockAndSleep;
59 69
60 KernelCore& kernel; 70 KernelCore& kernel;
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp
index 466147498..9645fee22 100644
--- a/src/core/hle/kernel/k_scheduler.cpp
+++ b/src/core/hle/kernel/k_scheduler.cpp
@@ -410,7 +410,7 @@ void KScheduler::YieldWithoutCoreMigration() {
410 410
411 /* Perform the yield. */ 411 /* Perform the yield. */
412 { 412 {
413 SchedulerLock lock(kernel); 413 KScopedSchedulerLock lock(kernel);
414 414
415 const auto cur_state = cur_thread.scheduling_state; 415 const auto cur_state = cur_thread.scheduling_state;
416 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) { 416 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) {
@@ -451,7 +451,7 @@ void KScheduler::YieldWithCoreMigration() {
451 451
452 /* Perform the yield. */ 452 /* Perform the yield. */
453 { 453 {
454 SchedulerLock lock(kernel); 454 KScopedSchedulerLock lock(kernel);
455 455
456 const auto cur_state = cur_thread.scheduling_state; 456 const auto cur_state = cur_thread.scheduling_state;
457 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) { 457 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) {
@@ -541,7 +541,7 @@ void KScheduler::YieldToAnyThread() {
541 541
542 /* Perform the yield. */ 542 /* Perform the yield. */
543 { 543 {
544 SchedulerLock lock(kernel); 544 KScopedSchedulerLock lock(kernel);
545 545
546 const auto cur_state = cur_thread.scheduling_state; 546 const auto cur_state = cur_thread.scheduling_state;
547 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) { 547 if (cur_state == static_cast<u32>(ThreadSchedStatus::Runnable)) {
@@ -793,12 +793,9 @@ void KScheduler::Initialize() {
793 } 793 }
794} 794}
795 795
796SchedulerLock::SchedulerLock(KernelCore& kernel) : kernel{kernel} { 796KScopedSchedulerLock::KScopedSchedulerLock(KernelCore& kernel)
797 kernel.GlobalSchedulerContext().Lock(); 797 : KScopedLock(kernel.GlobalSchedulerContext().SchedulerLock()) {}
798}
799 798
800SchedulerLock::~SchedulerLock() { 799KScopedSchedulerLock::~KScopedSchedulerLock() = default;
801 kernel.GlobalSchedulerContext().Unlock();
802}
803 800
804} // namespace Kernel 801} // namespace Kernel
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h
index 5ba0f3c32..d52ecc0db 100644
--- a/src/core/hle/kernel/k_scheduler.h
+++ b/src/core/hle/kernel/k_scheduler.h
@@ -14,6 +14,7 @@
14#include "core/hle/kernel/global_scheduler_context.h" 14#include "core/hle/kernel/global_scheduler_context.h"
15#include "core/hle/kernel/k_priority_queue.h" 15#include "core/hle/kernel/k_priority_queue.h"
16#include "core/hle/kernel/k_scheduler_lock.h" 16#include "core/hle/kernel/k_scheduler_lock.h"
17#include "core/hle/kernel/k_scoped_lock.h"
17 18
18namespace Common { 19namespace Common {
19class Fiber; 20class Fiber;
@@ -198,13 +199,10 @@ private:
198 Common::SpinLock guard{}; 199 Common::SpinLock guard{};
199}; 200};
200 201
201class SchedulerLock { 202class KScopedSchedulerLock : KScopedLock<GlobalSchedulerContext::LockType> {
202public: 203public:
203 [[nodiscard]] explicit SchedulerLock(KernelCore& kernel); 204 explicit KScopedSchedulerLock(KernelCore& kernel);
204 ~SchedulerLock(); 205 ~KScopedSchedulerLock();
205
206protected:
207 KernelCore& kernel;
208}; 206};
209 207
210} // namespace Kernel 208} // namespace Kernel
diff --git a/src/core/hle/kernel/k_scoped_lock.h b/src/core/hle/kernel/k_scoped_lock.h
new file mode 100644
index 000000000..03320859f
--- /dev/null
+++ b/src/core/hle/kernel/k_scoped_lock.h
@@ -0,0 +1,39 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5// This file references various implementation details from Atmosphere, an open-source firmware for
6// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
7
8#pragma once
9
10#include "common/common_types.h"
11
12namespace Kernel {
13
14template <typename T>
15concept KLockable = !std::is_reference<T>::value && requires(T & t) {
16 { t.Lock() }
17 ->std::same_as<void>;
18 { t.Unlock() }
19 ->std::same_as<void>;
20};
21
22template <typename T>
23requires KLockable<T> class KScopedLock : NonCopyable {
24
25private:
26 T* lock_ptr;
27
28public:
29 explicit KScopedLock(T* l) : lock_ptr(l) {
30 this->lock_ptr->Lock();
31 }
32 explicit KScopedLock(T& l) : KScopedLock(std::addressof(l)) { /* ... */
33 }
34 ~KScopedLock() {
35 this->lock_ptr->Unlock();
36 }
37};
38
39} // namespace Kernel
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index b74e34c40..04cae3a43 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -146,7 +146,7 @@ struct KernelCore::Impl {
146 preemption_event = Core::Timing::CreateEvent( 146 preemption_event = Core::Timing::CreateEvent(
147 "PreemptionCallback", [this, &kernel](std::uintptr_t, std::chrono::nanoseconds) { 147 "PreemptionCallback", [this, &kernel](std::uintptr_t, std::chrono::nanoseconds) {
148 { 148 {
149 SchedulerLock lock(kernel); 149 KScopedSchedulerLock lock(kernel);
150 global_scheduler_context->PreemptThreads(); 150 global_scheduler_context->PreemptThreads();
151 } 151 }
152 const auto time_interval = std::chrono::nanoseconds{ 152 const auto time_interval = std::chrono::nanoseconds{
@@ -612,7 +612,7 @@ const Kernel::SharedMemory& KernelCore::GetTimeSharedMem() const {
612void KernelCore::Suspend(bool in_suspention) { 612void KernelCore::Suspend(bool in_suspention) {
613 const bool should_suspend = exception_exited || in_suspention; 613 const bool should_suspend = exception_exited || in_suspention;
614 { 614 {
615 SchedulerLock lock(*this); 615 KScopedSchedulerLock lock(*this);
616 ThreadStatus status = should_suspend ? ThreadStatus::Ready : ThreadStatus::WaitSleep; 616 ThreadStatus status = should_suspend ? ThreadStatus::Ready : ThreadStatus::WaitSleep;
617 for (std::size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { 617 for (std::size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) {
618 impl->suspend_threads[i]->SetStatus(status); 618 impl->suspend_threads[i]->SetStatus(status);
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index 6299b1342..4f8075e0e 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -75,7 +75,7 @@ ResultCode Mutex::TryAcquire(VAddr address, Handle holding_thread_handle,
75 std::shared_ptr<Thread> current_thread = 75 std::shared_ptr<Thread> current_thread =
76 SharedFrom(kernel.CurrentScheduler()->GetCurrentThread()); 76 SharedFrom(kernel.CurrentScheduler()->GetCurrentThread());
77 { 77 {
78 SchedulerLock lock(kernel); 78 KScopedSchedulerLock lock(kernel);
79 // The mutex address must be 4-byte aligned 79 // The mutex address must be 4-byte aligned
80 if ((address % sizeof(u32)) != 0) { 80 if ((address % sizeof(u32)) != 0) {
81 return ERR_INVALID_ADDRESS; 81 return ERR_INVALID_ADDRESS;
@@ -114,7 +114,7 @@ ResultCode Mutex::TryAcquire(VAddr address, Handle holding_thread_handle,
114 } 114 }
115 115
116 { 116 {
117 SchedulerLock lock(kernel); 117 KScopedSchedulerLock lock(kernel);
118 auto* owner = current_thread->GetLockOwner(); 118 auto* owner = current_thread->GetLockOwner();
119 if (owner != nullptr) { 119 if (owner != nullptr) {
120 owner->RemoveMutexWaiter(current_thread); 120 owner->RemoveMutexWaiter(current_thread);
@@ -153,7 +153,7 @@ std::pair<ResultCode, std::shared_ptr<Thread>> Mutex::Unlock(std::shared_ptr<Thr
153 153
154ResultCode Mutex::Release(VAddr address) { 154ResultCode Mutex::Release(VAddr address) {
155 auto& kernel = system.Kernel(); 155 auto& kernel = system.Kernel();
156 SchedulerLock lock(kernel); 156 KScopedSchedulerLock lock(kernel);
157 157
158 std::shared_ptr<Thread> current_thread = 158 std::shared_ptr<Thread> current_thread =
159 SharedFrom(kernel.CurrentScheduler()->GetCurrentThread()); 159 SharedFrom(kernel.CurrentScheduler()->GetCurrentThread());
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 238c03a13..b905b486a 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -54,7 +54,7 @@ void SetupMainThread(Core::System& system, Process& owner_process, u32 priority,
54 auto& kernel = system.Kernel(); 54 auto& kernel = system.Kernel();
55 // Threads by default are dormant, wake up the main thread so it runs when the scheduler fires 55 // Threads by default are dormant, wake up the main thread so it runs when the scheduler fires
56 { 56 {
57 SchedulerLock lock{kernel}; 57 KScopedSchedulerLock lock{kernel};
58 thread->SetStatus(ThreadStatus::Ready); 58 thread->SetStatus(ThreadStatus::Ready);
59 } 59 }
60} 60}
@@ -213,7 +213,7 @@ void Process::UnregisterThread(const Thread* thread) {
213} 213}
214 214
215ResultCode Process::ClearSignalState() { 215ResultCode Process::ClearSignalState() {
216 SchedulerLock lock(system.Kernel()); 216 KScopedSchedulerLock lock(system.Kernel());
217 if (status == ProcessStatus::Exited) { 217 if (status == ProcessStatus::Exited) {
218 LOG_ERROR(Kernel, "called on a terminated process instance."); 218 LOG_ERROR(Kernel, "called on a terminated process instance.");
219 return ERR_INVALID_STATE; 219 return ERR_INVALID_STATE;
@@ -347,7 +347,7 @@ static auto FindTLSPageWithAvailableSlots(std::vector<TLSPage>& tls_pages) {
347} 347}
348 348
349VAddr Process::CreateTLSRegion() { 349VAddr Process::CreateTLSRegion() {
350 SchedulerLock lock(system.Kernel()); 350 KScopedSchedulerLock lock(system.Kernel());
351 if (auto tls_page_iter{FindTLSPageWithAvailableSlots(tls_pages)}; 351 if (auto tls_page_iter{FindTLSPageWithAvailableSlots(tls_pages)};
352 tls_page_iter != tls_pages.cend()) { 352 tls_page_iter != tls_pages.cend()) {
353 return *tls_page_iter->ReserveSlot(); 353 return *tls_page_iter->ReserveSlot();
@@ -378,7 +378,7 @@ VAddr Process::CreateTLSRegion() {
378} 378}
379 379
380void Process::FreeTLSRegion(VAddr tls_address) { 380void Process::FreeTLSRegion(VAddr tls_address) {
381 SchedulerLock lock(system.Kernel()); 381 KScopedSchedulerLock lock(system.Kernel());
382 const VAddr aligned_address = Common::AlignDown(tls_address, Core::Memory::PAGE_SIZE); 382 const VAddr aligned_address = Common::AlignDown(tls_address, Core::Memory::PAGE_SIZE);
383 auto iter = 383 auto iter =
384 std::find_if(tls_pages.begin(), tls_pages.end(), [aligned_address](const auto& page) { 384 std::find_if(tls_pages.begin(), tls_pages.end(), [aligned_address](const auto& page) {
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp
index 927f88fed..cea262ce0 100644
--- a/src/core/hle/kernel/readable_event.cpp
+++ b/src/core/hle/kernel/readable_event.cpp
@@ -39,7 +39,7 @@ void ReadableEvent::Clear() {
39} 39}
40 40
41ResultCode ReadableEvent::Reset() { 41ResultCode ReadableEvent::Reset() {
42 SchedulerLock lock(kernel); 42 KScopedSchedulerLock lock(kernel);
43 if (!is_signaled) { 43 if (!is_signaled) {
44 LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}", 44 LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}",
45 GetObjectId(), GetTypeName(), GetName()); 45 GetObjectId(), GetTypeName(), GetName());
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index bf2c90028..78e41b13e 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -171,7 +171,7 @@ ResultCode ServerSession::CompleteSyncRequest() {
171 171
172 // Some service requests require the thread to block 172 // Some service requests require the thread to block
173 { 173 {
174 SchedulerLock lock(kernel); 174 KScopedSchedulerLock lock(kernel);
175 if (!context.IsThreadWaiting()) { 175 if (!context.IsThreadWaiting()) {
176 context.GetThread().ResumeFromWait(); 176 context.GetThread().ResumeFromWait();
177 context.GetThread().SetSynchronizationResults(nullptr, result); 177 context.GetThread().SetSynchronizationResults(nullptr, result);
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 2760a307c..30d60aeb6 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -345,7 +345,7 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) {
345 345
346 auto thread = kernel.CurrentScheduler()->GetCurrentThread(); 346 auto thread = kernel.CurrentScheduler()->GetCurrentThread();
347 { 347 {
348 SchedulerLock lock(kernel); 348 KScopedSchedulerLock lock(kernel);
349 thread->InvalidateHLECallback(); 349 thread->InvalidateHLECallback();
350 thread->SetStatus(ThreadStatus::WaitIPC); 350 thread->SetStatus(ThreadStatus::WaitIPC);
351 session->SendSyncRequest(SharedFrom(thread), system.Memory(), system.CoreTiming()); 351 session->SendSyncRequest(SharedFrom(thread), system.Memory(), system.CoreTiming());
@@ -359,7 +359,7 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) {
359 } 359 }
360 360
361 { 361 {
362 SchedulerLock lock(kernel); 362 KScopedSchedulerLock lock(kernel);
363 auto* sync_object = thread->GetHLESyncObject(); 363 auto* sync_object = thread->GetHLESyncObject();
364 sync_object->RemoveWaitingThread(SharedFrom(thread)); 364 sync_object->RemoveWaitingThread(SharedFrom(thread));
365 } 365 }
@@ -1691,7 +1691,7 @@ static ResultCode WaitProcessWideKeyAtomic(Core::System& system, VAddr mutex_add
1691 } 1691 }
1692 1692
1693 { 1693 {
1694 SchedulerLock lock(kernel); 1694 KScopedSchedulerLock lock(kernel);
1695 1695
1696 auto* owner = current_thread->GetLockOwner(); 1696 auto* owner = current_thread->GetLockOwner();
1697 if (owner != nullptr) { 1697 if (owner != nullptr) {
@@ -1724,7 +1724,7 @@ static void SignalProcessWideKey(Core::System& system, VAddr condition_variable_
1724 1724
1725 // Retrieve a list of all threads that are waiting for this condition variable. 1725 // Retrieve a list of all threads that are waiting for this condition variable.
1726 auto& kernel = system.Kernel(); 1726 auto& kernel = system.Kernel();
1727 SchedulerLock lock(kernel); 1727 KScopedSchedulerLock lock(kernel);
1728 auto* const current_process = kernel.CurrentProcess(); 1728 auto* const current_process = kernel.CurrentProcess();
1729 std::vector<std::shared_ptr<Thread>> waiting_threads = 1729 std::vector<std::shared_ptr<Thread>> waiting_threads =
1730 current_process->GetConditionVariableThreads(condition_variable_addr); 1730 current_process->GetConditionVariableThreads(condition_variable_addr);
diff --git a/src/core/hle/kernel/synchronization.cpp b/src/core/hle/kernel/synchronization.cpp
index 6651ad90c..d3f520ea2 100644
--- a/src/core/hle/kernel/synchronization.cpp
+++ b/src/core/hle/kernel/synchronization.cpp
@@ -19,7 +19,7 @@ Synchronization::Synchronization(Core::System& system) : system{system} {}
19 19
20void Synchronization::SignalObject(SynchronizationObject& obj) const { 20void Synchronization::SignalObject(SynchronizationObject& obj) const {
21 auto& kernel = system.Kernel(); 21 auto& kernel = system.Kernel();
22 SchedulerLock lock(kernel); 22 KScopedSchedulerLock lock(kernel);
23 if (obj.IsSignaled()) { 23 if (obj.IsSignaled()) {
24 for (auto thread : obj.GetWaitingThreads()) { 24 for (auto thread : obj.GetWaitingThreads()) {
25 if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) { 25 if (thread->GetSchedulingStatus() == ThreadSchedStatus::Paused) {
@@ -90,7 +90,7 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor(
90 } 90 }
91 91
92 { 92 {
93 SchedulerLock lock(kernel); 93 KScopedSchedulerLock lock(kernel);
94 ResultCode signaling_result = thread->GetSignalingResult(); 94 ResultCode signaling_result = thread->GetSignalingResult();
95 SynchronizationObject* signaling_object = thread->GetSignalingObject(); 95 SynchronizationObject* signaling_object = thread->GetSignalingObject();
96 thread->SetSynchronizationObjects(nullptr); 96 thread->SetSynchronizationObjects(nullptr);
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 6f89238ca..a4f9e0d97 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -51,7 +51,7 @@ Thread::~Thread() = default;
51 51
52void Thread::Stop() { 52void Thread::Stop() {
53 { 53 {
54 SchedulerLock lock(kernel); 54 KScopedSchedulerLock lock(kernel);
55 SetStatus(ThreadStatus::Dead); 55 SetStatus(ThreadStatus::Dead);
56 Signal(); 56 Signal();
57 kernel.GlobalHandleTable().Close(global_handle); 57 kernel.GlobalHandleTable().Close(global_handle);
@@ -68,7 +68,7 @@ void Thread::Stop() {
68} 68}
69 69
70void Thread::ResumeFromWait() { 70void Thread::ResumeFromWait() {
71 SchedulerLock lock(kernel); 71 KScopedSchedulerLock lock(kernel);
72 switch (status) { 72 switch (status) {
73 case ThreadStatus::Paused: 73 case ThreadStatus::Paused:
74 case ThreadStatus::WaitSynch: 74 case ThreadStatus::WaitSynch:
@@ -100,19 +100,18 @@ void Thread::ResumeFromWait() {
100} 100}
101 101
102void Thread::OnWakeUp() { 102void Thread::OnWakeUp() {
103 SchedulerLock lock(kernel); 103 KScopedSchedulerLock lock(kernel);
104
105 SetStatus(ThreadStatus::Ready); 104 SetStatus(ThreadStatus::Ready);
106} 105}
107 106
108ResultCode Thread::Start() { 107ResultCode Thread::Start() {
109 SchedulerLock lock(kernel); 108 KScopedSchedulerLock lock(kernel);
110 SetStatus(ThreadStatus::Ready); 109 SetStatus(ThreadStatus::Ready);
111 return RESULT_SUCCESS; 110 return RESULT_SUCCESS;
112} 111}
113 112
114void Thread::CancelWait() { 113void Thread::CancelWait() {
115 SchedulerLock lock(kernel); 114 KScopedSchedulerLock lock(kernel);
116 if (GetSchedulingStatus() != ThreadSchedStatus::Paused || !is_waiting_on_sync) { 115 if (GetSchedulingStatus() != ThreadSchedStatus::Paused || !is_waiting_on_sync) {
117 is_sync_cancelled = true; 116 is_sync_cancelled = true;
118 return; 117 return;
@@ -228,7 +227,7 @@ ResultVal<std::shared_ptr<Thread>> Thread::Create(Core::System& system, ThreadTy
228} 227}
229 228
230void Thread::SetPriority(u32 priority) { 229void Thread::SetPriority(u32 priority) {
231 SchedulerLock lock(kernel); 230 KScopedSchedulerLock lock(kernel);
232 ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST, 231 ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST,
233 "Invalid priority value."); 232 "Invalid priority value.");
234 nominal_priority = priority; 233 nominal_priority = priority;
@@ -365,7 +364,7 @@ bool Thread::InvokeHLECallback(std::shared_ptr<Thread> thread) {
365} 364}
366 365
367ResultCode Thread::SetActivity(ThreadActivity value) { 366ResultCode Thread::SetActivity(ThreadActivity value) {
368 SchedulerLock lock(kernel); 367 KScopedSchedulerLock lock(kernel);
369 368
370 auto sched_status = GetSchedulingStatus(); 369 auto sched_status = GetSchedulingStatus();
371 370
@@ -435,7 +434,7 @@ void Thread::SetCurrentPriority(u32 new_priority) {
435} 434}
436 435
437ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) { 436ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) {
438 SchedulerLock lock(kernel); 437 KScopedSchedulerLock lock(kernel);
439 const auto HighestSetCore = [](u64 mask, u32 max_cores) { 438 const auto HighestSetCore = [](u64 mask, u32 max_cores) {
440 for (s32 core = static_cast<s32>(max_cores - 1); core >= 0; core--) { 439 for (s32 core = static_cast<s32>(max_cores - 1); core >= 0; core--) {
441 if (((mask >> core) & 1) != 0) { 440 if (((mask >> core) & 1) != 0) {
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp
index 8e4769694..aea53cdb0 100644
--- a/src/core/hle/kernel/time_manager.cpp
+++ b/src/core/hle/kernel/time_manager.cpp
@@ -18,7 +18,7 @@ TimeManager::TimeManager(Core::System& system_) : system{system_} {
18 time_manager_event_type = Core::Timing::CreateEvent( 18 time_manager_event_type = Core::Timing::CreateEvent(
19 "Kernel::TimeManagerCallback", 19 "Kernel::TimeManagerCallback",
20 [this](std::uintptr_t thread_handle, std::chrono::nanoseconds) { 20 [this](std::uintptr_t thread_handle, std::chrono::nanoseconds) {
21 const SchedulerLock lock(system.Kernel()); 21 const KScopedSchedulerLock lock(system.Kernel());
22 const auto proper_handle = static_cast<Handle>(thread_handle); 22 const auto proper_handle = static_cast<Handle>(thread_handle);
23 if (cancelled_events[proper_handle]) { 23 if (cancelled_events[proper_handle]) {
24 return; 24 return;