diff options
| author | 2019-03-05 12:22:13 -0500 | |
|---|---|---|
| committer | 2019-03-05 12:58:31 -0500 | |
| commit | 9d9676f62055e9a765796d113ec110259a576927 (patch) | |
| tree | aa44535165b61789bda471390be9dec6e80feb25 /src | |
| parent | kernel/address_arbiter: Convert the address arbiter into a class (diff) | |
| download | yuzu-9d9676f62055e9a765796d113ec110259a576927.tar.gz yuzu-9d9676f62055e9a765796d113ec110259a576927.tar.xz yuzu-9d9676f62055e9a765796d113ec110259a576927.zip | |
kernel/address_arbiter: Minor tidying up
- Invert conditions into guard clases where applicable.
- Mark std::vector parameter of WakeThreads as const
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp index f14283cca..daebbbd1d 100644 --- a/src/core/hle/kernel/address_arbiter.cpp +++ b/src/core/hle/kernel/address_arbiter.cpp | |||
| @@ -21,12 +21,13 @@ | |||
| 21 | namespace Kernel { | 21 | namespace Kernel { |
| 22 | namespace { | 22 | namespace { |
| 23 | // Wake up num_to_wake (or all) threads in a vector. | 23 | // Wake up num_to_wake (or all) threads in a vector. |
| 24 | void WakeThreads(std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) { | 24 | void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) { |
| 25 | // Only process up to 'target' threads, unless 'target' is <= 0, in which case process | 25 | // Only process up to 'target' threads, unless 'target' is <= 0, in which case process |
| 26 | // them all. | 26 | // them all. |
| 27 | std::size_t last = waiting_threads.size(); | 27 | std::size_t last = waiting_threads.size(); |
| 28 | if (num_to_wake > 0) | 28 | if (num_to_wake > 0) { |
| 29 | last = num_to_wake; | 29 | last = num_to_wake; |
| 30 | } | ||
| 30 | 31 | ||
| 31 | // Signal the waiting threads. | 32 | // Signal the waiting threads. |
| 32 | for (std::size_t i = 0; i < last; i++) { | 33 | for (std::size_t i = 0; i < last; i++) { |
| @@ -42,8 +43,7 @@ AddressArbiter::AddressArbiter() = default; | |||
| 42 | AddressArbiter::~AddressArbiter() = default; | 43 | AddressArbiter::~AddressArbiter() = default; |
| 43 | 44 | ||
| 44 | ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { | 45 | ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { |
| 45 | std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address); | 46 | const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address); |
| 46 | |||
| 47 | WakeThreads(waiting_threads, num_to_wake); | 47 | WakeThreads(waiting_threads, num_to_wake); |
| 48 | return RESULT_SUCCESS; | 48 | return RESULT_SUCCESS; |
| 49 | } | 49 | } |
| @@ -55,12 +55,11 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32 | |||
| 55 | return ERR_INVALID_ADDRESS_STATE; | 55 | return ERR_INVALID_ADDRESS_STATE; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | if (static_cast<s32>(Memory::Read32(address)) == value) { | 58 | if (static_cast<s32>(Memory::Read32(address)) != value) { |
| 59 | Memory::Write32(address, static_cast<u32>(value + 1)); | ||
| 60 | } else { | ||
| 61 | return ERR_INVALID_STATE; | 59 | return ERR_INVALID_STATE; |
| 62 | } | 60 | } |
| 63 | 61 | ||
| 62 | Memory::Write32(address, static_cast<u32>(value + 1)); | ||
| 64 | return SignalToAddress(address, num_to_wake); | 63 | return SignalToAddress(address, num_to_wake); |
| 65 | } | 64 | } |
| 66 | 65 | ||
| @@ -72,7 +71,7 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a | |||
| 72 | } | 71 | } |
| 73 | 72 | ||
| 74 | // Get threads waiting on the address. | 73 | // Get threads waiting on the address. |
| 75 | std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address); | 74 | const std::vector<SharedPtr<Thread>> waiting_threads = GetThreadsWaitingOnAddress(address); |
| 76 | 75 | ||
| 77 | // Determine the modified value depending on the waiting count. | 76 | // Determine the modified value depending on the waiting count. |
| 78 | s32 updated_value; | 77 | s32 updated_value; |
| @@ -84,12 +83,11 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a | |||
| 84 | updated_value = value; | 83 | updated_value = value; |
| 85 | } | 84 | } |
| 86 | 85 | ||
| 87 | if (static_cast<s32>(Memory::Read32(address)) == value) { | 86 | if (static_cast<s32>(Memory::Read32(address)) != value) { |
| 88 | Memory::Write32(address, static_cast<u32>(updated_value)); | ||
| 89 | } else { | ||
| 90 | return ERR_INVALID_STATE; | 87 | return ERR_INVALID_STATE; |
| 91 | } | 88 | } |
| 92 | 89 | ||
| 90 | Memory::Write32(address, static_cast<u32>(updated_value)); | ||
| 93 | WakeThreads(waiting_threads, num_to_wake); | 91 | WakeThreads(waiting_threads, num_to_wake); |
| 94 | return RESULT_SUCCESS; | 92 | return RESULT_SUCCESS; |
| 95 | } | 93 | } |
| @@ -101,14 +99,15 @@ ResultCode AddressArbiter::WaitForAddressIfLessThan(VAddr address, s32 value, s6 | |||
| 101 | return ERR_INVALID_ADDRESS_STATE; | 99 | return ERR_INVALID_ADDRESS_STATE; |
| 102 | } | 100 | } |
| 103 | 101 | ||
| 104 | s32 cur_value = static_cast<s32>(Memory::Read32(address)); | 102 | const s32 cur_value = static_cast<s32>(Memory::Read32(address)); |
| 105 | if (cur_value < value) { | 103 | if (cur_value >= value) { |
| 106 | if (should_decrement) { | ||
| 107 | Memory::Write32(address, static_cast<u32>(cur_value - 1)); | ||
| 108 | } | ||
| 109 | } else { | ||
| 110 | return ERR_INVALID_STATE; | 104 | return ERR_INVALID_STATE; |
| 111 | } | 105 | } |
| 106 | |||
| 107 | if (should_decrement) { | ||
| 108 | Memory::Write32(address, static_cast<u32>(cur_value - 1)); | ||
| 109 | } | ||
| 110 | |||
| 112 | // Short-circuit without rescheduling, if timeout is zero. | 111 | // Short-circuit without rescheduling, if timeout is zero. |
| 113 | if (timeout == 0) { | 112 | if (timeout == 0) { |
| 114 | return RESULT_TIMEOUT; | 113 | return RESULT_TIMEOUT; |
| @@ -154,8 +153,9 @@ std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr | |||
| 154 | const auto& thread_list = scheduler.GetThreadList(); | 153 | const auto& thread_list = scheduler.GetThreadList(); |
| 155 | 154 | ||
| 156 | for (const auto& thread : thread_list) { | 155 | for (const auto& thread : thread_list) { |
| 157 | if (thread->GetArbiterWaitAddress() == arb_addr) | 156 | if (thread->GetArbiterWaitAddress() == arb_addr) { |
| 158 | waiting_threads.push_back(thread); | 157 | waiting_threads.push_back(thread); |
| 158 | } | ||
| 159 | } | 159 | } |
| 160 | }; | 160 | }; |
| 161 | 161 | ||