summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_address_arbiter.cpp53
1 files changed, 13 insertions, 40 deletions
diff --git a/src/core/hle/kernel/k_address_arbiter.cpp b/src/core/hle/kernel/k_address_arbiter.cpp
index f2f497dc4..02c629a3d 100644
--- a/src/core/hle/kernel/k_address_arbiter.cpp
+++ b/src/core/hle/kernel/k_address_arbiter.cpp
@@ -146,61 +146,34 @@ ResultCode KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(VAddr addr, s32
146 // Perform signaling. 146 // Perform signaling.
147 s32 num_waiters{}; 147 s32 num_waiters{};
148 { 148 {
149 KScopedSchedulerLock sl(kernel); 149 [[maybe_unused]] const KScopedSchedulerLock sl(kernel);
150 150
151 auto it = thread_tree.nfind_light({addr, -1}); 151 auto it = thread_tree.nfind_light({addr, -1});
152 // Determine the updated value. 152 // Determine the updated value.
153 s32 new_value{}; 153 s32 new_value{};
154 if (/*GetTargetFirmware() >= TargetFirmware_7_0_0*/ true) { 154 if (count <= 0) {
155 if (count <= 0) { 155 if (it != thread_tree.end() && it->GetAddressArbiterKey() == addr) {
156 if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) { 156 new_value = value - 2;
157 new_value = value - 2;
158 } else {
159 new_value = value + 1;
160 }
161 } else { 157 } else {
162 if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) { 158 new_value = value + 1;
163 auto tmp_it = it;
164 s32 tmp_num_waiters{};
165 while ((++tmp_it != thread_tree.end()) &&
166 (tmp_it->GetAddressArbiterKey() == addr)) {
167 if ((tmp_num_waiters++) >= count) {
168 break;
169 }
170 }
171
172 if (tmp_num_waiters < count) {
173 new_value = value - 1;
174 } else {
175 new_value = value;
176 }
177 } else {
178 new_value = value + 1;
179 }
180 } 159 }
181 } else { 160 } else {
182 if (count <= 0) { 161 if (it != thread_tree.end() && it->GetAddressArbiterKey() == addr) {
183 if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) {
184 new_value = value - 1;
185 } else {
186 new_value = value + 1;
187 }
188 } else {
189 auto tmp_it = it; 162 auto tmp_it = it;
190 s32 tmp_num_waiters{}; 163 s32 tmp_num_waiters{};
191 while ((tmp_it != thread_tree.end()) && (tmp_it->GetAddressArbiterKey() == addr) && 164 while (++tmp_it != thread_tree.end() && tmp_it->GetAddressArbiterKey() == addr) {
192 (tmp_num_waiters < count + 1)) { 165 if (tmp_num_waiters++ >= count) {
193 ++tmp_num_waiters; 166 break;
194 ++tmp_it; 167 }
195 } 168 }
196 169
197 if (tmp_num_waiters == 0) { 170 if (tmp_num_waiters < count) {
198 new_value = value + 1;
199 } else if (tmp_num_waiters <= count) {
200 new_value = value - 1; 171 new_value = value - 1;
201 } else { 172 } else {
202 new_value = value; 173 new_value = value;
203 } 174 }
175 } else {
176 new_value = value + 1;
204 } 177 }
205 } 178 }
206 179