summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-20 22:34:43 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-20 22:36:19 +0100
commit65a97fccc67ae7f3df1900e1419955f939a49b9f (patch)
treea8fd0e119b585123e77e3b2574f2d82a5474eb28 /src/corelib/kernel
parent5e8bc07cb2ded1f5f74435411de666f419869514 (diff)
parent1303327a713d8f88fd9782e4f887b646d4210f68 (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts: tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp Change-Id: If089d5010d15c33b3c1f13912d4386207456c1a9
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp45
-rw-r--r--src/corelib/kernel/qmetaobject.cpp6
-rw-r--r--src/corelib/kernel/qobject.cpp1
-rw-r--r--src/corelib/kernel/qobject.h3
4 files changed, 41 insertions, 14 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 7c39910212..e93a14c116 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -1480,6 +1480,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.
@@ -1539,22 +1542,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;
}
@@ -2901,6 +2916,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/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 6df3354679..27138dd075 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1491,6 +1491,12 @@ bool QMetaObject::invokeMethod(QObject *obj,
bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret)
{
+ struct Holder {
+ QtPrivate::QSlotObjectBase *obj;
+ ~Holder() { obj->destroyIfLastRef(); }
+ } holder = { slot };
+ Q_UNUSED(holder);
+
if (! object)
return false;
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index e2459e4283..dc43a95675 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 867685a7dc..9f38a6ef87 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;