Add an assertion to deleteLater() before it modifies QEvent::d
The deferred deletion functionality stores the event loop level nesting count in the QEvent d pointer. In Qt 4, this d pointer was not usable because we forgot to add a proper copy constructor and assignment operator to it, so the deleteLater() process stored the count here safely. Since Qt 5 now has non-implicit copy methods, the d pointer could be used in the future. If QEvent uses it, this assertion will trigger. Note that it doesn't apply to classes derived from QEvent, though. Change-Id: I8600c8e9379921e32aca166bc0a6c0b4c4ed799f Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>bb10
parent
ff55d64f67
commit
275945f144
|
|
@ -1074,6 +1074,12 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
|
|||
if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) {
|
||||
// remember the current running eventloop for DeferredDelete
|
||||
// events posted in the receiver's thread
|
||||
|
||||
// check that QEvent's d pointer is unused before we store the loop level
|
||||
// if further updates to QEvent have made the use of the d pointer necessary,
|
||||
// then update this code to store the loop level somewhere else
|
||||
Q_ASSERT_X(event->d == 0, "QCoreApplication::postEvent",
|
||||
"Internal error: this code relies on QEvent::d being null");
|
||||
event->d = reinterpret_cast<QEventPrivate *>(quintptr(data->loopLevel));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue