kern: update KConditionVariable to support new has_waiter_flag rules

This commit is contained in:
Michael Scire 2020-12-02 01:28:21 -08:00 committed by SciresM
parent fd745ab2d3
commit 331fa1d00d

View file

@ -194,6 +194,12 @@ namespace ams::kern {
target_thread->ClearConditionVariable();
++num_waiters;
}
/* If we have no waiters, clear the has waiter flag. */
if (it == this->tree.end() || it->GetConditionVariableKey() != cv_key) {
const u32 has_waiter_flag = 0;
WriteToUser(cv_key, std::addressof(has_waiter_flag));
}
}
/* Close threads in the array. */
@ -244,6 +250,13 @@ namespace ams::kern {
next_owner_thread->Wakeup();
}
/* Write to the cv key. */
{
const u32 has_waiter_flag = 1;
WriteToUser(key, std::addressof(has_waiter_flag));
cpu::DataMemoryBarrier();
}
/* Write the value to userspace. */
if (!WriteToUser(addr, std::addressof(next_value))) {
slp.CancelSleep();