Small fixes to address_arbiter to better match the IDB.

This commit is contained in:
Fernando Sahmkow 2019-03-13 19:04:40 -04:00 committed by FernandoS27
parent 746167f11a
commit 774f139e65
2 changed files with 5 additions and 5 deletions

View File

@ -26,7 +26,7 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_
// them all. // them all.
std::size_t last = waiting_threads.size(); std::size_t last = waiting_threads.size();
if (num_to_wake > 0) { if (num_to_wake > 0) {
last = num_to_wake; last = std::min(last, static_cast<std::size_t>(num_to_wake));
} }
// Signal the waiting threads. // Signal the waiting threads.
@ -90,9 +90,9 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a
// Determine the modified value depending on the waiting count. // Determine the modified value depending on the waiting count.
s32 updated_value; s32 updated_value;
if (waiting_threads.empty()) { if (waiting_threads.empty()) {
updated_value = value - 1;
} else if (num_to_wake <= 0 || waiting_threads.size() <= static_cast<u32>(num_to_wake)) {
updated_value = value + 1; updated_value = value + 1;
} else if (num_to_wake <= 0 || waiting_threads.size() <= static_cast<u32>(num_to_wake)) {
updated_value = value - 1;
} else { } else {
updated_value = value; updated_value = value;
} }

View File

@ -1394,10 +1394,10 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target
// them all. // them all.
std::size_t last = waiting_threads.size(); std::size_t last = waiting_threads.size();
if (target != -1) if (target != -1)
last = target; last = std::min(waiting_threads.size(), static_cast<std::size_t>(target));
// If there are no threads waiting on this condition variable, just exit // If there are no threads waiting on this condition variable, just exit
if (last > waiting_threads.size()) if (last == 0)
return RESULT_SUCCESS; return RESULT_SUCCESS;
for (std::size_t index = 0; index < last; ++index) { for (std::size_t index = 0; index < last; ++index) {