diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/statemachine/qstatemachine.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index 59b6b55494..ec4f3dea4c 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -1703,8 +1703,10 @@ void QStateMachinePrivate::unregisterTransition(QAbstractTransition *transition) void QStateMachinePrivate::maybeRegisterSignalTransition(QSignalTransition *transition) { Q_Q(QStateMachine); - if ((state == Running) && configuration.contains(transition->sourceState())) + if (((state == Running) && configuration.contains(transition->sourceState())) + || (transition->senderObject() && (transition->senderObject()->thread() != q->thread()))) { registerSignalTransition(transition); + } } void QStateMachinePrivate::registerSignalTransition(QSignalTransition *transition) @@ -1766,11 +1768,15 @@ void QStateMachinePrivate::registerSignalTransition(QSignalTransition *transitio void QStateMachinePrivate::unregisterSignalTransition(QSignalTransition *transition) { + Q_Q(QStateMachine); int signalIndex = QSignalTransitionPrivate::get(transition)->signalIndex; if (signalIndex == -1) return; // not registered - QSignalTransitionPrivate::get(transition)->signalIndex = -1; const QObject *sender = QSignalTransitionPrivate::get(transition)->sender; + // Don't unregister if the sender is on another thread + if (!sender || (sender->thread() != q->thread())) + return; + QSignalTransitionPrivate::get(transition)->signalIndex = -1; QVector<int> &connectedSignalIndexes = connections[sender]; Q_ASSERT(connectedSignalIndexes.size() > signalIndex); Q_ASSERT(connectedSignalIndexes.at(signalIndex) != 0); |