QThread: Centralize the creation of the event dispatcher

In some places we call startingUp(), in others we don't. It's probably
ok for those that have just created an object of a given class, which
knows whether the virtual call is necessary or not. But for the generic
case, we do call it.

Change-Id: If48c5c2e920c433298f1fffd153ee1cc75703204
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Thiago Macieira 2018-07-06 13:33:11 -07:00
parent f6425da424
commit 56d52e1f1a
6 changed files with 22 additions and 20 deletions

View File

@ -540,7 +540,7 @@ void QCoreApplicationPrivate::createEventDispatcher()
Q_Q(QCoreApplication);
QThreadData *data = QThreadData::current();
Q_ASSERT(!data->hasEventDispatcher());
eventDispatcher = QThreadPrivate::createEventDispatcher(data);
eventDispatcher = data->createEventDispatcher();
eventDispatcher->setParent(q);
}

View File

@ -101,10 +101,8 @@ QEventLoop::QEventLoop(QObject *parent)
Q_D(QEventLoop);
if (!QCoreApplication::instance() && QCoreApplicationPrivate::threadRequiresCoreApplication()) {
qWarning("QEventLoop: Cannot be used without QApplication");
} else if (!d->threadData->hasEventDispatcher()) {
QAbstractEventDispatcher *eventDispatcher = QThreadPrivate::createEventDispatcher(d->threadData);
d->threadData->eventDispatcher.storeRelease(eventDispatcher);
eventDispatcher->startingUp();
} else {
d->threadData->ensureEventDispatcher();
}
}

View File

@ -117,6 +117,14 @@ void QThreadData::deref()
#endif
}
QAbstractEventDispatcher *QThreadData::createEventDispatcher()
{
QAbstractEventDispatcher *ed = QThreadPrivate::createEventDispatcher(this);
eventDispatcher.storeRelease(ed);
ed->startingUp();
return ed;
}
/*
QAdoptedThread
*/

View File

@ -248,7 +248,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()
{

View File

@ -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))
{

View File

@ -360,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.