From 80e547000673b1f8f9804a3cacbe5dc934077493 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Mon, 25 Jul 2022 14:13:30 +0300 Subject: [PATCH] Fix crash at exit due to a unreleased mutex. Qt startblit() and endblit() use a mutex that can remain locked at exit. A thread static wrapper makes sure that each thread using the mutex will also release it before terminating. --- src/qt/qt_platform.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index eff022b3d..89ead7acd 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -54,6 +54,7 @@ QElapsedTimer elapsed_timer; static std::atomic_int blitmx_contention = 0; static std::recursive_mutex blitmx; +static thread_local std::unique_lock blit_lock { blitmx, std::defer_lock }; class CharPointer { public: @@ -468,17 +469,17 @@ void dynld_close(void *handle) void startblit() { blitmx_contention++; - if (blitmx.try_lock()) { + if (blit_lock.try_lock()) { return; } - blitmx.lock(); + blit_lock.lock(); } void endblit() { blitmx_contention--; - blitmx.unlock(); + blit_lock.unlock(); if (blitmx_contention > 0) { // a deadlock has been observed on linux when toggling via video_toggle_option // because the mutex is typically unfair on linux