From 8a2d99ee85ddecb6956300026504686f56fd3449 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Fri, 23 Jul 2021 00:39:12 +0300 Subject: [PATCH] use non-recursive mutex for QVariantAnimation interpolators fixes crashes on FreeBSD Signed-off-by: Ivailo Monev --- src/gui/animation/qvariantanimation.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/gui/animation/qvariantanimation.cpp b/src/gui/animation/qvariantanimation.cpp index f972ca9c5..023d161d4 100644 --- a/src/gui/animation/qvariantanimation.cpp +++ b/src/gui/animation/qvariantanimation.cpp @@ -134,7 +134,7 @@ QT_BEGIN_NAMESPACE \sa currentValue */ -static std::recursive_mutex qGlobalVariantAnimationMutex; +Q_GLOBAL_STATIC(QMutex, qGlobalVariantAnimationMutex); static bool animationValueLessThan(const QVariantAnimation::KeyValue &p1, const QVariantAnimation::KeyValue &p2) { @@ -407,13 +407,12 @@ Q_GLOBAL_STATIC(QInterpolatorVector, registeredInterpolators) */ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator func, int interpolationType) { - // will override any existing interpolators + QMutexLocker locker(qGlobalVariantAnimationMutex()); QInterpolatorVector *interpolators = registeredInterpolators(); - // When built on solaris with GCC, the destructors can be called - // in such an order that we get here with interpolators == NULL, - // to continue causes the app to crash on exit with a SEGV + // the unregistration of interpolators can be called in such an order that we get here with + // interpolators == NULL which causes the app to crash on exit with a SEGV if (interpolators) { - std::lock_guard locker(qGlobalVariantAnimationMutex); + // will override any existing interpolators if (interpolationType >= interpolators->count()) interpolators->resize(interpolationType + 1); interpolators->replace(interpolationType, func); @@ -422,8 +421,8 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int interpolationType) { + QMutexLocker locker(qGlobalVariantAnimationMutex()); QInterpolatorVector *interpolators = registeredInterpolators(); - std::lock_guard locker(qGlobalVariantAnimationMutex); if (interpolationType < interpolators->count()) { QVariantAnimation::Interpolator ret = interpolators->at(interpolationType); if (ret) return ret; -- 2.11.0