Kernel: Correct SignalProcessWideKey

When the target is 0, all threads must be processed.
This commit is contained in:
Fernando Sahmkow 2019-11-16 13:55:21 -04:00 committed by FernandoS27
parent 2d16507f9f
commit 2ab41ceff4

View File

@ -1649,16 +1649,12 @@ static ResultCode SignalProcessWideKey(Core::System& system, VAddr condition_var
std::vector<SharedPtr<Thread>> waiting_threads = std::vector<SharedPtr<Thread>> waiting_threads =
current_process->GetConditionVariableThreads(condition_variable_addr); current_process->GetConditionVariableThreads(condition_variable_addr);
// Only process up to 'target' threads, unless 'target' is -1, in which case process // Only process up to 'target' threads, unless 'target' is less equal 0, in which case process
// them all. // them all.
std::size_t last = waiting_threads.size(); std::size_t last = waiting_threads.size();
if (target != -1) if (target > 0)
last = std::min(waiting_threads.size(), static_cast<std::size_t>(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 (last == 0)
return RESULT_SUCCESS;
for (std::size_t index = 0; index < last; ++index) { for (std::size_t index = 0; index < last; ++index) {
auto& thread = waiting_threads[index]; auto& thread = waiting_threads[index];