summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-05 12:22:13 -0500
committerGravatar Lioncash2019-03-05 12:58:31 -0500
commit9d9676f62055e9a765796d113ec110259a576927 (patch)
treeaa44535165b61789bda471390be9dec6e80feb25 /src
parentkernel/address_arbiter: Convert the address arbiter into a class (diff)
downloadyuzu-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.cpp36
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 @@
21namespace Kernel { 21namespace Kernel {
22namespace { 22namespace {
23// Wake up num_to_wake (or all) threads in a vector. 23// Wake up num_to_wake (or all) threads in a vector.
24void WakeThreads(std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_to_wake) { 24void 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;
42AddressArbiter::~AddressArbiter() = default; 43AddressArbiter::~AddressArbiter() = default;
43 44
44ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { 45ResultCode 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