diff options
author | Liam <byteslice@airmail.cc> | 2023-09-02 17:43:16 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2023-09-02 17:51:40 +0200 |
commit | bdd09d684457319d8ab1219fd50769550d1dc145 (patch) | |
tree | de9b7ea1bd9ae7c6f390121174793f6dcce1706c /src/common/polyfill_thread.h | |
parent | Merge pull request #11430 from liamwhite/validation-error-whats-that (diff) | |
download | yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar.gz yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar.bz2 yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar.lz yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar.xz yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.tar.zst yuzu-bdd09d684457319d8ab1219fd50769550d1dc145.zip |
Diffstat (limited to '')
-rw-r--r-- | src/common/polyfill_thread.h | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/common/polyfill_thread.h b/src/common/polyfill_thread.h index b5ef055db..41cbb9ed5 100644 --- a/src/common/polyfill_thread.h +++ b/src/common/polyfill_thread.h @@ -19,8 +19,8 @@ namespace Common { template <typename Condvar, typename Lock, typename Pred> -void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) { - cv.wait(lock, token, std::move(pred)); +void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred&& pred) { + cv.wait(lk, token, std::move(pred)); } template <typename Rep, typename Period> @@ -332,13 +332,17 @@ private: namespace Common { 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()) { return; } - std::stop_callback callback(token, [&] { cv.notify_all(); }); - cv.wait(lock, [&] { return pred() || token.stop_requested(); }); + std::stop_callback callback(token, [&] { + { std::scoped_lock lk2{*lk.mutex()}; } + cv.notify_all(); + }); + + cv.wait(lk, [&] { return pred() || token.stop_requested(); }); } 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, [&] { // Wake up the waiting thread. - std::unique_lock lk{m}; - stop_requested = true; + { + std::scoped_lock lk{m}; + stop_requested = true; + } cv.notify_one(); }); |