summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2019-08-09 16:15:57 +0200
committerMarc Mutz <marc.mutz@kdab.com>2019-08-25 04:48:11 +0000
commit97db8e04ac2efd924c6de4c0bcdcaf845b090bbc (patch)
tree73481764b260c8e92d6f491aaccc009e31285ab0 /src
parente913b690b9c87a24e69085f707886ee066d1b616 (diff)
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 <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/concurrent/qtconcurrentreducekernel.h12
-rw-r--r--src/corelib/global/qglobalstatic.h3
-rw-r--r--src/corelib/thread/qfutureinterface.cpp5
-rw-r--r--src/corelib/thread/qfutureinterface.h13
4 files changed, 22 insertions, 11 deletions
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 <QtCore/qthreadpool.h>
#include <QtCore/qvector.h>
+#include <mutex>
+
QT_BEGIN_NAMESPACE
@@ -147,7 +149,7 @@ public:
ReduceResultType &r,
const IntermediateResults<T> &result)
{
- QMutexLocker locker(&mutex);
+ std::unique_lock<QMutex> 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 <QtCore/qmutex.h>
+#include <mutex>
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<QBasicMutex> 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 <QtCore/qexception.h>
#include <QtCore/qresultstore.h>
+#include <mutex>
+
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 <typename T>
inline void QFutureInterface<T>::reportResult(const T *result, int index)
{
- QMutexLocker locker(mutex());
+ std::lock_guard<QMutex> locker(mutex(0));
if (this->queryState(Canceled) || this->queryState(Finished)) {
return;
}
@@ -214,7 +217,7 @@ inline void QFutureInterface<T>::reportResult(const T &result, int index)
template <typename T>
inline void QFutureInterface<T>::reportResults(const QVector<T> &_results, int beginIndex, int count)
{
- QMutexLocker locker(mutex());
+ std::lock_guard<QMutex> locker(mutex(0));
if (this->queryState(Canceled) || this->queryState(Finished)) {
return;
}
@@ -242,14 +245,14 @@ inline void QFutureInterface<T>::reportFinished(const T *result)
template <typename T>
inline const T &QFutureInterface<T>::resultReference(int index) const
{
- QMutexLocker lock(mutex());
+ std::lock_guard<QMutex> locker(mutex(0));
return resultStoreBase().resultAt(index).template value<T>();
}
template <typename T>
inline const T *QFutureInterface<T>::resultPointer(int index) const
{
- QMutexLocker lock(mutex());
+ std::lock_guard<QMutex> locker(mutex(0));
return resultStoreBase().resultAt(index).template pointer<T>();
}
@@ -263,7 +266,7 @@ inline QList<T> QFutureInterface<T>::results()
QFutureInterfaceBase::waitForResult(-1);
QList<T> res;
- QMutexLocker lock(mutex());
+ std::lock_guard<QMutex> locker(mutex(0));
QtPrivate::ResultIteratorBase it = resultStoreBase().begin();
while (it != resultStoreBase().end()) {