OSDN Git Service

replace recursive QMutex-es with std::recursive_mutex where possible
authorIvailo Monev <xakepa10@gmail.com>
Wed, 21 Jul 2021 22:49:47 +0000 (01:49 +0300)
committerIvailo Monev <xakepa10@gmail.com>
Thu, 22 Jul 2021 10:26:24 +0000 (13:26 +0300)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
14 files changed:
src/core/io/qresource.cpp
src/core/kernel/qcoreapplication.cpp
src/core/plugin/qfactoryloader.cpp
src/dbus/qdbusconnection_p.h
src/dbus/qdbusintegrator.cpp
src/dbus/qdbusthreaddebug_p.h
src/gui/animation/qpropertyanimation.cpp
src/gui/animation/qvariantanimation.cpp
src/gui/text/qfont.cpp
src/gui/text/qfontdatabase.cpp
src/gui/text/qfontdatabase_x11_p.h
src/gui/text/qfontengine_ft.cpp
src/gui/text/qfontengine_ft_p.h
src/gui/text/qfontengine_x11.cpp

index 56b94c7..3c12d5a 100644 (file)
@@ -113,7 +113,7 @@ protected:
 
 Q_DECLARE_TYPEINFO(QResourceRoot, Q_MOVABLE_TYPE);
 
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, resourceMutex, (QMutex::Recursive))
+static std::recursive_mutex qGlobalResourceMutex;
 
 typedef QList<QResourceRoot*> ResourceList;
 Q_GLOBAL_STATIC(ResourceList, resourceList)
@@ -218,7 +218,7 @@ bool
 QResourcePrivate::load(const QString &file)
 {
     related.clear();
-    QMutexLocker lock(resourceMutex());
+    std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
     const ResourceList *list = resourceList();
     QString cleaned = QDir::cleanPath(file);
     for(int i = 0; i < list->size(); ++i) {
@@ -725,7 +725,7 @@ bool QResourceRoot::mappingRootSubdir(const QString &path, QString *match) const
 Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree,
                                          const unsigned char *name, const unsigned char *data)
 {
-    QMutexLocker lock(resourceMutex());
+    std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
     if(version == Q_RCC_OUTPUT_REVISION && resourceList()) {
         bool found = false;
         QResourceRoot res(tree, name, data);
@@ -748,7 +748,7 @@ Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree,
 Q_CORE_EXPORT bool qUnregisterResourceData(int version, const unsigned char *tree,
                                            const unsigned char *name, const unsigned char *data)
 {
-    QMutexLocker lock(resourceMutex());
+    std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
     if(version == Q_RCC_OUTPUT_REVISION && resourceList()) {
         QResourceRoot res(tree, name, data);
         for(int i = 0; i < resourceList()->size(); ) {
@@ -863,7 +863,7 @@ QResource::registerResource(const QString &rccFilename, const QString &resourceR
     QDynamicFileResourceRoot *root = new QDynamicFileResourceRoot(resourceRoot);
     if(root->registerSelf(rccFilename)) {
         root->ref.ref();
-        QMutexLocker lock(resourceMutex());
+        std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
         resourceList()->append(root);
         return true;
     }
@@ -885,7 +885,7 @@ QResource::registerResource(const QString &rccFilename, const QString &resourceR
 bool
 QResource::unregisterResource(const QString &rccFilename, const QString &resourceRoot)
 {
-    QMutexLocker lock(resourceMutex());
+    std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
     ResourceList *list = resourceList();
     for(int i = 0; i < list->size(); ++i) {
         QResourceRoot *res = list->at(i);
@@ -931,7 +931,7 @@ QResource::registerResource(const uchar *rccData, const QString &resourceRoot)
     QDynamicBufferResourceRoot *root = new QDynamicBufferResourceRoot(resourceRoot);
     if(root->registerSelf(rccData)) {
         root->ref.ref();
-        QMutexLocker lock(resourceMutex());
+        std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
         resourceList()->append(root);
         return true;
     }
@@ -953,7 +953,7 @@ QResource::registerResource(const uchar *rccData, const QString &resourceRoot)
 bool
 QResource::unregisterResource(const uchar *rccData, const QString &resourceRoot)
 {
-    QMutexLocker lock(resourceMutex());
+    std::lock_guard<std::recursive_mutex> lock(qGlobalResourceMutex);
     ResourceList *list = resourceList();
     for(int i = 0; i < list->size(); ++i) {
         QResourceRoot *res = list->at(i);
index 120cd7a..2528253 100644 (file)
@@ -1655,7 +1655,7 @@ QString QCoreApplication::applicationVersion()
 #ifndef QT_NO_LIBRARY
 
 
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, libraryPathMutex, (QMutex::Recursive))
+static std::recursive_mutex qGlobalLibraryPathMutex;
 
 /*!
     Returns a list of paths that the application will search when
@@ -1682,7 +1682,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutex, libraryPathMutex, (QMutex::Recursive))
 */
 QStringList QCoreApplication::libraryPaths()
 {
-    QMutexLocker locker(libraryPathMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalLibraryPathMutex);
     if (!coreappdata()->app_libpaths) {
         QStringList *app_libpaths = coreappdata()->app_libpaths = new QStringList;
 
@@ -1728,7 +1728,7 @@ QStringList QCoreApplication::libraryPaths()
  */
 void QCoreApplication::setLibraryPaths(const QStringList &paths)
 {
-    QMutexLocker locker(libraryPathMutex());
+    std::unique_lock<std::recursive_mutex> locker(qGlobalLibraryPathMutex);
     if (!coreappdata()->app_libpaths)
         coreappdata()->app_libpaths = new QStringList;
     *(coreappdata()->app_libpaths) = paths;
@@ -1753,7 +1753,7 @@ void QCoreApplication::addLibraryPath(const QString &path)
     if (path.isEmpty())
         return;
 
-    QMutexLocker locker(libraryPathMutex());
+    std::unique_lock<std::recursive_mutex> locker(qGlobalLibraryPathMutex);
 
     // make sure that library paths is initialized
     libraryPaths();
@@ -1777,7 +1777,7 @@ void QCoreApplication::removeLibraryPath(const QString &path)
     if (path.isEmpty())
         return;
 
-    QMutexLocker locker(libraryPathMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalLibraryPathMutex);
 
     // make sure that library paths is initialized
     libraryPaths();
index 8306494..2010e0a 100644 (file)
@@ -38,8 +38,7 @@ QT_BEGIN_NAMESPACE
 
 Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
 
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_factoryloader_mutex, (QMutex::Recursive))
-
+static std::recursive_mutex qGlobalFactoryLoaderMutex;
 
 class QFactoryLoaderPrivate : public QObjectPrivate
 {
@@ -73,7 +72,7 @@ QFactoryLoader::QFactoryLoader(const char *iid,
     d->cs = cs;
     d->suffix = suffix;
 
-    QMutexLocker locker(qt_factoryloader_mutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFactoryLoaderMutex);
     update();
     qt_factory_loaders()->append(this);
 }
@@ -184,7 +183,7 @@ void QFactoryLoader::update()
 
 QFactoryLoader::~QFactoryLoader()
 {
-    QMutexLocker locker(qt_factoryloader_mutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFactoryLoaderMutex);
     qt_factory_loaders()->removeAll(this);
 }
 
@@ -209,7 +208,7 @@ QObject *QFactoryLoader::instance(const QString &key) const
 
 void QFactoryLoader::refreshAll()
 {
-    QMutexLocker locker(qt_factoryloader_mutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFactoryLoaderMutex);
     QList<QFactoryLoader *> *loaders = qt_factory_loaders();
     for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
          it != loaders->constEnd(); ++it) {
index e38902b..23b3727 100644 (file)
@@ -245,7 +245,7 @@ public:
 
     // the dispatch lock protects everything related to the DBusConnection or DBusServer
     // including the timeouts and watches
-    QMutex dispatchLock;
+    std::recursive_mutex dispatchLock;
     DBusConnection *connection;
     DBusServer *server;
 
index 1263f4e..8cce56e 100644 (file)
@@ -948,8 +948,7 @@ void QDBusConnectionPrivate::deliverCall(QObject *object, const QDBusMessage &ms
 
 QDBusConnectionPrivate::QDBusConnectionPrivate(QObject *p)
     : QObject(p), ref(1), capabilities(0), mode(InvalidMode), busService(0),
-      dispatchLock(QMutex::Recursive), connection(0), server(0),
-      rootNode(QString(QLatin1Char('/')))
+      connection(0), server(0), rootNode(QString(QLatin1Char('/')))
 {
     static const bool threads = dbus_threads_init_default();
     Q_UNUSED(threads)
index 20b334b..8692422 100644 (file)
@@ -163,10 +163,10 @@ struct QDBusWriteLocker: QDBusLockerBase
 struct QDBusMutexLocker: QDBusLockerBase
 {
     QDBusConnectionPrivate *self;
-    QMutex *mutex;
+    std::recursive_mutex *mutex;
     ThreadAction action;
     inline QDBusMutexLocker(ThreadAction a, QDBusConnectionPrivate *s,
-                            QMutex *m)
+                            std::recursive_mutex *m)
         : self(s), mutex(m), action(a)
     {
         reportThreadAction(action, BeforeLock, self);
index 44daaba..16ac382 100644 (file)
@@ -77,7 +77,7 @@
 
 QT_BEGIN_NAMESPACE
 
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qPropertyAnimationMutex, (QMutex::Recursive))
+static std::recursive_mutex qGlobalPropertyAnimationMutex;
 
 void QPropertyAnimationPrivate::updateMetaProperty()
 {
@@ -242,7 +242,7 @@ void QPropertyAnimation::updateState(QAbstractAnimation::State newState,
 
     QPropertyAnimation *animToStop = 0;
     {
-        QMutexLocker locker(qPropertyAnimationMutex());
+        std::lock_guard<std::recursive_mutex> locker(qGlobalPropertyAnimationMutex);
         typedef QPair<QObject *, QByteArray> QPropertyAnimationPair;
         typedef QHash<QPropertyAnimationPair, QPropertyAnimation*> QPropertyAnimationHash;
         static QPropertyAnimationHash hash;
index 2ac42e6..f972ca9 100644 (file)
@@ -134,7 +134,7 @@ QT_BEGIN_NAMESPACE
     \sa currentValue
 */
 
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qVariantAnimationMutex, (QMutex::Recursive))
+static std::recursive_mutex qGlobalVariantAnimationMutex;
 
 static bool animationValueLessThan(const QVariantAnimation::KeyValue &p1, const QVariantAnimation::KeyValue &p2)
 {
@@ -413,7 +413,7 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun
     // in such an order that we get here with interpolators == NULL,
     // to continue causes the app to crash on exit with a SEGV
     if (interpolators) {
-        QMutexLocker locker(qVariantAnimationMutex());
+        std::lock_guard<std::recursive_mutex> locker(qGlobalVariantAnimationMutex);
         if (interpolationType >= interpolators->count())
             interpolators->resize(interpolationType + 1);
         interpolators->replace(interpolationType, func);
@@ -423,7 +423,7 @@ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator fun
 QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int interpolationType)
 {
     QInterpolatorVector *interpolators = registeredInterpolators();
-    QMutexLocker locker(qVariantAnimationMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalVariantAnimationMutex);
     if (interpolationType < interpolators->count()) {
         QVariantAnimation::Interpolator ret = interpolators->at(interpolationType);
         if (ret) return ret;
index 0733497..ed8ad83 100644 (file)
@@ -140,11 +140,11 @@ QFontPrivate::~QFontPrivate()
     scFont = 0;
 }
 
-extern QMutex *qt_fontdatabase_mutex();
+extern std::recursive_mutex &qt_fontdatabase_mutex();
 
 QFontEngine *QFontPrivate::engineForScript(QUnicodeTables::Script script) const
 {
-    QMutexLocker locker(qt_fontdatabase_mutex());
+    std::lock_guard<std::recursive_mutex> locker(qt_fontdatabase_mutex());
     if (script > QUnicodeTables::ScriptCount)
         script = QUnicodeTables::Common;
     if (engineData && engineData->fontCache != QFontCache::instance()) {
index d424383..3b0887b 100644 (file)
@@ -511,12 +511,12 @@ static QStringList familyList(const QFontDef &req)
 }
 
 Q_GLOBAL_STATIC(QFontDatabasePrivate, privateDb)
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, fontDatabaseMutex, (QMutex::Recursive))
+static std::recursive_mutex qGlobalFontDatabaseMutex;
 
 // used in qfontengine_x11.cpp
-QMutex *qt_fontdatabase_mutex()
+std::recursive_mutex& qt_fontdatabase_mutex()
 {
-    return fontDatabaseMutex();
+    return qGlobalFontDatabaseMutex;
 }
 
 QT_BEGIN_INCLUDE_NAMESPACE
@@ -904,7 +904,7 @@ QString QFontDatabase::styleString(const QFontInfo &fontInfo)
 */
 QFontDatabase::QFontDatabase()
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     createDatabase();
     d = privateDb();
 }
@@ -918,7 +918,7 @@ QFontDatabase::QFontDatabase()
 */
 QStringList QFontDatabase::families() const
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -957,7 +957,7 @@ QStringList QFontDatabase::styles(const QString &family) const
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1000,7 +1000,7 @@ bool QFontDatabase::isFixedPitch(const QString &family,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1038,7 +1038,7 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1070,7 +1070,7 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
 bool  QFontDatabase::isScalable(const QString &family,
                                  const QString &style) const
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     if (isSmoothlyScalable(family, style))
         return true;
     return isBitmapScalable(family, style);
@@ -1090,7 +1090,7 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1145,7 +1145,7 @@ QFont QFontDatabase::font(const QString &family, const QString &style,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1190,7 +1190,7 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1275,7 +1275,7 @@ bool QFontDatabase::italic(const QString &family, const QString &style) const
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1309,7 +1309,7 @@ bool QFontDatabase::bold(const QString &family,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1345,7 +1345,7 @@ int QFontDatabase::weight(const QString &family,
     QString familyName, foundryName;
     parseFontName(family, foundryName, familyName);
 
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     createDatabase();
 
@@ -1388,7 +1388,7 @@ void QFontDatabase::createDatabase()
 // used from qfontengine_ft.cpp
 Q_GUI_EXPORT QByteArray qt_fontdata_from_index(int index)
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     return privateDb()->applicationFonts.value(index).data;
 }
 
@@ -1453,7 +1453,7 @@ int QFontDatabase::addApplicationFont(const QString &fileName)
     QFile f(fileName);
     if (!f.open(QIODevice::ReadOnly))
         return -1;
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     return privateDb()->addAppFont(f.readAll(), fileName);
 }
 
@@ -1478,7 +1478,7 @@ int QFontDatabase::addApplicationFont(const QString &fileName)
 */
 int QFontDatabase::addApplicationFontFromData(const QByteArray &fontData)
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     return privateDb()->addAppFont(fontData, QString() /* fileName */);
 }
 
@@ -1492,7 +1492,7 @@ int QFontDatabase::addApplicationFontFromData(const QByteArray &fontData)
 */
 QStringList QFontDatabase::applicationFontFamilies(int id)
 {
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
     return privateDb()->applicationFonts.value(id).families;
 }
 
index 9858c51..854c1a0 100644 (file)
@@ -1129,7 +1129,7 @@ void QFontDatabase::load(const QFontPrivate *d, int script)
     QFontEngine *fe = QFontCache::instance()->findEngine(key);
 
     if (!fe) {
-        QMutexLocker locker(fontDatabaseMutex());
+        std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
         if (!privateDb()->count)
             initializeFontDb();
 
@@ -1226,7 +1226,7 @@ bool QFontDatabase::removeApplicationFont(int handle)
 #if defined(QT_NO_FONTCONFIG)
     return false;
 #else
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     QFontDatabasePrivate *db = privateDb();
     if (handle < 0 || handle >= db->applicationFonts.count())
@@ -1247,7 +1247,7 @@ bool QFontDatabase::removeAllApplicationFonts()
 #if defined(QT_NO_FONTCONFIG)
     return false;
 #else
-    QMutexLocker locker(fontDatabaseMutex());
+    std::lock_guard<std::recursive_mutex> locker(qGlobalFontDatabaseMutex);
 
     QFontDatabasePrivate *db = privateDb();
     if (db->applicationFonts.isEmpty())
index cc14769..db13c76 100644 (file)
@@ -1400,8 +1400,8 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs
     }
 
 #if !defined(QT_NO_FONTCONFIG)
-    extern QMutex *qt_fontdatabase_mutex();
-    QMutex *mtx = 0;
+    extern std::recursive_mutex& qt_fontdatabase_mutex();
+    std::recursive_mutex *mtx = Q_NULLPTR;
 #endif
 
     bool mirrored = flags & QTextEngine::RightToLeft;
@@ -1415,7 +1415,7 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs
                 glyph_t glyph;
 #if !defined(QT_NO_FONTCONFIG)
                 if (!mtx) {
-                    mtx = qt_fontdatabase_mutex();
+                    mtx = &qt_fontdatabase_mutex();
                     mtx->lock();
                 }
 
@@ -1450,7 +1450,7 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs
             if (!glyphs->glyphs[glyph_pos]) {
 #if !defined(QT_NO_FONTCONFIG)
                 if (!mtx) {
-                    mtx = qt_fontdatabase_mutex();
+                    mtx = &qt_fontdatabase_mutex();
                     mtx->lock();
                 }
 
index 7185dde..afbb7ef 100644 (file)
@@ -99,10 +99,10 @@ public:
 private:
     friend class QFontEngineFT;
     friend class QScopedPointerDeleter<QFreetypeFace>;
-    QFreetypeFace() : _lock(QMutex::Recursive) {}
+    QFreetypeFace() {}
     ~QFreetypeFace() {}
     QAtomicInt ref;
-    QMutex _lock;
+    std::recursive_mutex _lock;
     QByteArray fontData;
 };
 
index b295a7c..c124452 100644 (file)
@@ -111,8 +111,8 @@ QFontEngineMultiFT::QFontEngineMultiFT(QFontEngine *fe, FcPattern *matchedPatter
 
 QFontEngineMultiFT::~QFontEngineMultiFT()
 {
-    extern QMutex *qt_fontdatabase_mutex();
-    QMutexLocker locker(qt_fontdatabase_mutex());
+    extern std::recursive_mutex& qt_fontdatabase_mutex();
+    std::lock_guard<std::recursive_mutex> locker(qt_fontdatabase_mutex());
 
     FcPatternDestroy(pattern);
     if (firstEnginePattern)
@@ -124,8 +124,8 @@ QFontEngineMultiFT::~QFontEngineMultiFT()
 
 void QFontEngineMultiFT::loadEngine(int at)
 {
-    extern QMutex *qt_fontdatabase_mutex();
-    QMutexLocker locker(qt_fontdatabase_mutex());
+    extern std::recursive_mutex& qt_fontdatabase_mutex();
+    std::lock_guard<std::recursive_mutex> locker(qt_fontdatabase_mutex());
 
     extern QFontDef qt_FcPatternToQFontDef(FcPattern *pattern, const QFontDef &);
     extern FcFontSet *qt_fontSetForPattern(FcPattern *pattern, const QFontDef &request);