|
|
|
@ -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)) {
|
|
|
|
|