|
|
|
@ -120,7 +120,10 @@ ResultCode KAddressArbiter::SignalAndIncrementIfEqual(VAddr addr, s32 value, s32 |
|
|
|
s32 user_value{}; |
|
|
|
R_UNLESS(UpdateIfEqual(system, std::addressof(user_value), addr, value, value + 1), |
|
|
|
Svc::ResultInvalidCurrentMemory); |
|
|
|
R_UNLESS_NOLOG(user_value == value, Svc::ResultInvalidState); |
|
|
|
|
|
|
|
if (user_value != value) { |
|
|
|
return Svc::ResultInvalidState; |
|
|
|
} |
|
|
|
|
|
|
|
auto it = thread_tree.nfind_light({addr, -1}); |
|
|
|
while ((it != thread_tree.end()) && (count <= 0 || num_waiters < count) && |
|
|
|
@ -211,7 +214,10 @@ ResultCode KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(VAddr addr, s32 |
|
|
|
} |
|
|
|
|
|
|
|
R_UNLESS(succeeded, Svc::ResultInvalidCurrentMemory); |
|
|
|
R_UNLESS_NOLOG(user_value == value, Svc::ResultInvalidState); |
|
|
|
|
|
|
|
if (user_value != value) { |
|
|
|
return Svc::ResultInvalidState; |
|
|
|
} |
|
|
|
|
|
|
|
while ((it != thread_tree.end()) && (count <= 0 || num_waiters < count) && |
|
|
|
(it->GetAddressArbiterKey() == addr)) { |
|
|
|
|