From 99d4f0026f90681974f6fd1d23941e5b69024796 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 29 Dec 2016 18:59:04 +0100 Subject: Make the stub implementation of QThread compile again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We cannot inline methods of QThreadPrivate because QThreadData has to be declared before. The global QThreadData needs to be accessible to QThreadData::clearCurrentThreadData(), and QAdoptedThread::run() has to be moved inside the #ifndef QT_NO_THREAD block as run() doesn't exist in the stub and Q_DECL_OVERRIDE would be wrong. We also fix the QThreadData::current() method to take and use the same parameters as in the non-stub case. Change-Id: Id29ca44b11fa95ed2df7cc39243a07ce7d3c455e Reviewed-by: Ulf Hermann Reviewed-by: Oswald Buddenhagen Reviewed-by: Morten Johan Sørvig --- src/corelib/thread/qthread.cpp | 40 ++++++++++++++++++++++++++++++++-------- src/corelib/thread/qthread.h | 3 +++ src/corelib/thread/qthread_p.h | 7 +++++-- 3 files changed, 40 insertions(+), 10 deletions(-) (limited to 'src/corelib/thread') diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 23606411ff..c21877485f 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -140,12 +140,13 @@ QAdoptedThread::~QAdoptedThread() // fprintf(stderr, "~QAdoptedThread = %p\n", this); } +#ifndef QT_NO_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 */ @@ -750,7 +751,8 @@ int QThread::loopLevel() const #else // QT_NO_THREAD QThread::QThread(QObject *parent) - : QObject(*(new QThreadPrivate), (QObject*)0){ + : QObject(*(new QThreadPrivate), parent) +{ Q_D(QThread); d->data->thread = this; } @@ -760,18 +762,27 @@ QThread *QThread::currentThread() return QThreadData::current()->thread; } -QThreadData* QThreadData::current() +// No threads: so we can just use static variables +static QThreadData *data = 0; + +QThreadData *QThreadData::current(bool createIfNecessary) { - static QThreadData *data = 0; // reinterpret_cast(pthread_getspecific(current_thread_data_key)); - if (!data) { - QScopedPointer newdata(new QThreadData); - newdata->thread = new QAdoptedThread(newdata.data()); - data = newdata.take(); + if (!data && createIfNecessary) { + data = new QThreadData; + data->thread = new QAdoptedThread(data); data->deref(); + if (!QCoreApplicationPrivate::theMainThread) + QCoreApplicationPrivate::theMainThread = data->thread.load(); } return data; } +void QThreadData::clearCurrentThreadData() +{ + delete data; + data = 0; +} + /*! \internal */ @@ -783,6 +794,15 @@ QThread::QThread(QThreadPrivate &dd, QObject *parent) d->data->thread = this; } +QThreadPrivate::QThreadPrivate(QThreadData *d) : data(d ? d : new QThreadData) +{ +} + +QThreadPrivate::~QThreadPrivate() +{ + delete data; +} + #endif // QT_NO_THREAD /*! @@ -820,6 +840,8 @@ void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher) } } +#ifndef QT_NO_THREAD + /*! \reimp */ @@ -983,6 +1005,8 @@ QDaemonThread::~QDaemonThread() { } +#endif // QT_NO_THREAD + QT_END_NAMESPACE #include "moc_qthread.cpp" diff --git a/src/corelib/thread/qthread.h b/src/corelib/thread/qthread.h index 19951e844a..83c3329cc0 100644 --- a/src/corelib/thread/qthread.h +++ b/src/corelib/thread/qthread.h @@ -251,6 +251,9 @@ public: static void msleep(unsigned long); static void usleep(unsigned long); + QAbstractEventDispatcher *eventDispatcher() const; + void setEventDispatcher(QAbstractEventDispatcher *eventDispatcher); + protected: QThread(QThreadPrivate &dd, QObject *parent = nullptr); diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 46294a5fc8..73736ce13b 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -215,9 +215,10 @@ public: 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; static void setCurrentThread(QThread*) {} @@ -318,7 +319,9 @@ public: void init(); private: +#ifndef QT_NO_THREAD void run() override; +#endif }; QT_END_NAMESPACE -- cgit v1.2.3