From 97db8e04ac2efd924c6de4c0bcdcaf845b090bbc Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 9 Aug 2019 16:15:57 +0200 Subject: Port away from QMutexLocker in public headers We can't use qt_scoped_lock/qt_unique_lock here, so port to std::unique_lock and std::lock_guard for now. This is in preparation of deprecating QMutexLocker in favor of std::unique_lock and std::scoped_lock. In QFutureInterface, change the return type of mutex() from QMutex* to QMutex&, so we don't need to deref when passing to std::lock_guard. We need to keep the old method around for BC reasons, so the new one needs an artificial function argument for disambiguation. This will vanish come Qt 6. Change-Id: I1a0f0205952a249512ec2dbd3f0f48dd209b1636 Reviewed-by: Thiago Macieira --- src/concurrent/qtconcurrentreducekernel.h | 12 +++++++----- src/corelib/global/qglobalstatic.h | 3 ++- src/corelib/thread/qfutureinterface.cpp | 5 +++++ src/corelib/thread/qfutureinterface.h | 13 ++++++++----- 4 files changed, 22 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/concurrent/qtconcurrentreducekernel.h b/src/concurrent/qtconcurrentreducekernel.h index 0fbc40e02e..8f9a938952 100644 --- a/src/concurrent/qtconcurrentreducekernel.h +++ b/src/concurrent/qtconcurrentreducekernel.h @@ -52,6 +52,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE @@ -147,7 +149,7 @@ public: ReduceResultType &r, const IntermediateResults &result) { - QMutexLocker locker(&mutex); + std::unique_lock locker(mutex); if (!canReduce(result.begin)) { ++resultsMapSize; resultsMap.insert(result.begin, result); @@ -161,7 +163,7 @@ public: // reduce this result locker.unlock(); reduceResult(reduce, r, result); - locker.relock(); + locker.lock(); // reduce all stored results as well while (!resultsMap.isEmpty()) { @@ -170,7 +172,7 @@ public: locker.unlock(); reduceResults(reduce, r, resultsMapCopy); - locker.relock(); + locker.lock(); resultsMapSize -= resultsMapCopy.size(); } @@ -180,7 +182,7 @@ public: // reduce this result locker.unlock(); reduceResult(reduce, r, result); - locker.relock(); + locker.lock(); // OrderedReduce progress += result.end - result.begin; @@ -193,7 +195,7 @@ public: locker.unlock(); reduceResult(reduce, r, it.value()); - locker.relock(); + locker.lock(); --resultsMapSize; progress += it.value().end - it.value().begin; diff --git a/src/corelib/global/qglobalstatic.h b/src/corelib/global/qglobalstatic.h index 7a7d65ed76..e56fe1dbcb 100644 --- a/src/corelib/global/qglobalstatic.h +++ b/src/corelib/global/qglobalstatic.h @@ -98,6 +98,7 @@ enum GuardValues { QT_END_NAMESPACE #include +#include QT_BEGIN_NAMESPACE #define Q_GLOBAL_STATIC_INTERNAL(ARGS) \ @@ -107,7 +108,7 @@ QT_BEGIN_NAMESPACE static QBasicMutex mutex; \ int x = guard.loadAcquire(); \ if (Q_UNLIKELY(x >= QtGlobalStatic::Uninitialized)) { \ - QMutexLocker locker(&mutex); \ + const std::lock_guard locker(mutex); \ if (guard.loadRelaxed() == QtGlobalStatic::Uninitialized) { \ d = new Type ARGS; \ static struct Cleanup { \ diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp index 8f4cae8816..6430f38a3b 100644 --- a/src/corelib/thread/qfutureinterface.cpp +++ b/src/corelib/thread/qfutureinterface.cpp @@ -429,6 +429,11 @@ QMutex *QFutureInterfaceBase::mutex() const return &d->m_mutex; } +QMutex &QFutureInterfaceBase::mutex(int) const +{ + return d->m_mutex; +} + QtPrivate::ExceptionStore &QFutureInterfaceBase::exceptionStore() { return d->m_exceptionStore; diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h index d5e2401eee..bcdae24833 100644 --- a/src/corelib/thread/qfutureinterface.h +++ b/src/corelib/thread/qfutureinterface.h @@ -45,6 +45,8 @@ #include #include +#include + QT_REQUIRE_CONFIG(future); QT_BEGIN_NAMESPACE @@ -118,6 +120,7 @@ public: void waitForResume(); QMutex *mutex() const; + QMutex &mutex(int) const; QtPrivate::ExceptionStore &exceptionStore(); QtPrivate::ResultStoreBase &resultStoreBase(); const QtPrivate::ResultStoreBase &resultStoreBase() const; @@ -188,7 +191,7 @@ public: template inline void QFutureInterface::reportResult(const T *result, int index) { - QMutexLocker locker(mutex()); + std::lock_guard locker(mutex(0)); if (this->queryState(Canceled) || this->queryState(Finished)) { return; } @@ -214,7 +217,7 @@ inline void QFutureInterface::reportResult(const T &result, int index) template inline void QFutureInterface::reportResults(const QVector &_results, int beginIndex, int count) { - QMutexLocker locker(mutex()); + std::lock_guard locker(mutex(0)); if (this->queryState(Canceled) || this->queryState(Finished)) { return; } @@ -242,14 +245,14 @@ inline void QFutureInterface::reportFinished(const T *result) template inline const T &QFutureInterface::resultReference(int index) const { - QMutexLocker lock(mutex()); + std::lock_guard locker(mutex(0)); return resultStoreBase().resultAt(index).template value(); } template inline const T *QFutureInterface::resultPointer(int index) const { - QMutexLocker lock(mutex()); + std::lock_guard locker(mutex(0)); return resultStoreBase().resultAt(index).template pointer(); } @@ -263,7 +266,7 @@ inline QList QFutureInterface::results() QFutureInterfaceBase::waitForResult(-1); QList res; - QMutexLocker lock(mutex()); + std::lock_guard locker(mutex(0)); QtPrivate::ResultIteratorBase it = resultStoreBase().begin(); while (it != resultStoreBase().end()) { -- cgit v1.2.3