summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/thread')
-rw-r--r--src/corelib/thread/qfuture.h1
-rw-r--r--src/corelib/thread/qfutureinterface.h2
-rw-r--r--src/corelib/thread/qmutex.cpp4
-rw-r--r--src/corelib/thread/qmutex.h6
-rw-r--r--src/corelib/thread/qmutex_linux.cpp5
-rw-r--r--src/corelib/thread/qmutex_mac.cpp5
-rw-r--r--src/corelib/thread/qmutex_p.h3
-rw-r--r--src/corelib/thread/qmutex_unix.cpp6
-rw-r--r--src/corelib/thread/qmutexpool.cpp4
-rw-r--r--src/corelib/thread/qmutexpool_p.h4
-rw-r--r--src/corelib/thread/qreadwritelock.cpp3
-rw-r--r--src/corelib/thread/qreadwritelock.h6
-rw-r--r--src/corelib/thread/qreadwritelock_p.h6
-rw-r--r--src/corelib/thread/qsemaphore.cpp10
-rw-r--r--src/corelib/thread/qsemaphore.h7
-rw-r--r--src/corelib/thread/qthread.cpp129
-rw-r--r--src/corelib/thread/qthread.h24
-rw-r--r--src/corelib/thread/qthread_p.h26
-rw-r--r--src/corelib/thread/qthread_unix.cpp20
-rw-r--r--src/corelib/thread/qthread_win.cpp22
-rw-r--r--src/corelib/thread/qthreadpool.cpp4
-rw-r--r--src/corelib/thread/qthreadpool.h4
-rw-r--r--src/corelib/thread/qthreadpool_p.h3
-rw-r--r--src/corelib/thread/qthreadstorage.cpp3
-rw-r--r--src/corelib/thread/qthreadstorage.h79
-rw-r--r--src/corelib/thread/qwaitcondition.h9
-rw-r--r--src/corelib/thread/qwaitcondition_unix.cpp57
-rw-r--r--src/corelib/thread/qwaitcondition_win.cpp14
-rw-r--r--src/corelib/thread/thread.pri110
29 files changed, 364 insertions, 212 deletions
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h
index af599c26db..a456dd9139 100644
--- a/src/corelib/thread/qfuture.h
+++ b/src/corelib/thread/qfuture.h
@@ -136,6 +136,7 @@ public:
inline const_iterator operator-(int j) const { return const_iterator(future, index - j); }
inline const_iterator &operator+=(int j) { index += j; return *this; }
inline const_iterator &operator-=(int j) { index -= j; return *this; }
+ friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
private:
QFuture const * future;
int index;
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h
index 3dd236752c..d5e2401eee 100644
--- a/src/corelib/thread/qfutureinterface.h
+++ b/src/corelib/thread/qfutureinterface.h
@@ -178,7 +178,7 @@ public:
inline void reportResult(const T *result, int index = -1);
inline void reportResult(const T &result, int index = -1);
inline void reportResults(const QVector<T> &results, int beginIndex = -1, int count = -1);
- inline void reportFinished(const T *result = 0);
+ inline void reportFinished(const T *result = nullptr);
inline const T &resultReference(int index) const;
inline const T *resultPointer(int index) const;
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 63fb6f3efb..3881ac017e 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -42,8 +42,6 @@
#include "qplatformdefs.h"
#include "qmutex.h"
#include <qdebug.h>
-
-#ifndef QT_NO_THREAD
#include "qatomic.h"
#include "qelapsedtimer.h"
#include "qthread.h"
@@ -739,5 +737,3 @@ QT_END_NAMESPACE
#else
# include "qmutex_unix.cpp"
#endif
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex.h b/src/corelib/thread/qmutex.h
index 7cda53db5f..837355a602 100644
--- a/src/corelib/thread/qmutex.h
+++ b/src/corelib/thread/qmutex.h
@@ -54,7 +54,7 @@ class tst_QMutex;
QT_BEGIN_NAMESPACE
-#if !defined(QT_NO_THREAD) || defined(Q_CLANG_QDOC)
+#if QT_CONFIG(thread) || defined(Q_CLANG_QDOC)
#ifdef Q_OS_LINUX
# define QT_MUTEX_LOCK_NOEXCEPT Q_DECL_NOTHROW
@@ -250,7 +250,7 @@ private:
quintptr val;
};
-#else // QT_NO_THREAD && !Q_CLANG_QDOC
+#else // !QT_CONFIG(thread) && !Q_CLANG_QDOC
class Q_CORE_EXPORT QMutex
{
@@ -301,7 +301,7 @@ private:
typedef QMutex QBasicMutex;
-#endif // QT_NO_THREAD && !Q_CLANG_QDOC
+#endif // !QT_CONFIG(thread) && !Q_CLANG_QDOC
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qmutex_linux.cpp b/src/corelib/thread/qmutex_linux.cpp
index d3d97ea108..507e72cb76 100644
--- a/src/corelib/thread/qmutex_linux.cpp
+++ b/src/corelib/thread/qmutex_linux.cpp
@@ -40,8 +40,6 @@
#include "qplatformdefs.h"
#include "qmutex.h"
-
-#ifndef QT_NO_THREAD
#include "qatomic.h"
#include "qmutex_p.h"
#include "qfutex_p.h"
@@ -54,7 +52,6 @@
# define FUTEX_PRIVATE_FLAG 0
#endif
-
QT_BEGIN_NAMESPACE
using namespace QtFutex;
@@ -183,5 +180,3 @@ void QBasicMutex::unlockInternal() Q_DECL_NOTHROW
}
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex_mac.cpp b/src/corelib/thread/qmutex_mac.cpp
index 67498611c9..9a8d9bc750 100644
--- a/src/corelib/thread/qmutex_mac.cpp
+++ b/src/corelib/thread/qmutex_mac.cpp
@@ -39,9 +39,6 @@
#include "qplatformdefs.h"
#include "qmutex.h"
-
-#if !defined(QT_NO_THREAD)
-
#include "qmutex_p.h"
#include <mach/mach.h>
@@ -89,5 +86,3 @@ void QMutexPrivate::wakeUp() Q_DECL_NOTHROW
QT_END_NAMESPACE
-
-#endif //QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex_p.h b/src/corelib/thread/qmutex_p.h
index 4e6f522a37..ec9bfc1152 100644
--- a/src/corelib/thread/qmutex_p.h
+++ b/src/corelib/thread/qmutex_p.h
@@ -58,6 +58,7 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qmutex.h>
#include <QtCore/qatomic.h>
+#include <QtCore/qdeadlinetimer.h>
#if defined(Q_OS_MAC)
# include <mach/semaphore.h>
@@ -146,7 +147,7 @@ public:
// helper functions for qmutex_unix.cpp and qwaitcondition_unix.cpp
// they are in qwaitcondition_unix.cpp actually
void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where);
-void qt_abstime_for_timeout(struct timespec *ts, int timeout);
+void qt_abstime_for_timeout(struct timespec *ts, QDeadlineTimer deadline);
#endif
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp
index 3e1e531be4..3ee24a292c 100644
--- a/src/corelib/thread/qmutex_unix.cpp
+++ b/src/corelib/thread/qmutex_unix.cpp
@@ -42,8 +42,6 @@
#include "qmutex.h"
#include "qstring.h"
#include "qelapsedtimer.h"
-
-#ifndef QT_NO_THREAD
#include "qatomic.h"
#include "qmutex_p.h"
#include <errno.h>
@@ -130,7 +128,7 @@ bool QMutexPrivate::wait(int timeout)
errorCode = pthread_cond_wait(&cond, &mutex);
} else {
timespec ti;
- qt_abstime_for_timeout(&ti, timeout);
+ qt_abstime_for_timeout(&ti, QDeadlineTimer(timeout));
errorCode = pthread_cond_timedwait(&cond, &mutex, &ti);
}
if (errorCode) {
@@ -159,5 +157,3 @@ void QMutexPrivate::wakeUp() Q_DECL_NOTHROW
#endif
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutexpool.cpp b/src/corelib/thread/qmutexpool.cpp
index 90b6989467..3f9e8da942 100644
--- a/src/corelib/thread/qmutexpool.cpp
+++ b/src/corelib/thread/qmutexpool.cpp
@@ -40,8 +40,6 @@
#include "qatomic.h"
#include "qmutexpool_p.h"
-#ifndef QT_NO_THREAD
-
QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC_WITH_ARGS(QMutexPool, globalMutexPool, (QMutex::Recursive))
@@ -148,5 +146,3 @@ QMutex *QMutexPool::globalInstanceGet(const void *address)
}
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutexpool_p.h b/src/corelib/thread/qmutexpool_p.h
index 58d853b0e3..89d006ac29 100644
--- a/src/corelib/thread/qmutexpool_p.h
+++ b/src/corelib/thread/qmutexpool_p.h
@@ -56,7 +56,7 @@
#include "QtCore/qmutex.h"
#include "QtCore/qvarlengtharray.h"
-#ifndef QT_NO_THREAD
+QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
@@ -85,6 +85,4 @@ private:
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
-
#endif // QMUTEXPOOL_P_H
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 42befc4b80..21835ff592 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -42,7 +42,6 @@
#include "qplatformdefs.h"
#include "qreadwritelock.h"
-#ifndef QT_NO_THREAD
#include "qmutex.h"
#include "qthread.h"
#include "qwaitcondition.h"
@@ -781,5 +780,3 @@ void QReadWriteLockPrivate::release()
*/
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qreadwritelock.h b/src/corelib/thread/qreadwritelock.h
index ecdb98f2f5..65fa76fd6d 100644
--- a/src/corelib/thread/qreadwritelock.h
+++ b/src/corelib/thread/qreadwritelock.h
@@ -45,7 +45,7 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
class QReadWriteLockPrivate;
@@ -174,7 +174,7 @@ inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock)
#pragma warning( pop )
#endif
-#else // QT_NO_THREAD
+#else // QT_CONFIG(thread)
class Q_CORE_EXPORT QReadWriteLock
{
@@ -225,7 +225,7 @@ private:
Q_DISABLE_COPY(QWriteLocker)
};
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qreadwritelock_p.h b/src/corelib/thread/qreadwritelock_p.h
index 04dd45a2e1..31da2401c0 100644
--- a/src/corelib/thread/qreadwritelock_p.h
+++ b/src/corelib/thread/qreadwritelock_p.h
@@ -54,9 +54,9 @@
#include <QtCore/private/qglobal_p.h>
#include <QtCore/qhash.h>
-#include <QtCore/QWaitCondition>
+#include <QtCore/qwaitcondition.h>
-#ifndef QT_NO_THREAD
+QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
@@ -99,6 +99,4 @@ public:
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
-
#endif // QREADWRITELOCK_P_H
diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index 74e0746f43..bb578ff617 100644
--- a/src/corelib/thread/qsemaphore.cpp
+++ b/src/corelib/thread/qsemaphore.cpp
@@ -39,8 +39,6 @@
****************************************************************************/
#include "qsemaphore.h"
-
-#ifndef QT_NO_THREAD
#include "qmutex.h"
#include "qfutex_p.h"
#include "qwaitcondition.h"
@@ -487,11 +485,9 @@ bool QSemaphore::tryAcquire(int n, int timeout)
QDeadlineTimer timer(timeout);
QMutexLocker locker(&d->mutex);
- qint64 remainingTime = timer.remainingTime();
- while (n > d->avail && remainingTime != 0) {
- if (!d->cond.wait(locker.mutex(), remainingTime))
+ while (n > d->avail && !timer.hasExpired()) {
+ if (!d->cond.wait(locker.mutex(), timer))
return false;
- remainingTime = timer.remainingTime();
}
if (n > d->avail)
return false;
@@ -648,5 +644,3 @@ bool QSemaphore::tryAcquire(int n, int timeout)
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qsemaphore.h b/src/corelib/thread/qsemaphore.h
index 2639085e99..b830ff1bfd 100644
--- a/src/corelib/thread/qsemaphore.h
+++ b/src/corelib/thread/qsemaphore.h
@@ -42,10 +42,9 @@
#include <QtCore/qglobal.h>
-QT_BEGIN_NAMESPACE
-
+QT_REQUIRE_CONFIG(thread);
-#ifndef QT_NO_THREAD
+QT_BEGIN_NAMESPACE
class QSemaphorePrivate;
@@ -113,8 +112,6 @@ private:
int m_n;
};
-#endif // QT_NO_THREAD
-
QT_END_NAMESPACE
#endif // QSEMAPHORE_H
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 23606411ff..5df0508829 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -103,7 +103,7 @@ QThreadData::~QThreadData()
void QThreadData::ref()
{
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
(void) _ref.ref();
Q_ASSERT(_ref.load() != 0);
#endif
@@ -111,12 +111,20 @@ void QThreadData::ref()
void QThreadData::deref()
{
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
if (!_ref.deref())
delete this;
#endif
}
+QAbstractEventDispatcher *QThreadData::createEventDispatcher()
+{
+ QAbstractEventDispatcher *ed = QThreadPrivate::createEventDispatcher(this);
+ eventDispatcher.storeRelease(ed);
+ ed->startingUp();
+ return ed;
+}
+
/*
QAdoptedThread
*/
@@ -126,7 +134,7 @@ QAdoptedThread::QAdoptedThread(QThreadData *data)
{
// thread should be running and not finished for the lifetime
// of the application (even if QCoreApplication goes away)
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
d_func()->running = true;
d_func()->finished = false;
init();
@@ -140,12 +148,13 @@ QAdoptedThread::~QAdoptedThread()
// fprintf(stderr, "~QAdoptedThread = %p\n", this);
}
+#if QT_CONFIG(thread)
void QAdoptedThread::run()
{
// this function should never be called
qFatal("QAdoptedThread::run(): Internal error, this implementation should never be called.");
}
-#ifndef QT_NO_THREAD
+
/*
QThreadPrivate
*/
@@ -747,31 +756,112 @@ int QThread::loopLevel() const
return d->data->eventLoops.size();
}
-#else // QT_NO_THREAD
+#else // QT_CONFIG(thread)
QThread::QThread(QObject *parent)
- : QObject(*(new QThreadPrivate), (QObject*)0){
+ : QObject(*(new QThreadPrivate), parent)
+{
Q_D(QThread);
d->data->thread = this;
}
+QThread::~QThread()
+{
+
+}
+
+void QThread::run()
+{
+
+}
+
+int QThread::exec()
+{
+ return 0;
+}
+
+void QThread::start(Priority priority)
+{
+ Q_D(QThread);
+ Q_UNUSED(priority);
+ d->running = true;
+}
+
+void QThread::terminate()
+{
+
+}
+
+void QThread::quit()
+{
+
+}
+
+bool QThread::wait(unsigned long time)
+{
+ Q_UNUSED(time);
+ return false;
+}
+
+bool QThread::event(QEvent* event)
+{
+ return QObject::event(event);
+}
+
+Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
+{
+ return Qt::HANDLE(currentThread());
+}
+
QThread *QThread::currentThread()
{
return QThreadData::current()->thread;
}
-QThreadData* QThreadData::current()
+int QThread::idealThreadCount() Q_DECL_NOTHROW
+{
+ return 1;
+}
+
+void QThread::yieldCurrentThread()
+{
+
+}
+
+bool QThread::isFinished() const
+{
+ return false;
+}
+
+bool QThread::isRunning() const
+{
+ Q_D(const QThread);
+ return d->running;
+}
+
+// No threads: so we can just use static variables
+static QThreadData *data = 0;
+
+QThreadData *QThreadData::current(bool createIfNecessary)
{
- static QThreadData *data = 0; // reinterpret_cast<QThreadData *>(pthread_getspecific(current_thread_data_key));
- if (!data) {
- QScopedPointer<QThreadData> newdata(new QThreadData);
- newdata->thread = new QAdoptedThread(newdata.data());
- data = newdata.take();
+ if (!data && createIfNecessary) {
+ data = new QThreadData;
+ data->thread = new QAdoptedThread(data);
+ data->threadId.store(Qt::HANDLE(data->thread));
data->deref();
+ data->isAdopted = true;
+ if (!QCoreApplicationPrivate::theMainThread)
+ QCoreApplicationPrivate::theMainThread = data->thread.load();
}
return data;
}
+void QThreadData::clearCurrentThreadData()
+{
+ delete data;
+ data = 0;
+}
+
/*!
\internal
*/
@@ -783,7 +873,16 @@ QThread::QThread(QThreadPrivate &dd, QObject *parent)
d->data->thread = this;
}
-#endif // QT_NO_THREAD
+QThreadPrivate::QThreadPrivate(QThreadData *d) : data(d ? d : new QThreadData)
+{
+}
+
+QThreadPrivate::~QThreadPrivate()
+{
+ delete data;
+}
+
+#endif // QT_CONFIG(thread)
/*!
\since 5.0
@@ -820,6 +919,8 @@ void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
}
}
+#if QT_CONFIG(thread)
+
/*!
\reimp
*/
@@ -983,6 +1084,8 @@ QDaemonThread::~QDaemonThread()
{
}
+#endif // QT_CONFIG(thread)
+
QT_END_NAMESPACE
#include "moc_qthread.cpp"
diff --git a/src/corelib/thread/qthread.h b/src/corelib/thread/qthread.h
index 3df76077e1..b6c5bf47d0 100644
--- a/src/corelib/thread/qthread.h
+++ b/src/corelib/thread/qthread.h
@@ -66,7 +66,6 @@ class QThreadData;
class QThreadPrivate;
class QAbstractEventDispatcher;
-#ifndef QT_NO_THREAD
class Q_CORE_EXPORT QThread : public QObject
{
Q_OBJECT
@@ -239,29 +238,6 @@ QThread *QThread::create(Function &&f)
#endif // QT_CONFIG(cxx11_future)
-#else // QT_NO_THREAD
-
-class Q_CORE_EXPORT QThread : public QObject
-{
-public:
- static Qt::HANDLE currentThreadId() { return Qt::HANDLE(currentThread()); }
- static QThread* currentThread();
-
-protected:
- QThread(QThreadPrivate &dd, QObject *parent = nullptr);
-
-private:
- explicit QThread(QObject *parent = nullptr);
- static QThread *instance;
-
- friend class QCoreApplication;
- friend class QThreadData;
- friend class QAdoptedThread;
- Q_DECLARE_PRIVATE(QThread)
-};
-
-#endif // QT_NO_THREAD
-
QT_END_NAMESPACE
#endif // QTHREAD_H
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 46294a5fc8..64e3f33191 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -57,7 +57,9 @@
#include "QtCore/qthread.h"
#include "QtCore/qmutex.h"
#include "QtCore/qstack.h"
+#if QT_CONFIG(thread)
#include "QtCore/qwaitcondition.h"
+#endif
#include "QtCore/qmap.h"
#include "QtCore/qcoreapplication.h"
#include "private/qobject_p.h"
@@ -141,7 +143,7 @@ private:
using QVector<QPostEvent>::insert;
};
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
class Q_CORE_EXPORT QDaemonThread : public QThread
{
@@ -210,15 +212,17 @@ public:
}
};
-#else // QT_NO_THREAD
+#else // QT_CONFIG(thread)
class QThreadPrivate : public QObjectPrivate
{
public:
- QThreadPrivate(QThreadData *d = 0) : data(d ? d : new QThreadData) {}
- ~QThreadPrivate() { delete data; }
+ QThreadPrivate(QThreadData *d = 0);
+ ~QThreadPrivate();
+ mutable QMutex mutex;
QThreadData *data;
+ bool running = false;
static void setCurrentThread(QThread*) {}
static QThread *threadForId(int) { return QThread::currentThread(); }
@@ -230,7 +234,7 @@ public:
Q_DECLARE_PUBLIC(QThread)
};
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
class QThreadData
{
@@ -247,7 +251,15 @@ public:
void ref();
void deref();
inline bool hasEventDispatcher() const
- { return eventDispatcher.load() != 0; }
+ { return eventDispatcher.load() != nullptr; }
+ QAbstractEventDispatcher *createEventDispatcher();
+ QAbstractEventDispatcher *ensureEventDispatcher()
+ {
+ QAbstractEventDispatcher *ed = eventDispatcher.load();
+ if (Q_LIKELY(ed))
+ return ed;
+ return createEventDispatcher();
+ }
bool canWaitLocked()
{
@@ -318,7 +330,9 @@ public:
void init();
private:
+#if QT_CONFIG(thread)
void run() override;
+#endif
};
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index 9ad32b162d..329caa02ba 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -103,7 +103,7 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
Q_STATIC_ASSERT(sizeof(pthread_t) <= sizeof(Qt::HANDLE));
@@ -270,7 +270,7 @@ extern "C" {
typedef void*(*QtThreadCallback)(void*);
}
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *data)
{
@@ -295,7 +295,7 @@ QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *dat
#endif
}
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
static void setCurrentThreadName(const char *name)
@@ -339,13 +339,7 @@ void *QThreadPrivate::start(void *arg)
data->quitNow = thr->d_func()->exited;
}
- QAbstractEventDispatcher *eventDispatcher = data->eventDispatcher.load();
- if (!eventDispatcher) {
- eventDispatcher = createEventDispatcher(data);
- data->eventDispatcher.storeRelease(eventDispatcher);
- }
-
- eventDispatcher->startingUp();
+ data->ensureEventDispatcher();
#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
{
@@ -519,6 +513,8 @@ void QThread::yieldCurrentThread()
sched_yield();
}
+#endif // QT_CONFIG(thread)
+
static timespec makeTimespec(time_t secs, long nsecs)
{
struct timespec ts;
@@ -542,6 +538,8 @@ void QThread::usleep(unsigned long usecs)
qt_nanosleep(makeTimespec(usecs / 1000 / 1000, usecs % (1000*1000) * 1000));
}
+#if QT_CONFIG(thread)
+
#ifdef QT_HAS_THREAD_PRIORITY_SCHEDULING
#if defined(Q_OS_QNX)
static bool calculateUnixPriority(int priority, int *sched_policy, int *sched_priority)
@@ -841,7 +839,7 @@ void QThreadPrivate::setPriority(QThread::Priority threadPriority)
#endif
}
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 4459ae87af..57ae671897 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -61,9 +61,10 @@
# include <process.h>
#endif // Q_OS_WINRT
-#ifndef QT_NO_THREAD
QT_BEGIN_NAMESPACE
+#if QT_CONFIG(thread)
+
#ifdef Q_OS_WINRT
inline DWORD qWinRTTlsAlloc() {
return FlsAlloc(0);
@@ -329,7 +330,7 @@ void qt_set_thread_name(HANDLE threadId, LPCSTR threadName)
** QThreadPrivate
*************************************************************************/
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *data)
{
@@ -341,7 +342,7 @@ QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *dat
#endif
}
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
unsigned int __stdcall QT_ENSURE_STACK_ALIGNED_FOR_SSE QThreadPrivate::start(void *arg) Q_DECL_NOEXCEPT
{
@@ -359,13 +360,7 @@ unsigned int __stdcall QT_ENSURE_STACK_ALIGNED_FOR_SSE QThreadPrivate::start(voi
data->quitNow = thr->d_func()->exited;
}
- QAbstractEventDispatcher *eventDispatcher = data->eventDispatcher.load();
- if (!eventDispatcher) {
- eventDispatcher = createEventDispatcher(data);
- data->eventDispatcher.storeRelease(eventDispatcher);
- }
-
- eventDispatcher->startingUp();
+ data->ensureEventDispatcher();
#if !defined(QT_NO_DEBUG) && defined(Q_CC_MSVC) && !defined(Q_OS_WINRT)
// sets the name of the current thread.
@@ -449,6 +444,8 @@ void QThread::yieldCurrentThread()
#endif
}
+#endif // QT_CONFIG(thread)
+
void QThread::sleep(unsigned long secs)
{
::Sleep(secs * 1000);
@@ -464,6 +461,8 @@ void QThread::usleep(unsigned long usecs)
::Sleep((usecs / 1000) + 1);
}
+#if QT_CONFIG(thread)
+
void QThread::start(Priority priority)
{
Q_D(QThread);
@@ -700,5 +699,6 @@ void QThreadPrivate::setPriority(QThread::Priority threadPriority)
}
}
+#endif // QT_CONFIG(thread)
+
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index 157cbeaf4d..ea2c611082 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -43,8 +43,6 @@
#include <algorithm>
-#ifndef QT_NO_THREAD
-
QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC(QThreadPool, theInstance)
@@ -730,5 +728,3 @@ void QThreadPool::cancel(QRunnable *runnable)
QT_END_NAMESPACE
#include "moc_qthreadpool.cpp"
-
-#endif
diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h
index 606e192768..cd27b7c08a 100644
--- a/src/corelib/thread/qthreadpool.h
+++ b/src/corelib/thread/qthreadpool.h
@@ -45,7 +45,7 @@
#include <QtCore/qthread.h>
#include <QtCore/qrunnable.h>
-#ifndef QT_NO_THREAD
+QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
@@ -97,6 +97,4 @@ public:
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
-
#endif
diff --git a/src/corelib/thread/qthreadpool_p.h b/src/corelib/thread/qthreadpool_p.h
index d03ba9d77f..0e6a00d243 100644
--- a/src/corelib/thread/qthreadpool_p.h
+++ b/src/corelib/thread/qthreadpool_p.h
@@ -59,7 +59,7 @@
#include "QtCore/qqueue.h"
#include "private/qobject_p.h"
-#ifndef QT_NO_THREAD
+QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
@@ -184,5 +184,4 @@ public:
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
#endif
diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp
index c0b523a431..8b82118a5c 100644
--- a/src/corelib/thread/qthreadstorage.cpp
+++ b/src/corelib/thread/qthreadstorage.cpp
@@ -39,7 +39,6 @@
#include "qthreadstorage.h"
-#ifndef QT_NO_THREAD
#include "qthread.h"
#include "qthread_p.h"
#include "qmutex.h"
@@ -323,6 +322,4 @@ void QThreadStorageData::finish(void **p)
\sa localData(), hasLocalData()
*/
-#endif // QT_NO_THREAD
-
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qthreadstorage.h b/src/corelib/thread/qthreadstorage.h
index fed41a0760..55fc482da3 100644
--- a/src/corelib/thread/qthreadstorage.h
+++ b/src/corelib/thread/qthreadstorage.h
@@ -42,7 +42,7 @@
#include <QtCore/qglobal.h>
-#ifndef QT_NO_THREAD
+#if QT_CONFIG(thread)
QT_BEGIN_NAMESPACE
@@ -152,6 +152,81 @@ public:
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
+#else // !QT_CONFIG(thread)
+
+#include <QtCore/qscopedpointer.h>
+
+#include <type_traits>
+
+template <typename T, typename U>
+inline bool qThreadStorage_hasLocalData(const QScopedPointer<T, U> &data)
+{
+ return !!data;
+}
+
+template <typename T, typename U>
+inline bool qThreadStorage_hasLocalData(const QScopedPointer<T*, U> &data)
+{
+ return !!data ? *data != nullptr : false;
+}
+
+template <typename T>
+inline void qThreadStorage_deleteLocalData(T *t)
+{
+ delete t;
+}
+
+template <typename T>
+inline void qThreadStorage_deleteLocalData(T **t)
+{
+ delete *t;
+ delete t;
+}
+
+template <class T>
+class QThreadStorage
+{
+private:
+ struct ScopedPointerThreadStorageDeleter
+ {
+ static inline void cleanup(T *t)
+ {
+ if (t == nullptr)
+ return;
+ qThreadStorage_deleteLocalData(t);
+ }
+ };
+ QScopedPointer<T, ScopedPointerThreadStorageDeleter> data;
+
+public:
+ QThreadStorage() = default;
+ ~QThreadStorage() = default;
+ QThreadStorage(const QThreadStorage &rhs) = delete;
+ QThreadStorage &operator=(const QThreadStorage &rhs) = delete;
+
+ inline bool hasLocalData() const
+ {
+ return qThreadStorage_hasLocalData(data);
+ }
+
+ inline T& localData()
+ {
+ if (!data)
+ data.reset(new T());
+ return *data;
+ }
+
+ inline T localData() const
+ {
+ return !!data ? *data : T();
+ }
+
+ inline void setLocalData(T t)
+ {
+ data.reset(new T(t));
+ }
+};
+
+#endif // QT_CONFIG(thread)
#endif // QTHREADSTORAGE_H
diff --git a/src/corelib/thread/qwaitcondition.h b/src/corelib/thread/qwaitcondition.h
index a0c6766833..11520e4cfe 100644
--- a/src/corelib/thread/qwaitcondition.h
+++ b/src/corelib/thread/qwaitcondition.h
@@ -46,9 +46,9 @@
QT_BEGIN_NAMESPACE
+#if QT_CONFIG(thread)
-#ifndef QT_NO_THREAD
-
+class QDeadlineTimer;
class QWaitConditionPrivate;
class QMutex;
class QReadWriteLock;
@@ -59,8 +59,11 @@ public:
QWaitCondition();
~QWaitCondition();
+ // ### Qt 6: remove unsigned long overloads
bool wait(QMutex *lockedMutex, unsigned long time = ULONG_MAX);
+ bool wait(QMutex *lockedMutex, QDeadlineTimer deadline);
bool wait(QReadWriteLock *lockedReadWriteLock, unsigned long time = ULONG_MAX);
+ bool wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline);
void wakeOne();
void wakeAll();
@@ -94,7 +97,7 @@ public:
void wakeAll() {}
};
-#endif // QT_NO_THREAD
+#endif // QT_CONFIG(thread)
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qwaitcondition_unix.cpp b/src/corelib/thread/qwaitcondition_unix.cpp
index 6adee5412e..c93328b4bc 100644
--- a/src/corelib/thread/qwaitcondition_unix.cpp
+++ b/src/corelib/thread/qwaitcondition_unix.cpp
@@ -44,6 +44,8 @@
#include "qreadwritelock.h"
#include "qatomic.h"
#include "qstring.h"
+#include "qdeadlinetimer.h"
+#include "private/qdeadlinetimer_p.h"
#include "qelapsedtimer.h"
#include "private/qcore_unix_p.h"
@@ -54,8 +56,6 @@
#include <sys/time.h>
#include <time.h>
-#ifndef QT_NO_THREAD
-
QT_BEGIN_NAMESPACE
#ifdef Q_OS_ANDROID
@@ -93,23 +93,25 @@ void qt_initialize_pthread_cond(pthread_cond_t *cond, const char *where)
pthread_condattr_destroy(&condattr);
}
-void qt_abstime_for_timeout(timespec *ts, int timeout)
+void qt_abstime_for_timeout(timespec *ts, QDeadlineTimer deadline)
{
#ifdef Q_OS_MAC
// on Mac, qt_gettime() (on qelapsedtimer_mac.cpp) returns ticks related to the Mach absolute time
// that doesn't work with pthread
// Mac also doesn't have clock_gettime
struct timeval tv;
+ qint64 nsec = deadline.remainingTimeNSecs();
gettimeofday(&tv, 0);
- ts->tv_sec = tv.tv_sec;
- ts->tv_nsec = tv.tv_usec * 1000;
-#else
- *ts = qt_gettime();
-#endif
+ ts->tv_sec = tv.tv_sec + nsec / (1000 * 1000 * 1000);
+ ts->tv_nsec = tv.tv_usec * 1000 + nsec % (1000 * 1000 * 1000);
- ts->tv_sec += timeout / 1000;
- ts->tv_nsec += timeout % 1000 * Q_UINT64_C(1000) * 1000;
normalizedTimespec(*ts);
+#else
+ // depends on QDeadlineTimer's internals!!
+ Q_STATIC_ASSERT(QDeadlineTimerNanosecondsInT2);
+ ts->tv_sec = deadline._q_data().first;
+ ts->tv_nsec = deadline._q_data().second;
+#endif
}
class QWaitConditionPrivate {
@@ -119,26 +121,27 @@ public:
int waiters;
int wakeups;
- int wait_relative(unsigned long time)
+ int wait_relative(QDeadlineTimer deadline)
{
timespec ti;
#ifdef Q_OS_ANDROID
- if (local_cond_timedwait_relative) {
- ti.tv_sec = time / 1000;
- ti.tv_nsec = time % 1000 * Q_UINT64_C(1000) * 1000;
+ if (!local_condattr_setclock && local_cond_timedwait_relative) {
+ qint64 nsec = deadline.remainingTimeNSecs();
+ ti.tv_sec = nsec / (1000 * 1000 * 1000);
+ ti.tv_nsec = nsec - ti.tv_sec * 1000 * 1000 * 1000;
return local_cond_timedwait_relative(&cond, &mutex, &ti);
}
#endif
- qt_abstime_for_timeout(&ti, time);
+ qt_abstime_for_timeout(&ti, deadline);
return pthread_cond_timedwait(&cond, &mutex, &ti);
}
- bool wait(unsigned long time)
+ bool wait(QDeadlineTimer deadline)
{
int code;
forever {
- if (time != ULONG_MAX) {
- code = wait_relative(time);
+ if (!deadline.isForever()) {
+ code = wait_relative(deadline);
} else {
code = pthread_cond_wait(&cond, &mutex);
}
@@ -201,6 +204,13 @@ void QWaitCondition::wakeAll()
bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
{
+ if (quint64(time) > quint64(std::numeric_limits<qint64>::max()))
+ return wait(mutex, QDeadlineTimer(QDeadlineTimer::Forever));
+ return wait(mutex, QDeadlineTimer(time));
+}
+
+bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
+{
if (! mutex)
return false;
if (mutex->isRecursive()) {
@@ -212,7 +222,7 @@ bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
++d->waiters;
mutex->unlock();
- bool returnValue = d->wait(time);
+ bool returnValue = d->wait(deadline);
mutex->lock();
@@ -221,6 +231,11 @@ bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
{
+ return wait(readWriteLock, QDeadlineTimer(time));
+}
+
+bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
+{
if (!readWriteLock)
return false;
auto previousState = readWriteLock->stateForWaitCondition();
@@ -236,7 +251,7 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
readWriteLock->unlock();
- bool returnValue = d->wait(time);
+ bool returnValue = d->wait(deadline);
if (previousState == QReadWriteLock::LockedForWrite)
readWriteLock->lockForWrite();
@@ -247,5 +262,3 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
}
QT_END_NAMESPACE
-
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qwaitcondition_win.cpp b/src/corelib/thread/qwaitcondition_win.cpp
index e6610f18c8..534456a935 100644
--- a/src/corelib/thread/qwaitcondition_win.cpp
+++ b/src/corelib/thread/qwaitcondition_win.cpp
@@ -38,14 +38,13 @@
****************************************************************************/
#include "qwaitcondition.h"
+#include "qdeadlinetimer.h"
#include "qnamespace.h"
#include "qmutex.h"
#include "qreadwritelock.h"
#include "qlist.h"
#include "qalgorithms.h"
-#ifndef QT_NO_THREAD
-
#define Q_MUTEX_T void*
#include <private/qmutex_p.h>
#include <private/qreadwritelock_p.h>
@@ -184,6 +183,11 @@ bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
return returnValue;
}
+bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
+{
+ return wait(mutex, deadline.remainingTime());
+}
+
bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
{
if (!readWriteLock)
@@ -210,6 +214,11 @@ bool QWaitCondition::wait(QReadWriteLock *readWriteLock, unsigned long time)
return returnValue;
}
+bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
+{
+ return wait(readWriteLock, deadline.remainingTime());
+}
+
void QWaitCondition::wakeOne()
{
// wake up the first waiting thread in the queue
@@ -236,4 +245,3 @@ void QWaitCondition::wakeAll()
}
QT_END_NAMESPACE
-#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index dae72564b4..22f0de0523 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -1,38 +1,66 @@
# Qt core thread module
-# public headers
-HEADERS += thread/qmutex.h \
- thread/qrunnable.h \
- thread/qreadwritelock.h \
- thread/qsemaphore.h \
- thread/qthread.h \
- thread/qthreadpool.h \
- thread/qthreadstorage.h \
- thread/qwaitcondition.h \
- thread/qatomic.h \
- thread/qatomic_bootstrap.h \
- thread/qatomic_cxx11.h \
- thread/qbasicatomic.h \
- thread/qgenericatomic.h
+HEADERS += \
+ thread/qmutex.h \
+ thread/qreadwritelock.h \
+ thread/qrunnable.h \
+ thread/qthread.h \
+ thread/qthreadstorage.h \
+ thread/qwaitcondition.h
-# private headers
-HEADERS += thread/qmutex_p.h \
- thread/qmutexpool_p.h \
- thread/qfutex_p.h \
- thread/qorderedmutexlocker_p.h \
- thread/qreadwritelock_p.h \
- thread/qthread_p.h \
- thread/qthreadpool_p.h
+SOURCES += \
+ thread/qrunnable.cpp \
+ thread/qthread.cpp
-SOURCES += thread/qatomic.cpp \
- thread/qmutex.cpp \
- thread/qreadwritelock.cpp \
- thread/qrunnable.cpp \
- thread/qmutexpool.cpp \
- thread/qsemaphore.cpp \
- thread/qthread.cpp \
- thread/qthreadpool.cpp \
- thread/qthreadstorage.cpp
+win32 {
+ HEADERS += thread/qatomic_msvc.h
+
+ SOURCES += thread/qthread_win.cpp
+} else {
+ SOURCES += thread/qthread_unix.cpp
+}
+
+qtConfig(thread) {
+ HEADERS += \
+ thread/qatomic.h \
+ thread/qatomic_bootstrap.h \
+ thread/qatomic_cxx11.h \
+ thread/qbasicatomic.h \
+ thread/qfutex_p.h \
+ thread/qgenericatomic.h \
+ thread/qmutexpool_p.h \
+ thread/qmutex_p.h \
+ thread/qorderedmutexlocker_p.h \
+ thread/qreadwritelock_p.h \
+ thread/qsemaphore.h \
+ thread/qthreadpool.h \
+ thread/qthreadpool_p.h \
+ thread/qthread_p.h
+
+ SOURCES += \
+ thread/qatomic.cpp \
+ thread/qmutex.cpp \
+ thread/qmutexpool.cpp \
+ thread/qreadwritelock.cpp \
+ thread/qsemaphore.cpp \
+ thread/qthreadpool.cpp \
+ thread/qthreadstorage.cpp
+
+ win32 {
+ SOURCES += \
+ thread/qmutex_win.cpp \
+ thread/qwaitcondition_win.cpp
+ } else {
+ darwin {
+ SOURCES += thread/qmutex_mac.cpp
+ } else: linux {
+ SOURCES += thread/qmutex_linux.cpp
+ } else {
+ SOURCES += thread/qmutex_unix.cpp
+ }
+ SOURCES += thread/qwaitcondition_unix.cpp
+ }
+}
qtConfig(future) {
HEADERS += \
@@ -52,24 +80,4 @@ qtConfig(future) {
thread/qresultstore.cpp
}
-win32 {
- HEADERS += thread/qatomic_msvc.h
-
- SOURCES += \
- thread/qmutex_win.cpp \
- thread/qthread_win.cpp \
- thread/qwaitcondition_win.cpp
-} else {
- darwin {
- SOURCES += thread/qmutex_mac.cpp
- } else: linux {
- SOURCES += thread/qmutex_linux.cpp
- } else {
- SOURCES += thread/qmutex_unix.cpp
- }
- SOURCES += \
- thread/qthread_unix.cpp \
- thread/qwaitcondition_unix.cpp
-}
-
qtConfig(std-atomic64): QMAKE_USE += libatomic