yuzu-emu
/
yuzu-android
Archived
1
0
Fork 0

Merge pull request #11433 from liamwhite/shutdown-oopsie

polyfill_thread: ensure mutex was locked before signaling stop
This commit is contained in:
liamwhite 2023-09-14 09:24:20 -04:00 committed by GitHub
commit b5f99164f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 7 deletions

View File

@ -19,8 +19,8 @@
namespace Common { namespace Common {
template <typename Condvar, typename Lock, typename Pred> template <typename Condvar, typename Lock, typename Pred>
void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) { void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred&& pred) {
cv.wait(lock, token, std::move(pred)); cv.wait(lk, token, std::move(pred));
} }
template <typename Rep, typename Period> template <typename Rep, typename Period>
@ -332,13 +332,17 @@ private:
namespace Common { namespace Common {
template <typename Condvar, typename Lock, typename Pred> template <typename Condvar, typename Lock, typename Pred>
void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred pred) { void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred pred) {
if (token.stop_requested()) { if (token.stop_requested()) {
return; return;
} }
std::stop_callback callback(token, [&] { cv.notify_all(); }); std::stop_callback callback(token, [&] {
cv.wait(lock, [&] { return pred() || token.stop_requested(); }); { std::scoped_lock lk2{*lk.mutex()}; }
cv.notify_all();
});
cv.wait(lk, [&] { return pred() || token.stop_requested(); });
} }
template <typename Rep, typename Period> template <typename Rep, typename Period>
@ -353,8 +357,10 @@ bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep,
std::stop_callback cb(token, [&] { std::stop_callback cb(token, [&] {
// Wake up the waiting thread. // Wake up the waiting thread.
std::unique_lock lk{m}; {
stop_requested = true; std::scoped_lock lk{m};
stop_requested = true;
}
cv.notify_one(); cv.notify_one();
}); });