diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-01-14 17:07:38 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-01-23 07:43:31 +0000 |
commit | feb9ace3de30170f785217fdb7c454e92ca6d525 (patch) | |
tree | 9ab5b0190944fffdb0f9eba04aa6b4200c7d6135 /src/qml/qml/qqmlnotifier.cpp | |
parent | 8380e4c4a4f3f49a74a8bc0ff330e1c9e14dbafc (diff) |
QQmlNotifier: Always keep the isNotifying flag when updating senderPtr
When the sender gets deleted we still want to retain the flag that tells
us that the notifier is currently active. Otherwise we can miss the
error message about synchronously deleting objects while signal handlers
are in progress.
Task-number: QTBUG-73013
Change-Id: I8abba9b492327c15963d1875841c6822f345a89e
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlnotifier.cpp')
-rw-r--r-- | src/qml/qml/qqmlnotifier.cpp | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/qml/qml/qqmlnotifier.cpp b/src/qml/qml/qqmlnotifier.cpp index ac247ae0ad..0706b8c0cf 100644 --- a/src/qml/qml/qqmlnotifier.cpp +++ b/src/qml/qml/qqmlnotifier.cpp @@ -90,24 +90,20 @@ void QQmlNotifier::emitNotify(QQmlNotifierEndpoint *endpoint, void **a) NotifyListTraversalData &data = stack[i]; if (!data.endpoint->isNotifying()) { - data.originalSenderPtr = data.endpoint->senderPtr; + data.endpoint->startNotifying(&data.originalSenderPtr); data.disconnectWatch = &data.originalSenderPtr; - data.endpoint->senderPtr = qintptr(data.disconnectWatch) | 0x1; } else { data.disconnectWatch = (qintptr *)(data.endpoint->senderPtr & ~0x1); } } while (--i >= 0) { - const NotifyListTraversalData &data = stack.at(i); + NotifyListTraversalData &data = stack[i]; if (*data.disconnectWatch) { - Q_ASSERT(QQmlNotifier_callbacks[data.endpoint->callback]); QQmlNotifier_callbacks[data.endpoint->callback](data.endpoint, a); - if (data.disconnectWatch == &data.originalSenderPtr && data.originalSenderPtr) { - // End of notifying, restore values - data.endpoint->senderPtr = data.originalSenderPtr; + data.endpoint->stopNotifying(&data.originalSenderPtr); } } } @@ -137,7 +133,7 @@ void QQmlNotifierEndpoint::connect(QObject *source, int sourceSignal, QQmlEngine qPrintable(engineName)); } - senderPtr = qintptr(source); + setSender(qintptr(source)); this->sourceSignal = sourceSignal; QQmlPropertyPrivate::flushSignal(source, sourceSignal); QQmlData *ddata = QQmlData::get(source, true); |