diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2018-07-06 13:33:11 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2018-07-14 04:20:05 +0000 |
commit | 56d52e1f1a8709520b62b558121237686acf5fae (patch) | |
tree | f6a2390da6a34d30595744fbf545271d4264aa81 /src/corelib/thread | |
parent | f6425da424b1a0d5927ee56fa657a9b31ca5afd1 (diff) |
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>
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qthread.cpp | 8 | ||||
-rw-r--r-- | src/corelib/thread/qthread_p.h | 10 | ||||
-rw-r--r-- | src/corelib/thread/qthread_unix.cpp | 8 | ||||
-rw-r--r-- | src/corelib/thread/qthread_win.cpp | 8 |
4 files changed, 19 insertions, 15 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index c21877485f..472c6f6795 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -117,6 +117,14 @@ void QThreadData::deref() #endif } +QAbstractEventDispatcher *QThreadData::createEventDispatcher() +{ + QAbstractEventDispatcher *ed = QThreadPrivate::createEventDispatcher(this); + eventDispatcher.storeRelease(ed); + ed->startingUp(); + return ed; +} + /* QAdoptedThread */ diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 73736ce13b..93f245ff6e 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -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() { diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index c5de46d07d..0b3c7ddf10 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -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)) { diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp index 6c9f939b7d..83bcb7d751 100644 --- a/src/corelib/thread/qthread_win.cpp +++ b/src/corelib/thread/qthread_win.cpp @@ -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. |