diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2018-01-16 11:44:20 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2018-01-16 11:48:55 +0100 |
commit | e2a546a18be88f380b3d9d3efbed390fe1a9e93f (patch) | |
tree | f7a6a0c7a60ee7b771ee9d6256c385f761113135 /src/corelib/kernel | |
parent | 0be8f59d725d4a5e79709487e3aac1d351a6c04c (diff) | |
parent | 99b89d30fa5484c5d1f3cbda828648c28af4fb7d (diff) |
Merge remote-tracking branch 'origin/5.9' into 5.10
Change-Id: I896b0cf54f317c4336cc3d3db319a0b89e421728
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 45 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.h | 3 |
3 files changed, 35 insertions, 14 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 34a3d7ef7e..7fd6ab5551 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1467,6 +1467,9 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority) return; } + if (event->type() == QEvent::DeferredDelete) + receiver->d_ptr->deleteLaterCalled = true; + if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) { // remember the current running eventloop for DeferredDelete // events posted in the receiver's thread. @@ -1526,22 +1529,34 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven return true; } } - } else -#endif - if ((event->type() == QEvent::DeferredDelete - || event->type() == QEvent::Quit) - && receiver->d_func()->postedEvents > 0) { - for (int i = 0; i < postedEvents->size(); ++i) { - const QPostEvent &cur = postedEvents->at(i); - if (cur.receiver != receiver + return false; + } +#endif + + if (event->type() == QEvent::DeferredDelete) { + if (receiver->d_ptr->deleteLaterCalled) { + // there was a previous DeferredDelete event, so we can drop the new one + delete event; + return true; + } + // deleteLaterCalled is set to true in postedEvents when queueing the very first + // deferred deletion event. + return false; + } + + if (event->type() == QEvent::Quit && receiver->d_func()->postedEvents > 0) { + for (int i = 0; i < postedEvents->size(); ++i) { + const QPostEvent &cur = postedEvents->at(i); + if (cur.receiver != receiver || cur.event == 0 || cur.event->type() != event->type()) - continue; - // found an event for this receiver - delete event; - return true; - } + continue; + // found an event for this receiver + delete event; + return true; } + } + return false; } @@ -2881,6 +2896,10 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc If QCoreApplication is deleted and another QCoreApplication is created, the startup function will be invoked again. + + \note This macro is not suitable for use in library code that is then + statically linked into an application since the function may not be called + at all due to being eliminated by the linker. */ /*! diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index bc1af5d66f..baed659590 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -230,6 +230,7 @@ QObjectPrivate::QObjectPrivate(int version) connectedSignals[0] = connectedSignals[1] = 0; metaObject = 0; isWindow = false; + deleteLaterCalled = false; } QObjectPrivate::~QObjectPrivate() diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index 2e66daa914..7299a2b48d 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -106,7 +106,8 @@ public: uint sendChildEvents : 1; uint receiveChildEvents : 1; uint isWindow : 1; //for QWindow - uint unused : 25; + uint deleteLaterCalled : 1; + uint unused : 24; int postedEvents; QDynamicMetaObjectData *metaObject; QMetaObject *dynamicMetaObject() const; |