diff options
| -rw-r--r-- | src/core/hle/kernel/k_address_arbiter.cpp | 53 |
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 | ||