|
|
|
@ -146,61 +146,34 @@ ResultCode KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(VAddr addr, s32 |
|
|
|
// Perform signaling.
|
|
|
|
s32 num_waiters{}; |
|
|
|
{ |
|
|
|
KScopedSchedulerLock sl(kernel); |
|
|
|
[[maybe_unused]] const KScopedSchedulerLock sl(kernel); |
|
|
|
|
|
|
|
auto it = thread_tree.nfind_light({addr, -1}); |
|
|
|
// Determine the updated value.
|
|
|
|
s32 new_value{}; |
|
|
|
if (/*GetTargetFirmware() >= TargetFirmware_7_0_0*/ true) { |
|
|
|
if (count <= 0) { |
|
|
|
if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) { |
|
|
|
new_value = value - 2; |
|
|
|
} else { |
|
|
|
new_value = value + 1; |
|
|
|
} |
|
|
|
if (count <= 0) { |
|
|
|
if (it != thread_tree.end() && it->GetAddressArbiterKey() == addr) { |
|
|
|
new_value = value - 2; |
|
|
|
} else { |
|
|
|
if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) { |
|
|
|
auto tmp_it = it; |
|
|
|
s32 tmp_num_waiters{}; |
|
|
|
while ((++tmp_it != thread_tree.end()) && |
|
|
|
(tmp_it->GetAddressArbiterKey() == addr)) { |
|
|
|
if ((tmp_num_waiters++) >= count) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (tmp_num_waiters < count) { |
|
|
|
new_value = value - 1; |
|
|
|
} else { |
|
|
|
new_value = value; |
|
|
|
} |
|
|
|
} else { |
|
|
|
new_value = value + 1; |
|
|
|
} |
|
|
|
new_value = value + 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (count <= 0) { |
|
|
|
if ((it != thread_tree.end()) && (it->GetAddressArbiterKey() == addr)) { |
|
|
|
new_value = value - 1; |
|
|
|
} else { |
|
|
|
new_value = value + 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (it != thread_tree.end() && it->GetAddressArbiterKey() == addr) { |
|
|
|
auto tmp_it = it; |
|
|
|
s32 tmp_num_waiters{}; |
|
|
|
while ((tmp_it != thread_tree.end()) && (tmp_it->GetAddressArbiterKey() == addr) && |
|
|
|
(tmp_num_waiters < count + 1)) { |
|
|
|
++tmp_num_waiters; |
|
|
|
++tmp_it; |
|
|
|
while (++tmp_it != thread_tree.end() && tmp_it->GetAddressArbiterKey() == addr) { |
|
|
|
if (tmp_num_waiters++ >= count) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (tmp_num_waiters == 0) { |
|
|
|
new_value = value + 1; |
|
|
|
} else if (tmp_num_waiters <= count) { |
|
|
|
if (tmp_num_waiters < count) { |
|
|
|
new_value = value - 1; |
|
|
|
} else { |
|
|
|
new_value = value; |
|
|
|
} |
|
|
|
} else { |
|
|
|
new_value = value + 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|