diff options
| author | 2020-12-03 22:26:42 -0800 | |
|---|---|---|
| committer | 2020-12-06 00:03:24 -0800 | |
| commit | ccce6cb3be062fc7ae162bed32202538ebc2e3d9 (patch) | |
| tree | 206612bfc3718371d2355c8e3447aba288b1828f /src | |
| parent | hle: kernel: Separate KScopedSchedulerLockAndSleep from k_scheduler. (diff) | |
| download | yuzu-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.txt | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/global_scheduler_context.h | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.h | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scoped_lock.h | 39 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/mutex.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/readable_event.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/synchronization.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/time_manager.cpp | 2 |
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 | ||
| 61 | ResultCode AddressArbiter::SignalToAddressOnly(VAddr address, s32 num_to_wake) { | 61 | ResultCode 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 | ||
| 69 | ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32 value, | 69 | ResultCode 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 | ||
| 94 | ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr address, s32 value, | 94 | ResultCode 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 | ||
| 29 | public: | 29 | public: |
| 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 | |||
| 56 | private: | 66 | private: |
| 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 | ||
| 796 | SchedulerLock::SchedulerLock(KernelCore& kernel) : kernel{kernel} { | 796 | KScopedSchedulerLock::KScopedSchedulerLock(KernelCore& kernel) |
| 797 | kernel.GlobalSchedulerContext().Lock(); | 797 | : KScopedLock(kernel.GlobalSchedulerContext().SchedulerLock()) {} |
| 798 | } | ||
| 799 | 798 | ||
| 800 | SchedulerLock::~SchedulerLock() { | 799 | KScopedSchedulerLock::~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 | ||
| 18 | namespace Common { | 19 | namespace Common { |
| 19 | class Fiber; | 20 | class Fiber; |
| @@ -198,13 +199,10 @@ private: | |||
| 198 | Common::SpinLock guard{}; | 199 | Common::SpinLock guard{}; |
| 199 | }; | 200 | }; |
| 200 | 201 | ||
| 201 | class SchedulerLock { | 202 | class KScopedSchedulerLock : KScopedLock<GlobalSchedulerContext::LockType> { |
| 202 | public: | 203 | public: |
| 203 | [[nodiscard]] explicit SchedulerLock(KernelCore& kernel); | 204 | explicit KScopedSchedulerLock(KernelCore& kernel); |
| 204 | ~SchedulerLock(); | 205 | ~KScopedSchedulerLock(); |
| 205 | |||
| 206 | protected: | ||
| 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 | |||
| 12 | namespace Kernel { | ||
| 13 | |||
| 14 | template <typename T> | ||
| 15 | concept 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 | |||
| 22 | template <typename T> | ||
| 23 | requires KLockable<T> class KScopedLock : NonCopyable { | ||
| 24 | |||
| 25 | private: | ||
| 26 | T* lock_ptr; | ||
| 27 | |||
| 28 | public: | ||
| 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 { | |||
| 612 | void KernelCore::Suspend(bool in_suspention) { | 612 | void 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 | ||
| 154 | ResultCode Mutex::Release(VAddr address) { | 154 | ResultCode 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 | ||
| 215 | ResultCode Process::ClearSignalState() { | 215 | ResultCode 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 | ||
| 349 | VAddr Process::CreateTLSRegion() { | 349 | VAddr 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 | ||
| 380 | void Process::FreeTLSRegion(VAddr tls_address) { | 380 | void 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 | ||
| 41 | ResultCode ReadableEvent::Reset() { | 41 | ResultCode 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 | ||
| 20 | void Synchronization::SignalObject(SynchronizationObject& obj) const { | 20 | void 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 | ||
| 52 | void Thread::Stop() { | 52 | void 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 | ||
| 70 | void Thread::ResumeFromWait() { | 70 | void 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 | ||
| 102 | void Thread::OnWakeUp() { | 102 | void Thread::OnWakeUp() { |
| 103 | SchedulerLock lock(kernel); | 103 | KScopedSchedulerLock lock(kernel); |
| 104 | |||
| 105 | SetStatus(ThreadStatus::Ready); | 104 | SetStatus(ThreadStatus::Ready); |
| 106 | } | 105 | } |
| 107 | 106 | ||
| 108 | ResultCode Thread::Start() { | 107 | ResultCode 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 | ||
| 114 | void Thread::CancelWait() { | 113 | void 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 | ||
| 230 | void Thread::SetPriority(u32 priority) { | 229 | void 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 | ||
| 367 | ResultCode Thread::SetActivity(ThreadActivity value) { | 366 | ResultCode 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 | ||
| 437 | ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) { | 436 | ResultCode 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; |